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

Merge branch...

Merge branch 'feat/237-elaborate-ietf-slice-nbi-to-support-adding-deleting-new-sdp-connection-group-and-match' into camara-integration
parents eb403ff2 fc4c353c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ from .rest_server.nbi_plugins.ietf_network_slice import register_ietf_nss
from .rest_server.nbi_plugins.ietf_acl import register_ietf_acl
from .rest_server.nbi_plugins.qkd_app import register_qkd_app
from .rest_server.nbi_plugins.tfs_api import register_tfs_api
from .rest_server.nbi_plugins import register_restconf
from .context_subscription import register_context_subscription

terminate = threading.Event()
@@ -79,6 +80,7 @@ def main():
    register_ietf_acl(rest_server)
    register_qkd_app(rest_server)
    register_tfs_api(rest_server)
    register_restconf(rest_server)
    rest_server.start()

    register_context_subscription()
+1 −1
Original line number Diff line number Diff line
@@ -34,5 +34,5 @@ def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):
    rest_server.add_resource(resource, *urls, **kwargs)


def register_ietf_nss(rest_server: RestServer):
def register_restconf(rest_server: RestServer):
    _add_resource(rest_server, BaseServer, "")
+5 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ from werkzeug.exceptions import UnsupportedMediaType
from context.client.ContextClient import ContextClient
from slice.client.SliceClient import SliceClient

from ..tools.HttpStatusCodes import HTTP_CREATED
from ..tools.HttpStatusCodes import HTTP_CREATED, HTTP_OK
from .ietf_slice_handler import IETFSliceHandler

LOGGER = logging.getLogger(__name__)
@@ -31,8 +31,10 @@ LOGGER = logging.getLogger(__name__)
class NSS_Services(Resource):
    # @HTTP_AUTH.login_required
    def get(self):
        response = jsonify({"message": "All went well!"})
        # TODO Return list of current network-slice-services
        context_client = ContextClient()
        ietf_slices = IETFSliceHandler.get_all_ietf_slices(context_client)
        response = jsonify(ietf_slices)
        response.status_code = HTTP_OK
        return response

    # @HTTP_AUTH.login_required
+9 −9
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ from .NSS_Services_Connection_Groups import NSS_Service_Connection_Groups
from .NSS_Services_SDP import NSS_Service_SDP
from .NSS_Services_SDPs import NSS_Service_SDPs

URL_PREFIX = "/restconf/data/ietf-network-slice-service:ietf-nss"
URL_PREFIX = "/restconf/data/ietf-network-slice-service"


def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):
@@ -37,39 +37,39 @@ def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):


def register_ietf_nss(rest_server: RestServer):
    _add_resource(rest_server, NSS_Services, "/network-slice-services")
    _add_resource(rest_server, NSS_Services, ":network-slice-services")
    _add_resource(
        rest_server,
        NSS_Service,
        "/network-slice-services/slice-service=<string:slice_id>",
        ":network-slice-services/slice-service=<string:slice_id>",
    )
    _add_resource(
        rest_server,
        NSS_Service_SDPs,
        "/network-slice-services/slice-service=<string:slice_id>/sdps",
        ":network-slice-services/slice-service=<string:slice_id>/sdps",
    )
    _add_resource(
        rest_server,
        NSS_Service_SDP,
        "/network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>",
        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>",
    )
    _add_resource(
        rest_server,
        NSS_Service_Connection_Groups,
        "/network-slice-services/slice-service=<string:slice_id>/connection-groups",
        ":network-slice-services/slice-service=<string:slice_id>/connection-groups",
    )
    _add_resource(
        rest_server,
        NSS_Service_Connection_Group,
        "/network-slice-services/slice-service=<string:slice_id>/connection-groups/connection-group=<string:connection_group_id>",
        ":network-slice-services/slice-service=<string:slice_id>/connection-groups/connection-group=<string:connection_group_id>",
    )
    _add_resource(
        rest_server,
        NSS_Service_Match_Criteria,
        "/network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria",
        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria",
    )
    _add_resource(
        rest_server,
        NSS_Service_Match_Criterion,
        "/network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria/match-criterion=<string:match_criterion_id>",
        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria/match-criterion=<string:match_criterion_id>",
    )
+20 −6
Original line number Diff line number Diff line
import json
import logging
import uuid
from typing import Optional
from typing import Dict, List, Optional

from common.Constants import DEFAULT_CONTEXT_NAME
from common.proto.context_pb2 import (
@@ -16,7 +16,6 @@ from common.proto.context_pb2 import (
)
from common.tools.context_queries.Slice import get_slice_by_defualt_name
from common.tools.grpc.ConfigRules import update_config_rule_custom
from common.tools.grpc.Tools import grpc_message_to_json
from context.client import ContextClient

from .YangValidator import YangValidator
@@ -41,7 +40,7 @@ def get_custom_config_rule(
            return cr


def sort_endpoints(endpoinst_list: list, sdps: list, connection_group: dict) -> list:
def sort_endpoints(endpoinst_list: List, sdps: List, connection_group: Dict) -> List:
    src_sdp_id = connection_group["connectivity-construct"][0]["p2p-sender-sdp"]
    sdp_id_name_mapping = {sdp["id"]: sdp["node-id"] for sdp in sdps}
    if endpoinst_list[0].device_id.device_uuid.uuid == sdp_id_name_mapping[src_sdp_id]:
@@ -50,8 +49,8 @@ def sort_endpoints(endpoinst_list: list, sdps: list, connection_group: dict) ->


def replace_ont_endpoint_with_emu_dc(
    endpoint_list: list, context_client: ContextClient
) -> list:
    endpoint_list: List, context_client: ContextClient
) -> List:
    link_list = context_client.ListLinks(Empty())
    links = list(link_list.links)
    devices_list = context_client.ListDevices(Empty())
@@ -96,13 +95,28 @@ def replace_ont_endpoint_with_emu_dc(
    return endpoint_list


def validate_ietf_slice_data(request_data: dict) -> None:
def validate_ietf_slice_data(request_data: Dict) -> None:
    yang_validator = YangValidator("ietf-network-slice-service")
    _ = yang_validator.parse_to_dict(request_data)
    yang_validator.destroy()


class IETFSliceHandler:
    @staticmethod
    def get_all_ietf_slices(context_client: ContextClient) -> Dict:
        slices_list = context_client.ListSlices(Empty())
        slices = slices_list.slices
        ietf_slices = {"network-slice-services": {"slice-service": []}}
        for slice in slices:
            candidate_cr = get_custom_config_rule(
                slice.slice_config, CANDIDATE_RESOURCE_KEY
            )
            candidate_ietf_data = json.loads(candidate_cr.custom.resource_value)
            ietf_slices["network-slice-services"]["slice-service"].append(
                candidate_ietf_data["network-slice-services"]["slice-service"][0]
            )
        return ietf_slices

    @staticmethod
    def create_slice_service(
        request_data: dict, context_client: ContextClient
Loading