Skip to content
Snippets Groups Projects
Commit 7ea24d44 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Slice component:

- minor code formatting
- implemented logic to identify service type
- implemented logic to require at least 2 endpoints to process a slice request
parent 4ceab714
No related branches found
No related tags found
2 merge requests!54Release 2.0.0,!24Integrate NFV-SDN'22 demo
......@@ -50,9 +50,19 @@ class SliceServiceServicerImpl(SliceServiceServicer):
slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED # pylint: disable=no-member
context_client.SetSlice(slice_request)
_slice = context_client.GetSlice(request.slice_id)
slice_request = Slice()
slice_request.CopyFrom(_slice)
if len(request.slice_endpoint_ids) < 2:
# unable to identify the kind of slice; just update endpoints, constraints and config rules
# update the slice in database, and return
# pylint: disable=no-member
copy_endpoint_ids(request.slice_endpoint_ids, slice_request.slice_endpoint_ids)
copy_constraints(request.slice_constraints, slice_request.slice_constraints)
copy_config_rules(request.slice_config.config_rules, slice_request.slice_config.config_rules)
return context_client.SetSlice(slice_request)
#LOGGER.info('json_current_slice = {:s}'.format(str(json_current_slice)))
#json_updated_slice = grpc_message_to_json(request)
#LOGGER.info('json_updated_slice = {:s}'.format(str(json_updated_slice)))
......@@ -62,73 +72,84 @@ class SliceServiceServicerImpl(SliceServiceServicer):
if is_multi_domain(context_client, request.slice_endpoint_ids):
interdomain_client = InterdomainClient()
slice_id = interdomain_client.RequestSlice(request)
else:
service_id = ServiceId()
slice_ = context_client.GetSlice(slice_id)
slice_active = Slice()
slice_active.CopyFrom(slice_)
slice_active.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_ACTIVE # pylint: disable=no-member
context_client.SetSlice(slice_active)
return slice_id
# Local domain slice
service_id = ServiceId()
# pylint: disable=no-member
context_uuid = service_id.context_id.context_uuid.uuid = request.slice_id.context_id.context_uuid.uuid
slice_uuid = service_uuid = service_id.service_uuid.uuid = request.slice_id.slice_uuid.uuid
service_client = ServiceClient()
try:
_service = context_client.GetService(service_id)
except: # pylint: disable=bare-except
# pylint: disable=no-member
context_uuid = service_id.context_id.context_uuid.uuid = request.slice_id.context_id.context_uuid.uuid
slice_uuid = service_uuid = service_id.service_uuid.uuid = request.slice_id.slice_uuid.uuid
service_client = ServiceClient()
try:
_service = context_client.GetService(service_id)
except: # pylint: disable=bare-except
# pylint: disable=no-member
service_request = Service()
service_request.service_id.CopyFrom(service_id)
service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED
service_reply = service_client.CreateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member
# pylint: disable=raise-missing-from
raise Exception('Service creation failed. Wrong Service Id was returned')
_service = context_client.GetService(service_id)
service_request = Service()
service_request.CopyFrom(_service)
# pylint: disable=no-member
copy_endpoint_ids(request.slice_endpoint_ids, service_request.service_endpoint_ids)
copy_constraints(request.slice_constraints, service_request.service_constraints)
copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules)
service_request.service_id.CopyFrom(service_id)
service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
for config_rule in request.slice_config.config_rules:
LOGGER.info('config_rule: {:s}'.format(grpc_message_to_json_string(config_rule)))
config_rule_kind = config_rule.WhichOneof('config_rule')
LOGGER.info('config_rule_kind: {:s}'.format(str(config_rule_kind)))
if config_rule_kind != 'custom': continue
custom = config_rule.custom
resource_key = custom.resource_key
LOGGER.info('resource_key: {:s}'.format(str(resource_key)))
# TODO: parse resource key with regular expression, e.g.:
# m = re.match('\/device\[[^\]]\]\/endpoint\[[^\]]\]\/settings', s)
if not resource_key.startswith('/device'): continue
if not resource_key.endswith('/settings'): continue
resource_value = json.loads(custom.resource_value)
LOGGER.info('resource_value: {:s}'.format(str(resource_value)))
if service_request.service_type == ServiceTypeEnum.SERVICETYPE_UNKNOWN:
if (resource_value.get('address_ip') is not None and \
resource_value.get('address_prefix') is not None):
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
LOGGER.info('is L3')
else:
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
LOGGER.info('is L2')
break
service_reply = service_client.UpdateService(service_request)
service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED
service_reply = service_client.CreateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member
raise Exception('Service update failed. Wrong Service Id was returned')
copy_endpoint_ids(request.slice_endpoint_ids, slice_request.slice_endpoint_ids)
copy_constraints(request.slice_constraints, slice_request.slice_constraints)
copy_config_rules(request.slice_config.config_rules, slice_request.slice_config.config_rules)
update_service_ids(slice_request.slice_service_ids, context_uuid, service_uuid)
context_client.SetSlice(slice_request)
slice_id = slice_request.slice_id
# pylint: disable=raise-missing-from
raise Exception('Service creation failed. Wrong Service Id was returned')
_service = context_client.GetService(service_id)
service_request = Service()
service_request.CopyFrom(_service)
# pylint: disable=no-member
copy_endpoint_ids(request.slice_endpoint_ids, service_request.service_endpoint_ids)
copy_constraints(request.slice_constraints, service_request.service_constraints)
copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules)
service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
for config_rule in request.slice_config.config_rules:
LOGGER.info('config_rule: {:s}'.format(grpc_message_to_json_string(config_rule)))
config_rule_kind = config_rule.WhichOneof('config_rule')
LOGGER.info('config_rule_kind: {:s}'.format(str(config_rule_kind)))
if config_rule_kind != 'custom': continue
custom = config_rule.custom
resource_key = custom.resource_key
LOGGER.info('resource_key: {:s}'.format(str(resource_key)))
# TODO: parse resource key with regular expression, e.g.:
# m = re.match('\/device\[[^\]]\]\/endpoint\[[^\]]\]\/settings', s)
if not resource_key.startswith('/device'): continue
if not resource_key.endswith('/settings'): continue
resource_value = json.loads(custom.resource_value)
LOGGER.info('resource_value: {:s}'.format(str(resource_value)))
if service_request.service_type == ServiceTypeEnum.SERVICETYPE_UNKNOWN:
if (resource_value.get('address_ip') is not None and \
resource_value.get('address_prefix') is not None):
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
LOGGER.info('is L3')
else:
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
LOGGER.info('is L2')
break
if service_request.service_type == ServiceTypeEnum.SERVICETYPE_UNKNOWN:
service_request.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
LOGGER.info('assume L2')
service_reply = service_client.UpdateService(service_request)
if service_reply != service_request.service_id: # pylint: disable=no-member
raise Exception('Service update failed. Wrong Service Id was returned')
copy_endpoint_ids(request.slice_endpoint_ids, slice_request.slice_endpoint_ids)
copy_constraints(request.slice_constraints, slice_request.slice_constraints)
copy_config_rules(request.slice_config.config_rules, slice_request.slice_config.config_rules)
update_service_ids(slice_request.slice_service_ids, context_uuid, service_uuid)
context_client.SetSlice(slice_request)
slice_id = slice_request.slice_id
slice_ = context_client.GetSlice(slice_id)
slice_active = Slice()
......
......@@ -15,7 +15,9 @@
import logging, signal, sys, threading
from prometheus_client import start_http_server
from common.Constants import ServiceNameEnum
from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables
from common.Settings import (
ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port,
wait_for_environment_variables)
from .SliceService import SliceService
terminate = threading.Event()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment