Commit ad57480a authored by Shayan Hajipour's avatar Shayan Hajipour
Browse files

debug: connection group extraction bug resolved

parent 281f093e
Loading
Loading
Loading
Loading
+99 −42
Original line number Diff line number Diff line
@@ -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]:
@@ -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:
@@ -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": {}},
@@ -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"]
@@ -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"
@@ -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(