Commit e7f2db80 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

NBI component - TFS-API connector:

- Added facade to expose computed optical connectivity candidates
parent 1bb72f6b
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -14,12 +14,16 @@

import json
import logging
import urllib.parse
from typing import Dict, List
import grpc
import requests
from flask.json import jsonify
from flask_restful import Resource, request
from werkzeug.exceptions import BadRequest
from common.Constants import ServiceNameEnum
from common.proto.context_pb2 import Empty, LinkTypeEnum, Service, ServiceTypeEnum, ConfigActionEnum, ConfigRule
from common.Settings import get_service_host, get_service_port_grpc
from common.proto.e2eorchestrator_pb2 import E2EOrchestratorRequest
from common.tools.descriptor.Tools import format_device_custom_config_rules, format_service_custom_config_rules
from common.tools.grpc.Tools import grpc_message_to_json
@@ -455,6 +459,34 @@ class OpticalSpectrumReservationRelease(_Resource):
        except grpc.RpcError as exc:
            return _format_grpc_error(exc)

class OpticalConnectivityCandidates(_Resource):
    def post(self, context_uuid : str, topology_uuid : str):
        candidate_request = request.get_json()
        if candidate_request is None:
            raise BadRequest('Missing optical connectivity candidate request')

        try:
            optical_host = get_service_host(ServiceNameEnum.OPTICALCONTROLLER)
            optical_port = get_service_port_grpc(ServiceNameEnum.OPTICALCONTROLLER)
            url = 'http://{:s}:{:d}/OpticalTFS/ComputeOpticalConnectivityCandidates/{:s}/{:s}'.format(
                optical_host, optical_port,
                urllib.parse.quote(context_uuid, safe=''),
                urllib.parse.quote(topology_uuid, safe=''),
            )
            reply = requests.post(url, json=candidate_request, timeout=30)
            if reply.content and len(reply.content) > 0:
                return reply.json(), reply.status_code
            return None, reply.status_code
        except requests.exceptions.RequestException as exc:
            LOGGER.warning('Optical controller candidate computation request failed: %s', str(exc))
            return {
                'candidates': [],
                'rejected_reasons': [{
                    'code': 'OPTICAL_CONTROLLER_UNAVAILABLE',
                    'message': str(exc),
                }],
            }, 503

class ConnectionIds(_Resource):
    def get(self, context_uuid : str, service_uuid : str):
        return format_grpc_to_json(self.context_client.ListConnectionIds(grpc_service_id(context_uuid, service_uuid)))
+3 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ from .Resources import (
    OpticalLink, OpticalLinks,
    OpticalSpectrumReservation, OpticalSpectrumReservationConsume,
    OpticalSpectrumReservationRelease, OpticalSpectrumReservations,
    OpticalConnectivityCandidates,
    PolicyRule, PolicyRuleIds, PolicyRules,
    Service, ServiceIds, Services,
    Slice, SliceIds, Slices,
@@ -72,6 +73,8 @@ _RESOURCES = [
     '/context/<path:context_uuid>/optical_spectrum_reservation/<path:reservation_uuid>/consume'),
    ('api.optical_spectrum_reservation_release', OpticalSpectrumReservationRelease,
     '/context/<path:context_uuid>/optical_spectrum_reservation/<path:reservation_uuid>/release'),
    ('api.optical_connectivity_candidates', OpticalConnectivityCandidates,
     '/context/<path:context_uuid>/topology/<path:topology_uuid>/optical_connectivity_candidates'),

    ('api.connection_ids',   ConnectionIds,   '/context/<path:context_uuid>/service/<path:service_uuid>/connection_ids'),
    ('api.connections',      Connections,     '/context/<path:context_uuid>/service/<path:service_uuid>/connections'),