diff --git a/src/interdomain/Dockerfile b/src/interdomain/Dockerfile index 7ae62928e0a09ade5fdec781187cf54279b880c8..35c7dbeba4f7c7fb2cbcd8fbc479ba51a7c8dbcd 100644 --- a/src/interdomain/Dockerfile +++ b/src/interdomain/Dockerfile @@ -45,9 +45,10 @@ RUN python3 -m pip install -r interdomain/requirements.txt COPY common/. common COPY context/. context COPY device/. device +COPY interdomain/. interdomain COPY monitoring/. monitoring COPY service/. service -COPY interdomain/. interdomain +COPY slice/. slice # Start interdomain service ENTRYPOINT ["python", "-m", "interdomain.service"] diff --git a/src/interdomain/client/InterdomainClient.py b/src/interdomain/client/InterdomainClient.py index be226f53a5285385526e0bc640f117744a1a456d..fc61496cf8e20c806fd0d438854891110624a45e 100644 --- a/src/interdomain/client/InterdomainClient.py +++ b/src/interdomain/client/InterdomainClient.py @@ -7,6 +7,7 @@ from interdomain.proto.interdomain_pb2_grpc import InterdomainServiceStub LOGGER = logging.getLogger(__name__) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') class InterdomainClient: def __init__(self, address, port): @@ -26,28 +27,28 @@ class InterdomainClient: self.channel = None self.stub = None - @retry(exceptions=set(), max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + @RETRY_DECORATOR def Authenticate(self, request : TeraFlowController) -> AuthenticationResult: LOGGER.debug('Authenticate request: {:s}'.format(str(request))) response = self.stub.Authenticate(request) LOGGER.debug('Authenticate result: {:s}'.format(str(response))) return response - @retry(exceptions=set(), max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + @RETRY_DECORATOR def LookUpSlice(self, request : TransportSlice) -> SliceId: LOGGER.debug('LookUpSlice request: {:s}'.format(str(request))) response = self.stub.LookUpSlice(request) LOGGER.debug('LookUpSlice result: {:s}'.format(str(response))) return response - @retry(exceptions=set(), max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + @RETRY_DECORATOR def OrderSliceFromCatalog(self, request : TransportSlice) -> SliceStatus: LOGGER.debug('OrderSliceFromCatalog request: {:s}'.format(str(request))) response = self.stub.OrderSliceFromCatalog(request) LOGGER.debug('OrderSliceFromCatalog result: {:s}'.format(str(response))) return response - @retry(exceptions=set(), max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + @RETRY_DECORATOR def CreateSliceAndAddToCatalog(self, request : TransportSlice) -> SliceStatus: LOGGER.debug('CreateSliceAndAddToCatalog request: {:s}'.format(str(request))) response = self.stub.CreateSliceAndAddToCatalog(request) diff --git a/src/interdomain/proto/__init__.py b/src/interdomain/proto/__init__.py index 70a33251242c51f49140e596b8208a19dd5245f7..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/src/interdomain/proto/__init__.py +++ b/src/interdomain/proto/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - diff --git a/src/interdomain/proto/service_pb2_grpc.py b/src/interdomain/proto/interdomain_pb2_grpc.py similarity index 52% rename from src/interdomain/proto/service_pb2_grpc.py rename to src/interdomain/proto/interdomain_pb2_grpc.py index 58cd47e937d5f7bc56ca317ccb72f5958eda740d..b415f4177cae90f839bd23f882ac1bf757595f29 100644 --- a/src/interdomain/proto/service_pb2_grpc.py +++ b/src/interdomain/proto/interdomain_pb2_grpc.py @@ -3,9 +3,10 @@ import grpc from . import context_pb2 as context__pb2 +from . import slice_pb2 as slice__pb2 -class ServiceServiceStub(object): +class InterdomainServiceStub(object): """Missing associated documentation comment in .proto file.""" def __init__(self, channel): @@ -14,90 +15,90 @@ class ServiceServiceStub(object): Args: channel: A grpc.Channel. """ - self.CreateService = channel.unary_unary( - '/service.ServiceService/CreateService', - request_serializer=context__pb2.Service.SerializeToString, - response_deserializer=context__pb2.ServiceId.FromString, + self.Authenticate = channel.unary_unary( + '/interdomain.InterdomainService/Authenticate', + request_serializer=context__pb2.TeraFlowController.SerializeToString, + response_deserializer=context__pb2.AuthenticationResult.FromString, ) - self.UpdateService = channel.unary_unary( - '/service.ServiceService/UpdateService', - request_serializer=context__pb2.Service.SerializeToString, - response_deserializer=context__pb2.ServiceId.FromString, + self.LookUpSlice = channel.unary_unary( + '/interdomain.InterdomainService/LookUpSlice', + request_serializer=slice__pb2.TransportSlice.SerializeToString, + response_deserializer=slice__pb2.SliceId.FromString, ) - self.DeleteService = channel.unary_unary( - '/service.ServiceService/DeleteService', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, + self.OrderSliceFromCatalog = channel.unary_unary( + '/interdomain.InterdomainService/OrderSliceFromCatalog', + request_serializer=slice__pb2.TransportSlice.SerializeToString, + response_deserializer=slice__pb2.SliceStatus.FromString, ) - self.GetConnectionList = channel.unary_unary( - '/service.ServiceService/GetConnectionList', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.ConnectionList.FromString, + self.CreateSliceAndAddToCatalog = channel.unary_unary( + '/interdomain.InterdomainService/CreateSliceAndAddToCatalog', + request_serializer=slice__pb2.TransportSlice.SerializeToString, + response_deserializer=slice__pb2.SliceStatus.FromString, ) -class ServiceServiceServicer(object): +class InterdomainServiceServicer(object): """Missing associated documentation comment in .proto file.""" - def CreateService(self, request, context): + def Authenticate(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def UpdateService(self, request, context): + def LookUpSlice(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def DeleteService(self, request, context): + def OrderSliceFromCatalog(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def GetConnectionList(self, request, context): + def CreateSliceAndAddToCatalog(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') -def add_ServiceServiceServicer_to_server(servicer, server): +def add_InterdomainServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateService': grpc.unary_unary_rpc_method_handler( - servicer.CreateService, - request_deserializer=context__pb2.Service.FromString, - response_serializer=context__pb2.ServiceId.SerializeToString, + 'Authenticate': grpc.unary_unary_rpc_method_handler( + servicer.Authenticate, + request_deserializer=context__pb2.TeraFlowController.FromString, + response_serializer=context__pb2.AuthenticationResult.SerializeToString, ), - 'UpdateService': grpc.unary_unary_rpc_method_handler( - servicer.UpdateService, - request_deserializer=context__pb2.Service.FromString, - response_serializer=context__pb2.ServiceId.SerializeToString, + 'LookUpSlice': grpc.unary_unary_rpc_method_handler( + servicer.LookUpSlice, + request_deserializer=slice__pb2.TransportSlice.FromString, + response_serializer=slice__pb2.SliceId.SerializeToString, ), - 'DeleteService': grpc.unary_unary_rpc_method_handler( - servicer.DeleteService, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, + 'OrderSliceFromCatalog': grpc.unary_unary_rpc_method_handler( + servicer.OrderSliceFromCatalog, + request_deserializer=slice__pb2.TransportSlice.FromString, + response_serializer=slice__pb2.SliceStatus.SerializeToString, ), - 'GetConnectionList': grpc.unary_unary_rpc_method_handler( - servicer.GetConnectionList, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.ConnectionList.SerializeToString, + 'CreateSliceAndAddToCatalog': grpc.unary_unary_rpc_method_handler( + servicer.CreateSliceAndAddToCatalog, + request_deserializer=slice__pb2.TransportSlice.FromString, + response_serializer=slice__pb2.SliceStatus.SerializeToString, ), } generic_handler = grpc.method_handlers_generic_handler( - 'service.ServiceService', rpc_method_handlers) + 'interdomain.InterdomainService', rpc_method_handlers) server.add_generic_rpc_handlers((generic_handler,)) # This class is part of an EXPERIMENTAL API. -class ServiceService(object): +class InterdomainService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateService(request, + def Authenticate(request, target, options=(), channel_credentials=None, @@ -107,14 +108,14 @@ class ServiceService(object): wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/service.ServiceService/CreateService', - context__pb2.Service.SerializeToString, - context__pb2.ServiceId.FromString, + return grpc.experimental.unary_unary(request, target, '/interdomain.InterdomainService/Authenticate', + context__pb2.TeraFlowController.SerializeToString, + context__pb2.AuthenticationResult.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def UpdateService(request, + def LookUpSlice(request, target, options=(), channel_credentials=None, @@ -124,14 +125,14 @@ class ServiceService(object): wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/service.ServiceService/UpdateService', - context__pb2.Service.SerializeToString, - context__pb2.ServiceId.FromString, + return grpc.experimental.unary_unary(request, target, '/interdomain.InterdomainService/LookUpSlice', + slice__pb2.TransportSlice.SerializeToString, + slice__pb2.SliceId.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def DeleteService(request, + def OrderSliceFromCatalog(request, target, options=(), channel_credentials=None, @@ -141,14 +142,14 @@ class ServiceService(object): wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/service.ServiceService/DeleteService', - context__pb2.ServiceId.SerializeToString, - context__pb2.Empty.FromString, + return grpc.experimental.unary_unary(request, target, '/interdomain.InterdomainService/OrderSliceFromCatalog', + slice__pb2.TransportSlice.SerializeToString, + slice__pb2.SliceStatus.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def GetConnectionList(request, + def CreateSliceAndAddToCatalog(request, target, options=(), channel_credentials=None, @@ -158,8 +159,8 @@ class ServiceService(object): wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/service.ServiceService/GetConnectionList', - context__pb2.ServiceId.SerializeToString, - context__pb2.ConnectionList.FromString, + return grpc.experimental.unary_unary(request, target, '/interdomain.InterdomainService/CreateSliceAndAddToCatalog', + slice__pb2.TransportSlice.SerializeToString, + slice__pb2.SliceStatus.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/interdomain/proto/kpi_sample_types_pb2.py b/src/interdomain/proto/kpi_sample_types_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..ea7fd2f82757d4c3db02d7e2c7817e2787b0b490 --- /dev/null +++ b/src/interdomain/proto/kpi_sample_types_pb2.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: kpi_sample_types.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='kpi_sample_types.proto', + package='kpi_sample_types', + syntax='proto3', + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\x16kpi_sample_types.proto\x12\x10kpi_sample_types*\xbe\x01\n\rKpiSampleType\x12\x19\n\x15KPISAMPLETYPE_UNKNOWN\x10\x00\x12%\n!KPISAMPLETYPE_PACKETS_TRANSMITTED\x10\x65\x12\"\n\x1eKPISAMPLETYPE_PACKETS_RECEIVED\x10\x66\x12$\n\x1fKPISAMPLETYPE_BYTES_TRANSMITTED\x10\xc9\x01\x12!\n\x1cKPISAMPLETYPE_BYTES_RECEIVED\x10\xca\x01\x62\x06proto3' +) + +_KPISAMPLETYPE = _descriptor.EnumDescriptor( + name='KpiSampleType', + full_name='kpi_sample_types.KpiSampleType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='KPISAMPLETYPE_UNKNOWN', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='KPISAMPLETYPE_PACKETS_TRANSMITTED', index=1, number=101, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='KPISAMPLETYPE_PACKETS_RECEIVED', index=2, number=102, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='KPISAMPLETYPE_BYTES_TRANSMITTED', index=3, number=201, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='KPISAMPLETYPE_BYTES_RECEIVED', index=4, number=202, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=45, + serialized_end=235, +) +_sym_db.RegisterEnumDescriptor(_KPISAMPLETYPE) + +KpiSampleType = enum_type_wrapper.EnumTypeWrapper(_KPISAMPLETYPE) +KPISAMPLETYPE_UNKNOWN = 0 +KPISAMPLETYPE_PACKETS_TRANSMITTED = 101 +KPISAMPLETYPE_PACKETS_RECEIVED = 102 +KPISAMPLETYPE_BYTES_TRANSMITTED = 201 +KPISAMPLETYPE_BYTES_RECEIVED = 202 + + +DESCRIPTOR.enum_types_by_name['KpiSampleType'] = _KPISAMPLETYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + + +# @@protoc_insertion_point(module_scope) diff --git a/src/interdomain/proto/service_pb2.py b/src/interdomain/proto/service_pb2.py deleted file mode 100644 index 7a006915b8be39710a17faab075e382e322d918f..0000000000000000000000000000000000000000 --- a/src/interdomain/proto/service_pb2.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: service.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from . import context_pb2 as context__pb2 - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='service.proto', - package='service', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\rservice.proto\x12\x07service\x1a\rcontext.proto2\xfd\x01\n\x0eServiceService\x12\x37\n\rCreateService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x37\n\rUpdateService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rDeleteService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12\x42\n\x11GetConnectionList\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x62\x06proto3' - , - dependencies=[context__pb2.DESCRIPTOR,]) - - - -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - - - -_SERVICESERVICE = _descriptor.ServiceDescriptor( - name='ServiceService', - full_name='service.ServiceService', - file=DESCRIPTOR, - index=0, - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_start=42, - serialized_end=295, - methods=[ - _descriptor.MethodDescriptor( - name='CreateService', - full_name='service.ServiceService.CreateService', - index=0, - containing_service=None, - input_type=context__pb2._SERVICE, - output_type=context__pb2._SERVICEID, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='UpdateService', - full_name='service.ServiceService.UpdateService', - index=1, - containing_service=None, - input_type=context__pb2._SERVICE, - output_type=context__pb2._SERVICEID, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='DeleteService', - full_name='service.ServiceService.DeleteService', - index=2, - containing_service=None, - input_type=context__pb2._SERVICEID, - output_type=context__pb2._EMPTY, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='GetConnectionList', - full_name='service.ServiceService.GetConnectionList', - index=3, - containing_service=None, - input_type=context__pb2._SERVICEID, - output_type=context__pb2._CONNECTIONLIST, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), -]) -_sym_db.RegisterServiceDescriptor(_SERVICESERVICE) - -DESCRIPTOR.services_by_name['ServiceService'] = _SERVICESERVICE - -# @@protoc_insertion_point(module_scope) diff --git a/src/interdomain/proto/slice_pb2.py b/src/interdomain/proto/slice_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..91dbaaae342ac2ac8d52329c2bb32ece8fa1a08d --- /dev/null +++ b/src/interdomain/proto/slice_pb2.py @@ -0,0 +1,330 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: slice.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import context_pb2 as context__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='slice.proto', + package='slice', + syntax='proto3', + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\x0bslice.proto\x12\x05slice\x1a\rcontext.proto\"3\n\rSliceEndpoint\x12\"\n\x07port_id\x18\x01 \x01(\x0b\x32\x11.context.EndPoint\"\xf4\x01\n\x0eTransportSlice\x12 \n\x08slice_id\x18\x01 \x01(\x0b\x32\x0e.slice.SliceId\x12\'\n\tendpoints\x18\x02 \x03(\x0b\x32\x14.slice.SliceEndpoint\x12(\n\x0b\x63onstraints\x18\x03 \x03(\x0b\x32\x13.context.Constraint\x12$\n\x08services\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12#\n\x0bsubSlicesId\x18\x05 \x03(\x0b\x32\x0e.slice.SliceId\x12\"\n\x06status\x18\x06 \x01(\x0b\x32\x12.slice.SliceStatus\"Q\n\x07SliceId\x12%\n\tcontextId\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x1f\n\x08slice_id\x18\x02 \x01(\x0b\x32\r.context.Uuid\"W\n\x0bSliceStatus\x12 \n\x08slice_id\x18\x01 \x01(\x0b\x32\x0e.slice.SliceId\x12&\n\x06status\x18\x02 \x01(\x0e\x32\x16.slice.SliceStatusEnum*@\n\x0fSliceStatusEnum\x12\x0b\n\x07PLANNED\x10\x00\x12\x08\n\x04INIT\x10\x01\x12\n\n\x06\x41\x43TIVE\x10\x02\x12\n\n\x06\x44\x45INIT\x10\x03\x32\x88\x01\n\x0cSliceService\x12@\n\x11\x43reateUpdateSlice\x12\x15.slice.TransportSlice\x1a\x12.slice.SliceStatus\"\x00\x12\x36\n\x0b\x44\x65leteSlice\x12\x15.slice.TransportSlice\x1a\x0e.context.Empty\"\x00\x62\x06proto3' + , + dependencies=[context__pb2.DESCRIPTOR,]) + +_SLICESTATUSENUM = _descriptor.EnumDescriptor( + name='SliceStatusEnum', + full_name='slice.SliceStatusEnum', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='PLANNED', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='INIT', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ACTIVE', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEINIT', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=509, + serialized_end=573, +) +_sym_db.RegisterEnumDescriptor(_SLICESTATUSENUM) + +SliceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SLICESTATUSENUM) +PLANNED = 0 +INIT = 1 +ACTIVE = 2 +DEINIT = 3 + + + +_SLICEENDPOINT = _descriptor.Descriptor( + name='SliceEndpoint', + full_name='slice.SliceEndpoint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='port_id', full_name='slice.SliceEndpoint.port_id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=37, + serialized_end=88, +) + + +_TRANSPORTSLICE = _descriptor.Descriptor( + name='TransportSlice', + full_name='slice.TransportSlice', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='slice_id', full_name='slice.TransportSlice.slice_id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='endpoints', full_name='slice.TransportSlice.endpoints', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='constraints', full_name='slice.TransportSlice.constraints', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='services', full_name='slice.TransportSlice.services', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='subSlicesId', full_name='slice.TransportSlice.subSlicesId', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='slice.TransportSlice.status', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=91, + serialized_end=335, +) + + +_SLICEID = _descriptor.Descriptor( + name='SliceId', + full_name='slice.SliceId', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contextId', full_name='slice.SliceId.contextId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='slice_id', full_name='slice.SliceId.slice_id', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=337, + serialized_end=418, +) + + +_SLICESTATUS = _descriptor.Descriptor( + name='SliceStatus', + full_name='slice.SliceStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='slice_id', full_name='slice.SliceStatus.slice_id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='slice.SliceStatus.status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=420, + serialized_end=507, +) + +_SLICEENDPOINT.fields_by_name['port_id'].message_type = context__pb2._ENDPOINT +_TRANSPORTSLICE.fields_by_name['slice_id'].message_type = _SLICEID +_TRANSPORTSLICE.fields_by_name['endpoints'].message_type = _SLICEENDPOINT +_TRANSPORTSLICE.fields_by_name['constraints'].message_type = context__pb2._CONSTRAINT +_TRANSPORTSLICE.fields_by_name['services'].message_type = context__pb2._SERVICEID +_TRANSPORTSLICE.fields_by_name['subSlicesId'].message_type = _SLICEID +_TRANSPORTSLICE.fields_by_name['status'].message_type = _SLICESTATUS +_SLICEID.fields_by_name['contextId'].message_type = context__pb2._CONTEXTID +_SLICEID.fields_by_name['slice_id'].message_type = context__pb2._UUID +_SLICESTATUS.fields_by_name['slice_id'].message_type = _SLICEID +_SLICESTATUS.fields_by_name['status'].enum_type = _SLICESTATUSENUM +DESCRIPTOR.message_types_by_name['SliceEndpoint'] = _SLICEENDPOINT +DESCRIPTOR.message_types_by_name['TransportSlice'] = _TRANSPORTSLICE +DESCRIPTOR.message_types_by_name['SliceId'] = _SLICEID +DESCRIPTOR.message_types_by_name['SliceStatus'] = _SLICESTATUS +DESCRIPTOR.enum_types_by_name['SliceStatusEnum'] = _SLICESTATUSENUM +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +SliceEndpoint = _reflection.GeneratedProtocolMessageType('SliceEndpoint', (_message.Message,), { + 'DESCRIPTOR' : _SLICEENDPOINT, + '__module__' : 'slice_pb2' + # @@protoc_insertion_point(class_scope:slice.SliceEndpoint) + }) +_sym_db.RegisterMessage(SliceEndpoint) + +TransportSlice = _reflection.GeneratedProtocolMessageType('TransportSlice', (_message.Message,), { + 'DESCRIPTOR' : _TRANSPORTSLICE, + '__module__' : 'slice_pb2' + # @@protoc_insertion_point(class_scope:slice.TransportSlice) + }) +_sym_db.RegisterMessage(TransportSlice) + +SliceId = _reflection.GeneratedProtocolMessageType('SliceId', (_message.Message,), { + 'DESCRIPTOR' : _SLICEID, + '__module__' : 'slice_pb2' + # @@protoc_insertion_point(class_scope:slice.SliceId) + }) +_sym_db.RegisterMessage(SliceId) + +SliceStatus = _reflection.GeneratedProtocolMessageType('SliceStatus', (_message.Message,), { + 'DESCRIPTOR' : _SLICESTATUS, + '__module__' : 'slice_pb2' + # @@protoc_insertion_point(class_scope:slice.SliceStatus) + }) +_sym_db.RegisterMessage(SliceStatus) + + + +_SLICESERVICE = _descriptor.ServiceDescriptor( + name='SliceService', + full_name='slice.SliceService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_start=576, + serialized_end=712, + methods=[ + _descriptor.MethodDescriptor( + name='CreateUpdateSlice', + full_name='slice.SliceService.CreateUpdateSlice', + index=0, + containing_service=None, + input_type=_TRANSPORTSLICE, + output_type=_SLICESTATUS, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='DeleteSlice', + full_name='slice.SliceService.DeleteSlice', + index=1, + containing_service=None, + input_type=_TRANSPORTSLICE, + output_type=context__pb2._EMPTY, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), +]) +_sym_db.RegisterServiceDescriptor(_SLICESERVICE) + +DESCRIPTOR.services_by_name['SliceService'] = _SLICESERVICE + +# @@protoc_insertion_point(module_scope) diff --git a/src/interdomain/requirements.in b/src/interdomain/requirements.in index eb922871fa487db730696063a02083722ee7cfc3..58c398e7de1c46bac98483f3171b7fd37df98370 100644 --- a/src/interdomain/requirements.in +++ b/src/interdomain/requirements.in @@ -1,18 +1,5 @@ -anytree -apscheduler -fastcache -flask-restful -grpcio-health-checking -grpcio -Jinja2 -netconf-client #1.7.3 -prometheus-client -pytest -pytest-benchmark -python-json-logger -pytz -redis -requests -xmltodict -p4runtime==1.3.0 -coverage +grpcio==1.43.0 +grpcio-health-checking==1.43.0 +prometheus-client==0.13.0 +pytest==6.2.5 +pytest-benchmark==3.4.1 diff --git a/src/interdomain/service/InterdomainService.py b/src/interdomain/service/InterdomainService.py index 1ae1c677278e0695da6cabd77ae9a10ad56c9219..b1eaa635fb0a0155c8c791d9156a79a35272a3d3 100644 --- a/src/interdomain/service/InterdomainService.py +++ b/src/interdomain/service/InterdomainService.py @@ -1,60 +1,70 @@ -from concurrent import futures - -import grpc - -from interdomain.service.InterdomainServiceServicerImpl import InterdomainServiceServicerImpl -from interdomain.Config import GRPC_SLICE_PORT, GRPC_MAX_WORKERS, GRPC_GRACE_PERIOD -from interdomain.proto.interdomain_pb2_grpc import add_InterdomainServiceServicer_to_server +# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. -from grpc_health.v1 import health -from grpc_health.v1 import health_pb2 +import grpc, logging +from concurrent import futures +from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH +from grpc_health.v1.health_pb2 import HealthCheckResponse from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server - -from common.logger import getJSONLogger -LOGGER = getJSONLogger('interdomainservice-server') -LOGGER.setLevel('DEBUG') +from interdomain.Config import GRPC_SERVICE_PORT, GRPC_MAX_WORKERS, GRPC_GRACE_PERIOD +from interdomain.proto.interdomain_pb2_grpc import add_InterdomainServiceServicer_to_server +from .InterdomainServiceServicerImpl import InterdomainServiceServicerImpl BIND_ADDRESS = '0.0.0.0' +LOGGER = logging.getLogger(__name__) class InterdomainService: - def __init__(self, address=BIND_ADDRESS, slice_client=None, port=GRPC_INTERDOMAIN_PORT, max_workers=GRPC_MAX_WORKERS, - grace_period=GRPC_GRACE_PERIOD): - self.address = address + def __init__( + self, slice_client, + address=BIND_ADDRESS, port=GRPC_SERVICE_PORT, max_workers=GRPC_MAX_WORKERS, grace_period=GRPC_GRACE_PERIOD): + self.slice_client = slice_client + self.address = address self.port = port self.endpoint = None self.max_workers = max_workers self.grace_period = grace_period - self.monitoring_servicer = None + self.interdomain_servicer = None self.health_servicer = None self.pool = None self.server = None def start(self): - # create gRPC server - self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=self.max_workers)) # ,interceptors=(tracer_interceptor,)) + self.endpoint = '{:s}:{:s}'.format(str(self.address), str(self.port)) + LOGGER.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format( + str(self.endpoint), str(self.max_workers))) + + self.pool = futures.ThreadPoolExecutor(max_workers=self.max_workers) + self.server = grpc.server(self.pool) # , interceptors=(tracer_interceptor,)) - # add monitoring servicer class to gRPC server self.interdomain_servicer = InterdomainServiceServicerImpl() add_InterdomainServiceServicer_to_server(self.interdomain_servicer, self.server) - # add gRPC health checker servicer class to gRPC server - self.health_servicer = health.HealthServicer( + self.health_servicer = HealthServicer( experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) add_HealthServicer_to_server(self.health_servicer, self.server) - # start server - endpoint = '{}:{}'.format(self.address, self.port) - LOGGER.info('Listening on {}'.format(endpoint)) - self.server.add_insecure_port(endpoint) + port = self.server.add_insecure_port(self.endpoint) + self.endpoint = '{:s}:{:s}'.format(str(self.address), str(port)) + LOGGER.info('Listening on {:s}...'.format(str(self.endpoint))) self.server.start() - self.health_servicer.set('', health_pb2.HealthCheckResponse.SERVING) # pylint: disable=maybe-no-member + self.health_servicer.set(OVERALL_HEALTH, HealthCheckResponse.SERVING) # pylint: disable=maybe-no-member LOGGER.debug('Service started') def stop(self): - LOGGER.debug('Stopping service (grace period {} seconds)...'.format(self.grace_period)) + LOGGER.debug('Stopping service (grace period {:s} seconds)...'.format(str(self.grace_period))) self.health_servicer.enter_graceful_shutdown() self.server.stop(self.grace_period) LOGGER.debug('Service stopped') - diff --git a/src/interdomain/service/InterdomainServiceServicerImpl.py b/src/interdomain/service/InterdomainServiceServicerImpl.py index 76357d876c5d8161657610a023448c03f6f574fd..8570651d7700cdc6628a66130471e1be40104aa5 100644 --- a/src/interdomain/service/InterdomainServiceServicerImpl.py +++ b/src/interdomain/service/InterdomainServiceServicerImpl.py @@ -1,66 +1,49 @@ -import os,grpc - -from interdomain.proto import interdomain_pb2 -from interdomain.proto import interdomain_pb2_grpc - -from common.rpc_method_wrapper.ServiceExceptions import ServiceException -from common.logger import getJSONLogger - -from context.proto import context_pb2 - -from slice.Config import GRPC_SERVICE_PORT -from slice.client.SliceClient import SliceClient -from slice.proto import slice_pb2 - -LOGGER = getJSONLogger('interdomainservice-server') -LOGGER.setLevel('DEBUG') - -class InterdomainServiceServicerImpl(interdomain_pb2_grpc.InterdomainServiceServicer): +# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import grpc, logging +from common.rpc_method_wrapper.Decorator import create_metrics, safe_and_metered_rpc_method +from interdomain.proto.context_pb2 import AuthenticationResult, TeraFlowController +from interdomain.proto.slice_pb2 import SliceId, SliceStatus, TransportSlice +from interdomain.proto.interdomain_pb2_grpc import InterdomainServiceServicer + +LOGGER = logging.getLogger(__name__) + +SERVICE_NAME = 'Interdomain' +METHOD_NAMES = ['Authenticate', 'LookUpSlice', 'OrderSliceFromCatalog', 'CreateSliceAndAddToCatalog'] +METRICS = create_metrics(SERVICE_NAME, METHOD_NAMES) + +class InterdomainServiceServicerImpl(InterdomainServiceServicer): def __init__(self): - LOGGER.info('Init InterdomainService') + LOGGER.debug('Creating Servicer...') + LOGGER.debug('Servicer Created') - # rpc Authenticate (context.TeraFlowController) returns (context.AuthenticationResult) {} - def Authenticate(self, request : context_pb2.TeraFlowController) -> context_pb2.AuthenticationResult : - LOGGER.info('Authenticate') - auth_result = context_pb2.AuthenticationResult() - auth_result.context_id = 0 + @safe_and_metered_rpc_method(METRICS, LOGGER) + def Authenticate(self, request : TeraFlowController, context : grpc.ServicerContext) -> AuthenticationResult: + auth_result = AuthenticationResult() + #auth_result.context_id = ... auth_result.authenticated = True return auth_result - # rpc LookUpSlice(slice.TransportSlice) returns (slice.SliceId) {} - def LookUpSlice ( self, request : slice_pb2.TransportSlice) -> slice_pb2.SliceId: - - LOGGER.info('LookUpSlice') - try: - slice_id = slice_pb2.SliceId() - - return sliceId - except Exception as e: - LOGGER.exception('LookUpSlice exception') - - - - # rpc OrderSliceFromCatalog(slice.TransportSlice) returns (slice.SliceStatus) {} - def OrderSliceFromCatalog(self, request : slice_pb2.TransportSlice) -> slice_pb2.SliceStatus: - - LOGGER.info('OrderSliceFromCatalog') - - try: - slice_status=slice_pb2.SliceStatus() - return slice_status - except Exception as e: # pragma: no cover - LOGGER.exception('OrderSliceFromCatalog exception') - - - # rpc CreateSliceAndAddToCatalog(slice.TransportSlice) returns (slice.SliceStatus) {} - def CreateSliceAndAddToCatalog(self, request : slice_pb2.TransportSlice) -> slice_pb2.SliceStatus: - - LOGGER.info('OrderSliceFromCatalog') - - try: - slice_status=slice_pb2.SliceStatus() - return slice_status - except Exception as e: # pragma: no cover - LOGGER.exception('OrderSliceFromCatalog exception') + @safe_and_metered_rpc_method(METRICS, LOGGER) + def LookUpSlice(self, request : TransportSlice, context : grpc.ServicerContext) -> SliceId: + return SliceId() + @safe_and_metered_rpc_method(METRICS, LOGGER) + def OrderSliceFromCatalog(self, request : TransportSlice, context : grpc.ServicerContext) -> SliceStatus: + return SliceStatus() + @safe_and_metered_rpc_method(METRICS, LOGGER) + def CreateSliceAndAddToCatalog(self, request : TransportSlice, context : grpc.ServicerContext) -> SliceStatus: + return SliceStatus() diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 8fbe01770371446289b93b965dac92f1faba6713..2b919870a705af980654a2f60dcd16b618cf41a1 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -14,15 +14,13 @@ import logging, signal, sys, threading from prometheus_client import start_http_server -from common.Settings import get_setting +from common.Settings import get_setting, wait_for_environment_variables from slice.client.SliceClient import SliceClient - from interdomain.Config import ( - SLICE_SERVICE_HOST, SLICE_SERVICE_PORT, GRPC_INTERDOMAIN_PORT, - GRPC_MAX_WORKERS, GRPC_GRACE_PERIOD, LOG_LEVEL, METRICS_PORT) + SLICE_SERVICE_HOST, SLICE_SERVICE_PORT, GRPC_SERVICE_PORT, GRPC_MAX_WORKERS, GRPC_GRACE_PERIOD, LOG_LEVEL, + METRICS_PORT) from .InterdomainService import InterdomainService - terminate = threading.Event() LOGGER : logging.Logger = None @@ -33,22 +31,22 @@ def signal_handler(signal, frame): # pylint: disable=redefined-outer-name def main(): global LOGGER # pylint: disable=global-statement - grpc_service_port = get_setting('INTERDOMAINSERVICE_SERVICE_PORT_GRPC', default=GRPC_SERVICE_PORT ) - max_workers = get_setting('MAX_WORKERS', default=GRPC_MAX_WORKERS ) - grace_period = get_setting('GRACE_PERIOD', default=GRPC_GRACE_PERIOD ) - log_level = get_setting('LOG_LEVEL', default=LOG_LEVEL ) - metrics_port = get_setting('METRICS_PORT', default=METRICS_PORT ) + grpc_service_port = get_setting('INTERDOMAINSERVICE_SERVICE_PORT_GRPC', default=GRPC_SERVICE_PORT ) + max_workers = get_setting('MAX_WORKERS', default=GRPC_MAX_WORKERS ) + grace_period = get_setting('GRACE_PERIOD', default=GRPC_GRACE_PERIOD ) + log_level = get_setting('LOG_LEVEL', default=LOG_LEVEL ) + metrics_port = get_setting('METRICS_PORT', default=METRICS_PORT ) logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) - wait_for_environment_variables([ - 'CONTEXTSERVICE_SERVICE_HOST', 'CONTEXTSERVICE_SERVICE_PORT_GRPC', - 'MONITORINGSERVICE_SERVICE_HOST', 'MONITORINGSERVICE_SERVICE_PORT_GRPC' - ]) + #wait_for_environment_variables([ + # 'CONTEXTSERVICE_SERVICE_HOST', 'CONTEXTSERVICE_SERVICE_PORT_GRPC', + # 'MONITORINGSERVICE_SERVICE_HOST', 'MONITORINGSERVICE_SERVICE_PORT_GRPC' + #]) - slice_service_host = get_setting('SLICESERVICE_SERVICE_HOST', default=SLICE_SERVICE_HOST ) - slice_service_port = get_setting('SLICESERVICE_SERVICE_PORT_GRPC', default=SLICE_SERVICE_PORT ) + slice_service_host = get_setting('SLICESERVICE_SERVICE_HOST', default=SLICE_SERVICE_HOST ) + slice_service_port = get_setting('SLICESERVICE_SERVICE_PORT_GRPC', default=SLICE_SERVICE_PORT ) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) @@ -58,23 +56,23 @@ def main(): # Start metrics server start_http_server(metrics_port) - # Initialize Slice Client - if slice_service_host is None or slice_service_port is None: - raise Exception('Wrong address({:s}):port({:s}) of Slice component'.format( - str(slice_service_host), str(slice_service_port))) - slice_client = SliceClient(slice_service_host, slice_service_port) + ## Initialize Slice Client + #if slice_service_host is None or slice_service_port is None: + # raise Exception('Wrong address({:s}):port({:s}) of Slice component'.format( + # str(slice_service_host), str(slice_service_port))) + #slice_client = SliceClient(slice_service_host, slice_service_port) # Starting Interdomain service - grpc_interdomain = InterdomainService( - slice_client=slice_client, port=grpc_interdomain_port, max_workers=max_workers, + grpc_service = InterdomainService( + slice_client, port=grpc_service_port, max_workers=max_workers, grace_period=grace_period) - grpc_interdomain.start() + grpc_service.start() # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=0.1): pass LOGGER.info('Terminating...') - grpc_interdomain.stop() + grpc_service.stop() LOGGER.info('Bye') return 0