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

enhancement:

- /restconf/data endpoint added as a dummpy endpoint to TFS NBI
- connection group endpoint added to TFS NBI
- ietf_slice_handler enhanced to support TFS NBI
- slice json test files added
parent b465479a
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -12,3 +12,27 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from flask.json import jsonify
from flask_restful import Resource

from nbi.service.rest_server.RestServer import RestServer

from .tools.HttpStatusCodes import HTTP_CREATED

URL_PREFIX = "/restconf/data"


class BaseServer(Resource):
    def post(self):
        response = jsonify({})
        response.status_code = HTTP_CREATED
        return response


def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):
    urls = [(URL_PREFIX + url) for url in urls]
    rest_server.add_resource(resource, *urls, **kwargs)


def register_ietf_nss(rest_server: RestServer):
    _add_resource(rest_server, BaseServer, "")
+42 −20
Original line number Diff line number Diff line
@@ -13,47 +13,61 @@
# limitations under the License.

import logging

from flask.json import jsonify
from flask_restful import Resource

from common.proto.context_pb2 import SliceStatusEnum
from common.tools.context_queries.Slice import get_slice_by_uuid
from common.tools.grpc.Tools import grpc_message_to_json
from context.client.ContextClient import ContextClient
from slice.client.SliceClient import SliceClient

from ..tools.Authentication import HTTP_AUTH
from ..tools.HttpStatusCodes import HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR
from ..tools.HttpStatusCodes import (
    HTTP_GATEWAYTIMEOUT,
    HTTP_NOCONTENT,
    HTTP_OK,
    HTTP_SERVERERROR,
)

LOGGER = logging.getLogger(__name__)


class NSS_Service(Resource):
    # @HTTP_AUTH.login_required
    def get(self, slice_id: str):
        LOGGER.debug('GET Slice ID: {:s}'.format(str(slice_id)))
        LOGGER.debug("GET Slice ID: {:s}".format(str(slice_id)))
        try:
            context_client = ContextClient()

            target = get_slice_by_uuid(context_client, slice_id, rw_copy=True)
            if target is None:
                raise Exception('Slice({:s}) not found in database'.format(str(slice_id)))
                raise Exception(
                    "Slice({:s}) not found in database".format(str(slice_id))
                )

            if target.slice_id.slice_uuid.uuid != slice_id:  # pylint: disable=no-member
                raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
                raise Exception("Slice retrieval failed. Wrong Slice Id was returned")

            slice_ready_status = SliceStatusEnum.SLICESTATUS_ACTIVE
            slice_status = target.slice_status.slice_status  # pylint: disable=no-member
            response = jsonify(grpc_message_to_json(target))
            response.status_code = HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
            response.status_code = (
                HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
            )

        except Exception as e:  # pylint: disable=broad-except
            LOGGER.exception('Something went wrong Retrieving Slice({:s})'.format(str(slice_id)))
            response = jsonify({'error': str(e)})
            LOGGER.exception(
                "Something went wrong Retrieving Slice({:s})".format(str(slice_id))
            )
            response = jsonify({"error": str(e)})
            response.status_code = HTTP_SERVERERROR
        return response


    # @HTTP_AUTH.login_required
    def delete(self, slice_id: str):
        LOGGER.debug('DELETE Slice ID: {:s}'.format(str(slice_id)))
        LOGGER.debug("DELETE Slice ID: {:s}".format(str(slice_id)))
        try:
            context_client = ContextClient()
            target = get_slice_by_uuid(context_client, slice_id)
@@ -62,17 +76,25 @@ class NSS_Service(Resource):
            response.status_code = HTTP_OK

            if target is None:
                LOGGER.warning('Slice({:s}) not found in database. Nothing done.'.format(str(slice_id)))
                LOGGER.warning(
                    "Slice({:s}) not found in database. Nothing done.".format(
                        str(slice_id)
                    )
                )
                response.status_code = HTTP_NOCONTENT
            else:
                if target.slice_id.slice_uuid.uuid != slice_id:  # pylint: disable=no-member
                    raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
                if target.slice_id.slice_uuid.uuid != slice_id and target.name != slice_id:  # pylint: disable=no-member
                    raise Exception(
                        "Slice retrieval failed. Wrong Slice Id was returned"
                    )
                slice_client = SliceClient()
                slice_client.DeleteSlice(target.slice_id)
                LOGGER.debug(f"Slice({slice_id}) successfully deleted")

        except Exception as e:  # pylint: disable=broad-except
            LOGGER.exception('Something went wrong Deleting Slice({:s})'.format(str(slice_id)))
            response = jsonify({'error': str(e)})
            LOGGER.exception(
                "Something went wrong Deleting Slice({:s})".format(str(slice_id))
            )
            response = jsonify({"error": str(e)})
            response.status_code = HTTP_SERVERERROR
        return response
+4 −0
Original line number Diff line number Diff line
@@ -49,6 +49,10 @@ class NSS_Service_Match_Criteria(Resource):
        )
        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
+2 −6
Original line number Diff line number Diff line
@@ -12,15 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Dict

from flask import request
from flask.json import jsonify
from flask_restful import Resource
from werkzeug.exceptions import UnsupportedMediaType

from context.client.ContextClient import ContextClient
from slice.client.SliceClient import SliceClient

from ..tools.Authentication import HTTP_AUTH
from ..tools.HttpStatusCodes import (
@@ -44,8 +40,8 @@ class NSS_Service_Match_Criterion(Resource):
        slice_request = IETFSliceHandler.delete_match_criteria(
            slice_id, sdp_id, int(match_criterion_id), context_client
        )
        slice_client = SliceClient()
        slice_client.UpdateSlice(slice_request)
        context_client = ContextClient()
        _ = context_client.SetSlice(slice_request)

        response = jsonify({})
        response.status_code = HTTP_CREATED
+5 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ from flask.json import jsonify
from flask_restful import Resource
from werkzeug.exceptions import UnsupportedMediaType

from context.client.ContextClient import ContextClient
from slice.client.SliceClient import SliceClient

from ..tools.HttpStatusCodes import HTTP_CREATED
@@ -39,7 +40,10 @@ class NSS_Services(Resource):
        if not request.is_json:
            raise UnsupportedMediaType("JSON payload is required")
        request_data: Dict = request.json
        slice_request = IETFSliceHandler.create_slice_service(request_data)
        context_client = ContextClient()
        slice_request = IETFSliceHandler.create_slice_service(
            request_data, context_client
        )
        slice_client = SliceClient()
        slice_client.CreateSlice(slice_request)

Loading