diff --git a/src/slice/service/SliceServiceServicerImpl.py b/src/slice/service/SliceServiceServicerImpl.py index f030e7c1116211a39b875070f728bf5d521979c4..ada7218588391766147a02f9713b540016522aa7 100644 --- a/src/slice/service/SliceServiceServicerImpl.py +++ b/src/slice/service/SliceServiceServicerImpl.py @@ -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() diff --git a/src/slice/service/__main__.py b/src/slice/service/__main__.py index a59c54b4b1b56865871d331409c1a7f60629aec6..b2f4536503ac176628c42cf0211315089697c50e 100644 --- a/src/slice/service/__main__.py +++ b/src/slice/service/__main__.py @@ -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()