diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py index c74e46f822a3dbe5e7b60c618c905d1bfa60a91b..208fd7a0f00d654e9be521743604d873a3daaf4b 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py @@ -36,6 +36,27 @@ class NSS_Service_Connection_Group(Resource): # TODO Return list of current network-slice-services return response + # @HTTP_AUTH.login_required + def update(self, slice_id: str, connection_group_id: str): + if not request.is_json: + raise UnsupportedMediaType("JSON payload is required") + request_data: Dict = request.json + + context_client = ContextClient() + slice_request = IETFSliceHandler.update_connection_group( + slice_id, request_data, context_client + ) + slice_client = SliceClient() + slice_client.UpdateSlice(slice_request) + slice_request = IETFSliceHandler.copy_candidate_ietf_slice_data_to_running( + slice_id, context_client + ) + _ = context_client.SetSlice(slice_request) + + response = jsonify({}) + response.status_code = HTTP_CREATED + return response + # @HTTP_AUTH.login_required def delete(self, slice_id: str, connection_group_id: str): context_client = ContextClient() diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py index afbbff3435dc73b6786f8ac32588d8b2a01b34d2..b6801611d1c47b91b804cde4d94fbf71fa80dde5 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py @@ -293,6 +293,42 @@ class IETFSliceHandler: validate_ietf_slice_data(ietf_data) return slice + @staticmethod + def update_connection_group( + self, + slice_name: str, + updated_connection_group: dict, + context_client: ContextClient, + ): + slice_request = get_slice_by_defualt_name( + context_client, slice_name, rw_copy=False + ) + slice_config = slice_request.slice_config + cr = get_custom_config_rule(slice_config, CANDIDATE_RESOURCE_KEY) + candidate_ietf_data = json.loads(cr.custom.resource_value) + slice_services = candidate_ietf_data["network-slice-services"]["slice-service"] + slice_service = slice_services[0] + slice_connection_groups = slice_service["connection-groups"]["connection-group"] + connection_group_id = updated_connection_group["connection-group"][0]["id"] + cg_idx = list( + ( + slice_cg["id"] == connection_group_id + for slice_cg in slice_connection_groups + ) + ).index(True) + slice_connection_groups[cg_idx] = updated_connection_group["connection-group"][ + 0 + ] + fields = { + name: (value, RAISE_IF_DIFFERS) + for name, value in candidate_ietf_data.items() + } + update_config_rule_custom( + slice_request.slice_config.config_rules, CANDIDATE_RESOURCE_KEY, fields + ) + slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED + return slice_request + @staticmethod def delete_connection_group( slice_uuid: str, connection_group_id: str, context_client: ContextClient @@ -321,47 +357,7 @@ class IETFSliceHandler: update_config_rule_custom( slice_request.slice_config.config_rules, CANDIDATE_RESOURCE_KEY, fields ) - # src_sdp_id = removed_connection_group["connectivity-construct"][0][ - # "p2p-sender-sdp" - # ] - # dst_sdp_id = removed_connection_group["connectivity-construct"][0][ - # "p2p-receiver-sdp" - # ] - # cr = get_custom_config_rule(slice_config, RUNNING_RESOURCE_KEY) - # running_ietf_data = json.loads(cr.custom.resource_value) - # slice_services = running_ietf_data["network-slice-services"]["slice-service"] - # slice_service = slice_services[0] - # sdps = slice_service["sdps"]["sdp"] slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED - # list_endpoints = [] - # for sdp in sdps: - # if sdp["id"] == src_sdp_id: - # attachment_circuits = sdp["attachment-circuits"]["attachment-circuit"] - # if len(attachment_circuits) != 1: - # raise Exception("All SDPs should have 1 attachment-circuit") - # endpoint = EndPointId() - # endpoint.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME - # endpoint.device_id.device_uuid.uuid = sdp["node-id"] - # endpoint.endpoint_uuid.uuid = attachment_circuits[0]["ac-tp-id"] - # list_endpoints.append(endpoint) - # break - # else: - # raise Exception("Second SDP not found") - # for sdp in sdps: - # if sdp["id"] == dst_sdp_id: - # attachment_circuits = sdp["attachment-circuits"]["attachment-circuit"] - # if len(attachment_circuits) != 1: - # raise Exception("All SDPs should have 1 attachment-circuit") - # endpoint = EndPointId() - # endpoint.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME - # endpoint.device_id.device_uuid.uuid = sdp["node-id"] - # endpoint.endpoint_uuid.uuid = attachment_circuits[0]["ac-tp-id"] - # list_endpoints.append(endpoint) - # break - # else: - # raise Exception("SDP not found") - # del slice_request.slice_endpoint_ids[:] - # slice_request.slice_endpoint_ids.extend(list_endpoints) return slice_request @staticmethod