From 31473426c994b80838a0445fa39fcc91739d7e94 Mon Sep 17 00:00:00 2001 From: Waleed Akbar <wakbar@cttc.es> Date: Fri, 18 Apr 2025 17:28:32 +0000 Subject: [PATCH] Update requirements file and added error messages for gNMI OpenConfig collector - Added pyang and pyangbind to requirements.in - Created ErrorMessages.py for standardized error handling - Adjusted BASE_PATH in clone-yang-models.sh for correct directory structure - Updated YangHandler.py to include openconfig-ospf-types - Refactored imports in __init__.py for better readability - Added test utilities in messages_gnmi_openconfig.py for KPI packet creation - Modified test_gnmi_openconfig_collector.py to utilize new test utilities --- src/telemetry/backend/requirements.in | 4 +- .../backend/service/ErrorMessages.py | 40 +++++++++++++++++++ .../backend/service/collectors/__init__.py | 1 - .../gnmi_openconfig/clone-yang-models.sh | 2 +- .../gnmi_openconfig/handlers/YangHandler.py | 3 +- .../gnmi_openconfig/handlers/__init__.py | 18 ++++----- ...nconfig.py => messages_gnmi_openconfig.py} | 8 ++-- .../test_gnmi_openconfig_collector.py | 5 ++- 8 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 src/telemetry/backend/service/ErrorMessages.py rename src/telemetry/backend/tests/gnmi_openconfig/{messages_gnmi-openconfig.py => messages_gnmi_openconfig.py} (92%) diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index a9e9b0afa..617121b44 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -14,8 +14,10 @@ anytree==2.8.0 confluent-kafka==2.3.* +pyang==2.6.* +git+https://github.com/robshakir/pyangbind.git libyang==2.8.4 numpy==2.0.1 APScheduler==3.10.1 deepdiff==6.7.* -pygnmi==0.8.14 \ No newline at end of file +pygnmi==0.8.14 diff --git a/src/telemetry/backend/service/ErrorMessages.py b/src/telemetry/backend/service/ErrorMessages.py new file mode 100644 index 000000000..317de8cf6 --- /dev/null +++ b/src/telemetry/backend/service/ErrorMessages.py @@ -0,0 +1,40 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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. + +_DEVICE_ID = 'DeviceId({device_uuid:s})' +_ENDPOINT_ID = 'EndpointId({endpoint_uuid:s})' +_KPI = 'Kpi({kpi_uuid:s})' +_DEVICE_ENDPOINT_ID = _DEVICE_ID + '/' + _ENDPOINT_ID +_RESOURCE = 'Resource({resource_data:s})' +_RESOURCE_KEY = 'Resource(key={resource_key:s})' +_RESOURCE_KEY_VALUE = 'Resource(key={resource_key:s}, value={resource_value:s})' +_SUBSCRIPTION = 'Subscription(key={subscr_key:s}, duration={subscr_duration:s}, interval={subscr_interval:s})' +_SAMPLE_TYPE = 'SampleType({sample_type_id:s}/{sample_type_name:s})' +_ERROR = 'Error({error:s})' + +ERROR_MISSING_DRIVER = _DEVICE_ID + ' has not been added to this Device instance' +ERROR_MISSING_KPI = _KPI + ' not found' + +ERROR_BAD_RESOURCE = _DEVICE_ID + ': GetConfig retrieved malformed ' + _RESOURCE +ERROR_UNSUP_RESOURCE = _DEVICE_ID + ': GetConfig retrieved unsupported ' + _RESOURCE + +ERROR_GET = _DEVICE_ID + ': Unable to Get ' + _RESOURCE_KEY + '; ' + _ERROR +ERROR_GET_INIT = _DEVICE_ID + ': Unable to Get Initial ' + _RESOURCE_KEY + '; ' + _ERROR +ERROR_DELETE = _DEVICE_ID + ': Unable to Delete ' + _RESOURCE_KEY_VALUE + '; ' + _ERROR +ERROR_SET = _DEVICE_ID + ': Unable to Set ' + _RESOURCE_KEY_VALUE + '; ' + _ERROR + +ERROR_SAMPLETYPE = _DEVICE_ENDPOINT_ID + ': ' + _SAMPLE_TYPE + ' not supported' + +ERROR_SUBSCRIBE = _DEVICE_ID + ': Unable to Subscribe ' + _SUBSCRIPTION + '; ' + _ERROR +ERROR_UNSUBSCRIBE = _DEVICE_ID + ': Unable to Unsubscribe ' + _SUBSCRIPTION + '; ' + _ERROR diff --git a/src/telemetry/backend/service/collectors/__init__.py b/src/telemetry/backend/service/collectors/__init__.py index 2d19a10a6..084207f51 100644 --- a/src/telemetry/backend/service/collectors/__init__.py +++ b/src/telemetry/backend/service/collectors/__init__.py @@ -25,7 +25,6 @@ DRIVERS.append( # TODO: multi-filter is not working { FilterFieldEnum.DEVICE_TYPE: [ - DeviceTypeEnum.EMULATED_P4_SWITCH, DeviceTypeEnum.EMULATED_PACKET_ROUTER, DeviceTypeEnum.EMULATED_PACKET_SWITCH, ], diff --git a/src/telemetry/backend/service/collectors/gnmi_openconfig/clone-yang-models.sh b/src/telemetry/backend/service/collectors/gnmi_openconfig/clone-yang-models.sh index eb9760784..10029b405 100755 --- a/src/telemetry/backend/service/collectors/gnmi_openconfig/clone-yang-models.sh +++ b/src/telemetry/backend/service/collectors/gnmi_openconfig/clone-yang-models.sh @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -BASE_PATH=~/tfs-ctrl/src/telemetry/backend/collectors/gnmi_openconfig +BASE_PATH=~/tfs-ctrl/src/telemetry/backend/service/collectors/gnmi_openconfig GIT_BASE_PATH=${BASE_PATH}/git/openconfig rm -rf ${GIT_BASE_PATH} diff --git a/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/YangHandler.py b/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/YangHandler.py index e7cff19eb..15d9afac4 100644 --- a/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/YangHandler.py +++ b/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/YangHandler.py @@ -42,10 +42,11 @@ YANG_MODULES = [ 'openconfig-types', 'openconfig-policy-types', 'openconfig-mpls-types', + 'openconfig-ospf-types', 'openconfig-network-instance-types', 'openconfig-network-instance', - 'openconfig-platform', + # 'openconfig-platform', 'openconfig-platform-controller-card', 'openconfig-platform-cpu', 'openconfig-platform-ext', diff --git a/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/__init__.py b/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/__init__.py index 0c803bb16..e230e1234 100644 --- a/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/__init__.py +++ b/src/telemetry/backend/service/collectors/gnmi_openconfig/handlers/__init__.py @@ -15,16 +15,16 @@ import logging from typing import Any, Dict, List, Optional, Tuple, Union from telemetry.backend.service.collector_api._Collector import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES -from ._Handler import _Handler -from .Component import ComponentHandler -from .Interface import InterfaceHandler -from .InterfaceCounter import InterfaceCounterHandler -from .NetworkInstance import NetworkInstanceHandler -from .NetworkInstanceInterface import NetworkInstanceInterfaceHandler -from .NetworkInstanceProtocol import NetworkInstanceProtocolHandler +from ._Handler import _Handler +from .Component import ComponentHandler +from .Interface import InterfaceHandler +from .InterfaceCounter import InterfaceCounterHandler +from .NetworkInstance import NetworkInstanceHandler +from .NetworkInstanceInterface import NetworkInstanceInterfaceHandler +from .NetworkInstanceProtocol import NetworkInstanceProtocolHandler from .NetworkInstanceStaticRoute import NetworkInstanceStaticRouteHandler -from .Tools import get_schema -from .YangHandler import YangHandler +from .Tools import get_schema +from .YangHandler import YangHandler LOGGER = logging.getLogger(__name__) diff --git a/src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi-openconfig.py b/src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi_openconfig.py similarity index 92% rename from src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi-openconfig.py rename to src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi_openconfig.py index 99ea4bfbb..09bc9088a 100644 --- a/src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi-openconfig.py +++ b/src/telemetry/backend/tests/gnmi_openconfig/messages_gnmi_openconfig.py @@ -22,7 +22,7 @@ def _create_kpi_pkt_recevied( device_uuid : uuid.UUID = uuid.UUID("a8695f53-ba2e-57bd-b586-edf2b5e054b1"), endpoint_uuid : uuid.UUID = uuid.UUID("c51c2784-0377-5851-993b-46804c89cfc9") ): - _create_kpi_descriptor( + return _create_kpi_descriptor( descriptor_name = descriptor_name, sample_type = sample_type, device_uuid = device_uuid, @@ -35,7 +35,7 @@ def _create_kpi_pkt_transmitted( device_uuid : uuid.UUID = uuid.UUID("a8695f53-ba2e-57bd-b586-edf2b5e054b1"), endpoint_uuid : uuid.UUID = uuid.UUID("c51c2784-0377-5851-993b-46804c89cfc9") ): - _create_kpi_descriptor( + return _create_kpi_descriptor( descriptor_name = descriptor_name, sample_type = sample_type, device_uuid = device_uuid, @@ -54,10 +54,10 @@ def _create_kpi_descriptor( # _create_kpi_request.kpi_id.kpi_id.uuid = "f974b6cc-095f-4767-b8c1-3457b383fb99" _create_kpi_request.kpi_description = descriptor_name _create_kpi_request.kpi_sample_type = sample_type - _create_kpi_request.device_id.device_uuid.uuid = device_uuid + _create_kpi_request.device_id.device_uuid.uuid = str(device_uuid) _create_kpi_request.service_id.service_uuid.uuid = 'SERVICE_ID_2' _create_kpi_request.slice_id.slice_uuid.uuid = 'SLICE_1' - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = endpoint_uuid + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(endpoint_uuid) _create_kpi_request.connection_id.connection_uuid.uuid = 'CONN_3' _create_kpi_request.link_id.link_uuid.uuid = 'LINK_5' return _create_kpi_request diff --git a/src/telemetry/backend/tests/gnmi_openconfig/test_gnmi_openconfig_collector.py b/src/telemetry/backend/tests/gnmi_openconfig/test_gnmi_openconfig_collector.py index c29798ccd..8f9061bb2 100644 --- a/src/telemetry/backend/tests/gnmi_openconfig/test_gnmi_openconfig_collector.py +++ b/src/telemetry/backend/tests/gnmi_openconfig/test_gnmi_openconfig_collector.py @@ -23,14 +23,15 @@ from common.proto.context_pb2 import EndPointId, DeviceId, TopologyId, ContextId from src.telemetry.backend.service.collectors.gnmi_openconfig.GnmiOpenConfigCollector import GnmiOpenConfigCollector from .storage.Storage import Storage from common.proto.kpi_manager_pb2 import KpiDescriptor -from device.service.monitoring.ResourceKeyMapper import ResourceKeyMapper from telemetry.backend.service.collector_api._Collector import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES from .tools.manage_config import ( check_config_endpoints, check_config_interfaces, check_config_network_instances, get_config ) -# from .messages_gnmi-openconfig import _create_kpi_pkt_recevied, _create_kpi_pkt_transmitted +from .messages_gnmi_openconfig import ( + _create_kpi_pkt_recevied, _create_kpi_pkt_transmitted +) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -- GitLab