diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index cf163474c0cf3d8b0e7f554d0bfc111bae4dd2c2..fec407df96c0ae8650baf8492a8795c732c5c104 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -173,6 +173,16 @@ if LOAD_ALL_DEVICE_DRIVERS: } ])) +if LOAD_ALL_DEVICE_DRIVERS: + from .morpheus.MorpheusApiDriver import MorpheusApiDriver + DRIVERS.append( + (MorpheusApiDriver, [ + { + # Close enough, it does optical switching + FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.MORPHEUS, + FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_MORPHEUS, + } + ])) if LOAD_ALL_DEVICE_DRIVERS: from .microwave.IETFApiDriver import IETFApiDriver # pylint: disable=wrong-import-position @@ -232,14 +242,3 @@ if LOAD_ALL_DEVICE_DRIVERS: FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_QKD, } ])) - -if LOAD_ALL_DEVICE_DRIVERS: - from .morpheus.MorpheusApiDriver import MorpheusAPIDriver - DRIVERS.append( - (MorpheusAPIDriver, [ - { - # Close enough, it does optical switching - FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.MORPHEUS, - FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_MORPHEUS, - } - ])) diff --git a/src/device/service/drivers/morpheus/MorpheusApiDriver.py b/src/device/service/drivers/morpheus/MorpheusApiDriver.py index 3bef23a50e21d0804109572c7146f556f7e84aac..10181171ffc8613d2a3e878158baae6501e9295d 100644 --- a/src/device/service/drivers/morpheus/MorpheusApiDriver.py +++ b/src/device/service/drivers/morpheus/MorpheusApiDriver.py @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, requests, threading, json, time +import json, logging, queue, requests, threading, time from typing import Any, Iterator, List, Optional, Tuple, Union, Dict -from queue import Queue from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method from device.service.driver_api._Driver import _Driver @@ -38,8 +37,8 @@ class MorpheusApiDriver(_Driver): self.__pipeline_error_thread = None size = self.settings.get('queue_events_size', 10) - self.__pipeline_error_queue = Queue(maxsize=size) - self.__detection_queue = Queue(maxsize=size) + self.__pipeline_error_queue = queue.Queue(maxsize=size) + self.__detection_queue = queue.Queue(maxsize=size) def Connect(self) -> bool: url = self.__morpheus_root + '/restconf/data/naudit-morpheus:morpheus' @@ -62,10 +61,10 @@ class MorpheusApiDriver(_Driver): if self.__detection_thread and self.__detection_thread.is_alive(): self.__unsubscribe_detection_event() - if self.__pipeline_thread and self.__pipeline_thread.is_alive(): + if self.__pipeline_error_thread and self.__pipeline_error_thread.is_alive(): self.__unsubscribe_pipeline_error() - except Exception as e: - LOGGER.exception(f'Error during disconnect: {str(e)}') + except Exception: # pylint: disable=broad-except + LOGGER.exception('Error during disconnect') self.__terminate.set() return True @@ -84,7 +83,7 @@ class MorpheusApiDriver(_Driver): result.append((key, value)) return result - except Exception as e: + except Exception: # pylint: disable=broad-except LOGGER.exception('Exception getting initial config {:s}'.format(str(self.__morpheus_root))) return [] @@ -105,16 +104,12 @@ class MorpheusApiDriver(_Driver): for key in resource_keys: try: - results.append(config[key]) - except KeyError: - results.append(None) - except Exception as e: - results.append(e) - + results.append((key, config[key])) + except Exception as e: # pylint: disable=broad-except + results.append((key, e)) return results - return [(key, None) for key in resource_keys] - except Exception as e: - LOGGER.exception(f'Error getting config: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error getting config') return [(key, e) for key in resource_keys] @metered_subclass_method(METRICS_POOL) @@ -175,16 +170,16 @@ class MorpheusApiDriver(_Driver): (self.__subscribe_pipeline_error, self.__unsubscribe_pipeline_error), (self.__start_pipeline, self.__stop_pipeline), ] - for i, (sub_op, unsub_op) in enumerate(operations): + for _, (sub_op, unsub_op) in enumerate(operations): result = sub_op() - reuslts.append(result) + results.append(result) if isinstance(result, Exception): while rollback_stack: rollback_op = rollback_stack.pop() try: rollback_op() - except Exception as e: - LOGGER.exception(f'Error during subscription rollback operation: {e}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error during subscription rollback operation') return results @@ -206,8 +201,8 @@ class MorpheusApiDriver(_Driver): response = requests.post(url, headers=self.__headers, timeout=self.__timeout, verify=False) response.raise_for_status() return True - except Exception as e: - LOGGER.exception(f'Error starting pipeline: {e}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error starting pipeline') return e def __stop_pipeline(self) -> Union[bool, Exception]: @@ -217,8 +212,8 @@ class MorpheusApiDriver(_Driver): response = requests.post(url, headers=self.__headers, timeout=self.__timeout, verify=False) response.raise_for_status() return True - except Exception as e: - LOGGER.exception(f'Error stopping pipeline: {e}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error stopping pipeline') return e def __subscribe_detection_event(self) -> Union[bool, Exception]: @@ -232,8 +227,8 @@ class MorpheusApiDriver(_Driver): ) self.__detection_thread.start() return True - except Exception as e: - LOGGER.exception(f'Error subscribing to detection events: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error subscribing to detection events') return e def __unsubscribe_detection_event(self) -> Union[bool, Exception]: @@ -241,8 +236,8 @@ class MorpheusApiDriver(_Driver): if self.__detection_thread and self.__detection_thread.is_alive(): self.__detection_thread.join(timeout=5) return True - except Exception as e: - LOGGER.exception(f'Error unsubscribing from detection events: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error unsubscribing from detection events') return e def __subscribe_pipeline_error(self) -> Union[bool, Exception]: @@ -256,8 +251,8 @@ class MorpheusApiDriver(_Driver): ) self.__pipeline_error_thread.start() return True - except Exception as e: - LOGGER.exception(f'Error subscribing to pipeline errors: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error subscribing to pipeline errors') return e def __unsubscribe_pipeline_error(self) -> Union[bool, Exception]: @@ -265,8 +260,8 @@ class MorpheusApiDriver(_Driver): if self.__pipeline_error_thread and self.__pipeline_error_thread.is_alive(): self.__pipeline_error_thread.join(timeout=5) return True - except Exception as e: - LOGGER.exception(f'Error unsubscribing from pipeline errors: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error unsubscribing from pipeline errors') return e def __get_state(self) -> Dict: @@ -277,12 +272,12 @@ class MorpheusApiDriver(_Driver): if response.ok: state = response.json() return state - except Exception as e: - LOGGER.exception(f'Error getting internal state: {e}') + except Exception: # pylint: disable=broad-except + LOGGER.exception('Error getting internal state') return None - def __handle_notification_stream(self, url: str, queue: Queue[Any]) -> None: + def __handle_notification_stream(self, url: str, queue: queue.Queue[Any]) -> None: try: with requests.get(url, headers=self.__headers, @@ -298,5 +293,5 @@ class MorpheusApiDriver(_Driver): queue.put(event['data']['ietf-restconf:notification']) except json.JSONDecodeError as e: LOGGER.error(f'Error parsing event: {e}') - except Exception as e: - LOGGER.exception(f'Error in notification stream handler: {str(e)}') + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Error in notification stream handler') diff --git a/src/device/service/drivers/morpheus/__init__.py b/src/device/service/drivers/morpheus/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2 --- /dev/null +++ b/src/device/service/drivers/morpheus/__init__.py @@ -0,0 +1,13 @@ +# 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.