From 3bdd9f547cc652eec88b57f172e64e13b0e108be Mon Sep 17 00:00:00 2001 From: gifrerenom <lluis.gifre@cttc.es> Date: Thu, 20 Apr 2023 08:22:21 +0000 Subject: [PATCH] Common tools - Context Queries: - Added get_connection_by_id and get_connection_by_uuid methods - Updated old get_service method to get_service_by_id and get_service_by_uuid - Updated get_service method to use new SelectService context method and filter options - Updated old get_slice method to get_slice_by_id and get_slice_by_uuid - Updated get_slice method to use new SelectSlice context method and filter options - Updated get_device method to use new SelectDevice context method and filter options --- .../tools/context_queries/Connection.py | 43 ++++++++++++++++++ src/common/tools/context_queries/Device.py | 25 ++++++++--- src/common/tools/context_queries/Service.py | 40 ++++++++++++----- src/common/tools/context_queries/Slice.py | 44 ++++++++++++++----- 4 files changed, 123 insertions(+), 29 deletions(-) create mode 100644 src/common/tools/context_queries/Connection.py diff --git a/src/common/tools/context_queries/Connection.py b/src/common/tools/context_queries/Connection.py new file mode 100644 index 000000000..302133513 --- /dev/null +++ b/src/common/tools/context_queries/Connection.py @@ -0,0 +1,43 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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 typing import Optional +from common.proto.context_pb2 import Connection, ConnectionId +from context.client.ContextClient import ContextClient + +LOGGER = logging.getLogger(__name__) + +def get_connection_by_id( + context_client : ContextClient, connection_id : ConnectionId, rw_copy : bool = False +) -> Optional[Connection]: + try: + ro_connection : Connection = context_client.GetConnection(connection_id) + if not rw_copy: return ro_connection + rw_connection = Connection() + rw_connection.CopyFrom(ro_connection) + return rw_connection + except grpc.RpcError as e: + if e.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + #connection_uuid = connection_id.connection_uuid.uuid + #LOGGER.exception('Unable to get connection({:s})'.format(str(connection_uuid))) + return None + +def get_connection_by_uuid( + context_client : ContextClient, connection_uuid : str, rw_copy : bool = False +) -> Optional[Connection]: + # pylint: disable=no-member + connection_id = ConnectionId() + connection_id.connection_uuid.uuid = connection_uuid + return get_connection_by_id(context_client, connection_id, rw_copy=rw_copy) diff --git a/src/common/tools/context_queries/Device.py b/src/common/tools/context_queries/Device.py index 166882f2f..95f0e90b7 100644 --- a/src/common/tools/context_queries/Device.py +++ b/src/common/tools/context_queries/Device.py @@ -14,23 +14,34 @@ import grpc, logging from typing import List, Optional, Set -from common.proto.context_pb2 import ContextId, Device, DeviceId, Empty, Topology, TopologyId +from common.proto.context_pb2 import ContextId, Device, DeviceFilter, Empty, Topology, TopologyId from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient LOGGER = logging.getLogger(__name__) -def get_device(context_client : ContextClient, device_uuid : str, rw_copy : bool = False) -> Optional[Device]: +def get_device( + context_client : ContextClient, device_uuid : str, rw_copy : bool = False, + include_endpoints : bool = True, include_config_rules : bool = True, include_components : bool = True +) -> Optional[Device]: + device_filter = DeviceFilter() + device_id = device_filter.device_ids.device_ids.add() # pylint: disable=no-member + device_id.device_uuid.uuid = device_uuid + device_filter.include_endpoints = include_endpoints + device_filter.include_config_rules = include_config_rules + device_filter.include_components = include_components + try: - # pylint: disable=no-member - device_id = DeviceId() - device_id.device_uuid.uuid = device_uuid - ro_device = context_client.GetDevice(device_id) + ro_devices = context_client.SelectDevice(device_filter) + if len(ro_devices.devices) == 0: return None + assert len(ro_devices.devices) == 1 + ro_device = ro_devices.devices[0] if not rw_copy: return ro_device rw_device = Device() rw_device.CopyFrom(ro_device) return rw_device - except grpc.RpcError: + except grpc.RpcError as e: + if e.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member #LOGGER.exception('Unable to get Device({:s})'.format(str(device_uuid))) return None diff --git a/src/common/tools/context_queries/Service.py b/src/common/tools/context_queries/Service.py index 25716152c..b3b74827a 100644 --- a/src/common/tools/context_queries/Service.py +++ b/src/common/tools/context_queries/Service.py @@ -15,25 +15,43 @@ import grpc, logging from typing import Optional from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import Service, ServiceId +from common.proto.context_pb2 import Service, ServiceFilter, ServiceId from context.client.ContextClient import ContextClient LOGGER = logging.getLogger(__name__) -def get_service( - context_client : ContextClient, service_uuid : str, context_uuid : str = DEFAULT_CONTEXT_NAME, - rw_copy : bool = False - ) -> Optional[Service]: +def get_service_by_id( + context_client : ContextClient, service_id : ServiceId, rw_copy : bool = False, + include_endpoint_ids : bool = True, include_constraints : bool = True, include_config_rules : bool = True +) -> Optional[Service]: + service_filter = ServiceFilter() + service_filter.service_ids.service_ids.append(service_id) # pylint: disable=no-member + service_filter.include_endpoint_ids = include_endpoint_ids + service_filter.include_constraints = include_constraints + service_filter.include_config_rules = include_config_rules + try: - # pylint: disable=no-member - service_id = ServiceId() - service_id.context_id.context_uuid.uuid = context_uuid - service_id.service_uuid.uuid = service_uuid - ro_service = context_client.GetService(service_id) + ro_services = context_client.SelectService(service_filter) + if len(ro_services.services) == 0: return None + assert len(ro_services.services) == 1 + ro_service = ro_services.services[0] if not rw_copy: return ro_service rw_service = Service() rw_service.CopyFrom(ro_service) return rw_service - except grpc.RpcError: + except grpc.RpcError as e: + if e.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member #LOGGER.exception('Unable to get service({:s} / {:s})'.format(str(context_uuid), str(service_uuid))) return None + +def get_service_by_uuid( + context_client : ContextClient, service_uuid : str, context_uuid : str = DEFAULT_CONTEXT_NAME, + rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True, + include_config_rules : bool = True +) -> Optional[Service]: + service_id = ServiceId() + service_id.context_id.context_uuid.uuid = context_uuid # pylint: disable=no-member + service_id.service_uuid.uuid = service_uuid # pylint: disable=no-member + return get_service_by_id( + context_client, service_id, rw_copy=rw_copy, include_endpoint_ids=include_endpoint_ids, + include_constraints=include_constraints, include_config_rules=include_config_rules) diff --git a/src/common/tools/context_queries/Slice.py b/src/common/tools/context_queries/Slice.py index e5fb86d7a..c3ce572fc 100644 --- a/src/common/tools/context_queries/Slice.py +++ b/src/common/tools/context_queries/Slice.py @@ -15,25 +15,47 @@ import grpc, logging from typing import Optional from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import Slice, SliceId +from common.proto.context_pb2 import Slice, SliceFilter, SliceId from context.client.ContextClient import ContextClient LOGGER = logging.getLogger(__name__) -def get_slice( - context_client : ContextClient, slice_uuid : str, context_uuid : str = DEFAULT_CONTEXT_NAME, - rw_copy : bool = False - ) -> Optional[Slice]: +def get_slice_by_id( + context_client : ContextClient, slice_id : SliceId, rw_copy : bool = False, include_endpoint_ids : bool = True, + include_constraints : bool = True, include_service_ids : bool = True, include_subslice_ids : bool = True, + include_config_rules : bool = True +) -> Optional[Slice]: + slice_filter = SliceFilter() + slice_id = slice_filter.slice_ids.slice_ids.append(slice_id) # pylint: disable=no-member + slice_filter.include_endpoint_ids = include_endpoint_ids + slice_filter.include_constraints = include_constraints + slice_filter.include_service_ids = include_service_ids + slice_filter.include_subslice_ids = include_subslice_ids + slice_filter.include_config_rules = include_config_rules + try: - # pylint: disable=no-member - slice_id = SliceId() - slice_id.context_id.context_uuid.uuid = context_uuid - slice_id.slice_uuid.uuid = slice_uuid - ro_slice = context_client.GetSlice(slice_id) + ro_slices = context_client.SelectSlice(slice_filter) + if len(ro_slices.slices) == 0: return None + assert len(ro_slices.slices) == 1 + ro_slice = ro_slices.slices[0] if not rw_copy: return ro_slice rw_slice = Slice() rw_slice.CopyFrom(ro_slice) return rw_slice - except grpc.RpcError: + except grpc.RpcError as e: + if e.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member #LOGGER.exception('Unable to get slice({:s} / {:s})'.format(str(context_uuid), str(slice_uuid))) return None + +def get_slice_by_uuid( + context_client : ContextClient, slice_uuid : str, context_uuid : str = DEFAULT_CONTEXT_NAME, + rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True, + include_service_ids : bool = True, include_subslice_ids : bool = True, include_config_rules : bool = True +) -> Optional[Slice]: + slice_id = SliceId() + slice_id.context_id.context_uuid.uuid = context_uuid # pylint: disable=no-member + slice_id.slice_uuid.uuid = slice_uuid # pylint: disable=no-member + return get_slice_by_id( + context_client, slice_id, rw_copy=rw_copy, include_endpoint_ids=include_endpoint_ids, + include_constraints=include_constraints, include_service_ids=include_service_ids, + include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules) -- GitLab