Loading src/service/service/service_handlers/l3slice_ietfslice/L3SliceIETFSliceServiceHandler.py +99 −42 Original line number Diff line number Diff line Loading @@ -77,6 +77,77 @@ METRICS_POOL = MetricsPool( RAISE_IF_DIFFERS = True def get_removed_items( candidate_ietf_slice_dict: dict, running_ietf_slice_dict: dict ) -> dict: removed_items = { "sdp": {"sdp_idx": None, "value": {}}, "connection_group": {"connection_group_idx": None, "value": {}}, "match_criterion": { "sdp_idx": None, "match_criterion_idx": None, "value": {}, }, } running_slice_services = running_ietf_slice_dict["network-slice-services"][ "slice-service" ][0] running_slice_sdps = [sdp["id"] for sdp in running_slice_services["sdps"]["sdp"]] candidate_slice_services = candidate_ietf_slice_dict["network-slice-services"][ "slice-service" ][0] candidiate_slice_sdps = [ sdp["id"] for sdp in candidate_slice_services["sdps"]["sdp"] ] removed_sdps = set(running_slice_sdps) - set(candidiate_slice_sdps) if len(removed_sdps) > 1: raise Exception("Multiple SDPs removed") removed_sdp_id = list(removed_sdps)[0] removed_items["sdp"]["sdp_idx"] = running_slice_sdps.index(removed_sdp_id) removed_items["sdp"]["value"] = next( sdp for sdp in running_slice_services["sdps"]["sdp"] if sdp["id"] == removed_sdp_id ) match_criteria = removed_items["sdp"]["value"]["service-match-criteria"][ "match-criterion" ] if len(match_criteria) > 1: raise Exception("Multiple match criteria found") match_criterion = match_criteria[0] connection_grp_id = match_criterion["target-connection-group-id"] connection_groups = running_slice_services["connection-groups"]["connection-group"] connection_group = next( (idx, cg) for idx, cg in enumerate(connection_groups) if cg["id"] == connection_grp_id ) removed_items["connection_group"]["connection_group_idx"] = connection_group[0] removed_items["connection_group"]["value"] = connection_group[1] for sdp in running_slice_services["sdps"]["sdp"]: if sdp["id"] == removed_sdp_id: continue for mc in sdp["service-match-criteria"]["match-criterion"]: if mc["target-connection-group-id"] == connection_grp_id: removed_items["match_criterion"]["sdp_idx"] = running_slice_sdps.index( sdp["id"] ) removed_items["match_criterion"]["match_criterion_idx"] = sdp[ "service-match-criteria" ]["match-criterion"].index(mc) removed_items["match_criterion"]["value"] = mc break if ( removed_items["match_criterion"]["sdp_idx"] is None or removed_items["sdp"]["sdp_idx"] is None or removed_items["connection_group"]["connection_group_idx"] is None ): raise Exception("sdp, connection group or match criterion not found") return removed_items def extract_source_destination_device_endpoint_info( device_ep_pairs: list, connection_group: Dict ) -> Tuple[DeviceEpInfo, DeviceEpInfo]: Loading Loading @@ -224,8 +295,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] slice_service = slice_services[0] sdps = slice_service["sdps"]["sdp"] candidate_slice_service = slice_services[0] full_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] sdps = candidate_slice_service["sdps"]["sdp"] operation_type = "create" sdp_ids = [sdp["node-id"] for sdp in sdps] for sdp in sdps: Loading Loading @@ -316,8 +390,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] slice_service = slice_services[0] sdps = slice_service["sdps"]["sdp"] candidate_slice_service = slice_services[0] full_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] sdps = candidate_slice_service["sdps"]["sdp"] operation_type = "update" added_items = { "sdp": {"sdp_idx": None, "value": {}}, Loading Loading @@ -457,44 +534,19 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = running_resource_value_dict["network-slice-services"][ "slice-service" ] candidate_slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] candidate_slice_service = candidate_slice_services[0] slice_service = slice_services[0] full_connection_groups = slice_service["connection-groups"][ "connection-group" ] sdps = slice_service["sdps"]["sdp"] operation_type = "update" removed_items = { "sdp": {"sdp_idx": None, "value": {}}, "connection_group": {"connection_group_idx": None, "value": {}}, "match_criterion": { "sdp_idx": None, "match_criterion_idx": None, "value": {}, }, } for added_key, added_value in running_candidate_diff[ "iterable_item_removed" ].items(): sdp_match = SDP_DIFF_RE.match(added_key) connection_group_match = CONNECTION_GROUP_DIFF_RE.match(added_key) match_criterion_match = MATCH_CRITERION_DIFF_RE.match(added_key) if sdp_match: removed_items["sdp"] = { "sdp_idx": int(sdp_match.groups()[0]), "value": added_value, } elif connection_group_match: removed_items["connection_group"] = { "connection_group_idx": int( connection_group_match.groups()[0] ), "value": added_value, } elif match_criterion_match: removed_items["match_criterion"] = { "sdp_idx": int(match_criterion_match.groups()[0]), "match_criterion_idx": int( match_criterion_match.groups()[1] ), "value": added_value, } removed_items = get_removed_items( candidate_resource_value_dict, running_resource_value_dict ) new_sdp = sdps[removed_items["sdp"]["sdp_idx"]] src_sdp_name = new_sdp["node-id"] dst_sdp_idx = sdps[removed_items["match_criterion"]["sdp_idx"]]["id"] Loading Loading @@ -594,8 +646,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): break else: raise Exception("sdp between the domains not found") connection_groups = slice_service["connection-groups"]["connection-group"] for cg in connection_groups: candidate_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] LOGGER.debug(f"connection_groups: {candidate_connection_groups}") for cg in candidate_connection_groups: for cc in cg["connectivity-construct"]: for metric_bound in cc["service-slo-sle-policy"]["slo-policy"][ "metric-bound" Loading Loading @@ -633,7 +688,9 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): ): operation_type = "delete" target_connection_group = next( cg for cg in connection_groups if cg["id"] == target_connection_group_id cg for cg in full_connection_groups if cg["id"] == target_connection_group_id ) source_device_ep_info, destination_device_ep_info = ( extract_source_destination_device_endpoint_info( Loading Loading
src/service/service/service_handlers/l3slice_ietfslice/L3SliceIETFSliceServiceHandler.py +99 −42 Original line number Diff line number Diff line Loading @@ -77,6 +77,77 @@ METRICS_POOL = MetricsPool( RAISE_IF_DIFFERS = True def get_removed_items( candidate_ietf_slice_dict: dict, running_ietf_slice_dict: dict ) -> dict: removed_items = { "sdp": {"sdp_idx": None, "value": {}}, "connection_group": {"connection_group_idx": None, "value": {}}, "match_criterion": { "sdp_idx": None, "match_criterion_idx": None, "value": {}, }, } running_slice_services = running_ietf_slice_dict["network-slice-services"][ "slice-service" ][0] running_slice_sdps = [sdp["id"] for sdp in running_slice_services["sdps"]["sdp"]] candidate_slice_services = candidate_ietf_slice_dict["network-slice-services"][ "slice-service" ][0] candidiate_slice_sdps = [ sdp["id"] for sdp in candidate_slice_services["sdps"]["sdp"] ] removed_sdps = set(running_slice_sdps) - set(candidiate_slice_sdps) if len(removed_sdps) > 1: raise Exception("Multiple SDPs removed") removed_sdp_id = list(removed_sdps)[0] removed_items["sdp"]["sdp_idx"] = running_slice_sdps.index(removed_sdp_id) removed_items["sdp"]["value"] = next( sdp for sdp in running_slice_services["sdps"]["sdp"] if sdp["id"] == removed_sdp_id ) match_criteria = removed_items["sdp"]["value"]["service-match-criteria"][ "match-criterion" ] if len(match_criteria) > 1: raise Exception("Multiple match criteria found") match_criterion = match_criteria[0] connection_grp_id = match_criterion["target-connection-group-id"] connection_groups = running_slice_services["connection-groups"]["connection-group"] connection_group = next( (idx, cg) for idx, cg in enumerate(connection_groups) if cg["id"] == connection_grp_id ) removed_items["connection_group"]["connection_group_idx"] = connection_group[0] removed_items["connection_group"]["value"] = connection_group[1] for sdp in running_slice_services["sdps"]["sdp"]: if sdp["id"] == removed_sdp_id: continue for mc in sdp["service-match-criteria"]["match-criterion"]: if mc["target-connection-group-id"] == connection_grp_id: removed_items["match_criterion"]["sdp_idx"] = running_slice_sdps.index( sdp["id"] ) removed_items["match_criterion"]["match_criterion_idx"] = sdp[ "service-match-criteria" ]["match-criterion"].index(mc) removed_items["match_criterion"]["value"] = mc break if ( removed_items["match_criterion"]["sdp_idx"] is None or removed_items["sdp"]["sdp_idx"] is None or removed_items["connection_group"]["connection_group_idx"] is None ): raise Exception("sdp, connection group or match criterion not found") return removed_items def extract_source_destination_device_endpoint_info( device_ep_pairs: list, connection_group: Dict ) -> Tuple[DeviceEpInfo, DeviceEpInfo]: Loading Loading @@ -224,8 +295,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] slice_service = slice_services[0] sdps = slice_service["sdps"]["sdp"] candidate_slice_service = slice_services[0] full_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] sdps = candidate_slice_service["sdps"]["sdp"] operation_type = "create" sdp_ids = [sdp["node-id"] for sdp in sdps] for sdp in sdps: Loading Loading @@ -316,8 +390,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] slice_service = slice_services[0] sdps = slice_service["sdps"]["sdp"] candidate_slice_service = slice_services[0] full_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] sdps = candidate_slice_service["sdps"]["sdp"] operation_type = "update" added_items = { "sdp": {"sdp_idx": None, "value": {}}, Loading Loading @@ -457,44 +534,19 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): slice_services = running_resource_value_dict["network-slice-services"][ "slice-service" ] candidate_slice_services = candidate_resource_value_dict[ "network-slice-services" ]["slice-service"] candidate_slice_service = candidate_slice_services[0] slice_service = slice_services[0] full_connection_groups = slice_service["connection-groups"][ "connection-group" ] sdps = slice_service["sdps"]["sdp"] operation_type = "update" removed_items = { "sdp": {"sdp_idx": None, "value": {}}, "connection_group": {"connection_group_idx": None, "value": {}}, "match_criterion": { "sdp_idx": None, "match_criterion_idx": None, "value": {}, }, } for added_key, added_value in running_candidate_diff[ "iterable_item_removed" ].items(): sdp_match = SDP_DIFF_RE.match(added_key) connection_group_match = CONNECTION_GROUP_DIFF_RE.match(added_key) match_criterion_match = MATCH_CRITERION_DIFF_RE.match(added_key) if sdp_match: removed_items["sdp"] = { "sdp_idx": int(sdp_match.groups()[0]), "value": added_value, } elif connection_group_match: removed_items["connection_group"] = { "connection_group_idx": int( connection_group_match.groups()[0] ), "value": added_value, } elif match_criterion_match: removed_items["match_criterion"] = { "sdp_idx": int(match_criterion_match.groups()[0]), "match_criterion_idx": int( match_criterion_match.groups()[1] ), "value": added_value, } removed_items = get_removed_items( candidate_resource_value_dict, running_resource_value_dict ) new_sdp = sdps[removed_items["sdp"]["sdp_idx"]] src_sdp_name = new_sdp["node-id"] dst_sdp_idx = sdps[removed_items["match_criterion"]["sdp_idx"]]["id"] Loading Loading @@ -594,8 +646,11 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): break else: raise Exception("sdp between the domains not found") connection_groups = slice_service["connection-groups"]["connection-group"] for cg in connection_groups: candidate_connection_groups = candidate_slice_service["connection-groups"][ "connection-group" ] LOGGER.debug(f"connection_groups: {candidate_connection_groups}") for cg in candidate_connection_groups: for cc in cg["connectivity-construct"]: for metric_bound in cc["service-slo-sle-policy"]["slo-policy"][ "metric-bound" Loading Loading @@ -633,7 +688,9 @@ class L3NMSliceIETFSliceServiceHandler(_ServiceHandler): ): operation_type = "delete" target_connection_group = next( cg for cg in connection_groups if cg["id"] == target_connection_group_id cg for cg in full_connection_groups if cg["id"] == target_connection_group_id ) source_device_ep_info, destination_device_ep_info = ( extract_source_destination_device_endpoint_info( Loading