diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dcde3bb15412b6a4e48faf19bf247f4570d216f4..873b2ac4b22143b37a96fd3ded467f586d61c8ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,6 +52,8 @@ include: - local: '/src/telemetry/.gitlab-ci.yml' - local: '/src/analytics/.gitlab-ci.yml' - local: '/src/qos_profile/.gitlab-ci.yml' + - local: '/src/vnt_manager/.gitlab-ci.yml' + - local: '/src/e2e_orchestrator/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/device/service/__main__.py b/src/device/service/__main__.py index e69b7fd3c4518b5cbc3833c457f8803e26b2c8e3..4a75d6284ac700bb1a6d6a388049824c2b301de7 100644 --- a/src/device/service/__main__.py +++ b/src/device/service/__main__.py @@ -16,8 +16,10 @@ import logging, signal, sys, threading from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( - ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, - wait_for_environment_variables) + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, + get_env_var_name, get_log_level, get_metrics_port, + wait_for_environment_variables +) from .DeviceService import DeviceService from .driver_api.DriverFactory import DriverFactory from .driver_api.DriverInstanceCache import DriverInstanceCache, preload_drivers diff --git a/src/vnt_manager/Dockerfile b/src/vnt_manager/Dockerfile index 93549aa8a4bd6d89945861e8be13a7e4352c0840..2680336e962240c3938b06ffb47079bd6dab1368 100644 --- a/src/vnt_manager/Dockerfile +++ b/src/vnt_manager/Dockerfile @@ -81,8 +81,7 @@ COPY src/context/__init__.py context/__init__.py COPY src/context/client/. context/client/ COPY src/device/__init__.py device/__init__.py COPY src/device/client/. device/client/ -COPY src/vnt_manager/__init__.py vnt_manager/__init__.py -COPY src/vnt_manager/client/. vnt_manager/client/ +COPY src/vnt_manager/. vnt_manager/ # Start the service ENTRYPOINT ["python", "-m", "vnt_manager.service"] diff --git a/src/vnt_manager/requirements.in b/src/vnt_manager/requirements.in index 5732b1bf053301f73a37830e66eb211912d9e200..6f9f590845cf3c925b2da23f127bc4aa942253b9 100644 --- a/src/vnt_manager/requirements.in +++ b/src/vnt_manager/requirements.in @@ -12,5 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -networkx websockets==12.0 diff --git a/src/vnt_manager/service/VNTManagerServiceServicerImpl.py b/src/vnt_manager/service/VNTManagerServiceServicerImpl.py index 4e7230b3ce59c2c6d7e2849179e95e12f2df6d2b..d684e044efd972bd7705f6c1a448b0a5be23431b 100644 --- a/src/vnt_manager/service/VNTManagerServiceServicerImpl.py +++ b/src/vnt_manager/service/VNTManagerServiceServicerImpl.py @@ -12,37 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - -import networkx as nx import grpc +import json +import logging +import threading import time from websockets.sync.client import connect -from common.method_wrappers.Decorator import (MetricsPool, MetricTypeEnum, safe_and_metered_rpc_method) +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.proto.context_pb2 import ContextId, Empty, Link, LinkId, LinkList, TopologyId from common.proto.vnt_manager_pb2 import VNTSubscriptionRequest, VNTSubscriptionReply from common.proto.vnt_manager_pb2_grpc import VNTManagerServiceServicer -from context.client.ContextClient import ContextClient -from common.proto.context_pb2 import ( - Empty, - Event, EventTypeEnum, - Link, LinkEvent, LinkId, LinkIdList, LinkList, -) +from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Topology import json_topology_id -from common.proto.context_pb2 import ContextId, TopologyId -import threading -from common.proto.context_pb2 import ( - ConnectionEvent, ContextEvent, DeviceEvent, EventTypeEnum, ServiceEvent, TopologyEvent) from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME -from typing import Any, Dict, Set -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordOperationEnum, DltRecordTypeEnum -from common.tools.grpc.Tools import grpc_message_to_json_string -from common.tools.grpc.Tools import grpc_message_to_json from .vntm_config_device import configure, deconfigure -import json LOGGER = logging.getLogger(__name__) @@ -140,7 +126,6 @@ class VNTManagerServiceServicerImpl(VNTManagerServiceServicer): LOGGER.debug("Servicer Created") self.links = [] - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def VNTSubscript(self, request: VNTSubscriptionRequest, context: grpc.ServicerContext) -> VNTSubscriptionReply: LOGGER.info("Subscript request: {:s}".format(str(grpc_message_to_json(request)))) @@ -148,14 +133,11 @@ class VNTManagerServiceServicerImpl(VNTManagerServiceServicer): reply.subscription = "OK" self.event_dispatcher = VNTMEventDispatcher(request.host, int(request.port)) - self.host = request.host self.port = request.port self.event_dispatcher.start() - return reply - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def ListVirtualLinks(self, request : Empty, context : grpc.ServicerContext) -> LinkList: return [link for link in context_client.ListLinks(Empty()).links if link.virtual] @@ -165,13 +147,12 @@ class VNTManagerServiceServicerImpl(VNTManagerServiceServicer): link = context_client.GetLink(request) return link if link.virtual else Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetVirtualLink(self, request : Link, context : grpc.ServicerContext) -> LinkId: try: LOGGER.info('SETTING virtual link') self.event_dispatcher.send_msg(grpc_message_to_json_string(request)) - # configure('CSGW1', 'xe5', 'CSGW2', 'xe5', 'ecoc2024-1') + # configure('CSGW1', 'xe5', 'CSGW2', 'xe5', 'ecoc2024-1') response = self.event_dispatcher.recv_msg() message_json = json.loads(response) link = Link(**message_json) @@ -200,4 +181,3 @@ class VNTManagerServiceServicerImpl(VNTManagerServiceServicer): LOGGER.info('Removed') return Empty() - diff --git a/src/vnt_manager/service/__main__.py b/src/vnt_manager/service/__main__.py index 9e9bea3de9836e3b03b3ffc14d6fdee560fa1593..2f55ced8137356838e993482897ef4fb02e71cf3 100644 --- a/src/vnt_manager/service/__main__.py +++ b/src/vnt_manager/service/__main__.py @@ -12,43 +12,37 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging -import signal -import sys -import threading - +import logging, signal, sys, threading from prometheus_client import start_http_server - from common.Constants import ServiceNameEnum -from common.Settings import (ENVVAR_SUFIX_SERVICE_HOST, - ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, - get_log_level, get_metrics_port, - wait_for_environment_variables) - +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, + get_env_var_name, get_log_level, get_metrics_port, + wait_for_environment_variables +) from .VNTManagerService import VNTManagerService -terminate = threading.Event() -LOGGER = None +LOG_LEVEL = get_log_level() +logging.basicConfig(level=LOG_LEVEL, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") +LOGGER = logging.getLogger(__name__) +terminate = threading.Event() -def signal_handler(signal, frame): # pylint: disable=redefined-outer-name +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name,unused-argument LOGGER.warning("Terminate signal received") terminate.set() - def main(): - global LOGGER # pylint: disable=global-statement - - log_level = get_log_level() - logging.basicConfig(level=log_level) - LOGGER = logging.getLogger(__name__) + LOGGER.info("Starting...") + wait_for_environment_variables([ + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + ]) - signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info("Starting...") - # Start metrics server metrics_port = get_metrics_port() start_http_server(metrics_port) @@ -56,12 +50,9 @@ def main(): # Starting VNTManager service grpc_service = VNTManagerService() grpc_service.start() - LOGGER.info("Started...") - # Wait for Ctrl+C or termination signal - - while not terminate.wait(timeout=1): - pass + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1): pass LOGGER.info("Terminating...") grpc_service.stop() @@ -69,6 +60,5 @@ def main(): LOGGER.info("Bye") return 0 - if __name__ == "__main__": sys.exit(main())