diff --git a/src/context/Dockerfile b/src/context/Dockerfile index c39f39e8c082b30492283b7f7285876fbda08716..b5c3cdb860c3a8a51b890ef201d2d14c4abda6a3 100644 --- a/src/context/Dockerfile +++ b/src/context/Dockerfile @@ -15,12 +15,8 @@ FROM python:3.9-slim # Install dependencies -# RUN apt-get --yes --quiet --quiet update && \ -# apt-get --yes --quiet --quiet install wget g++ git && \ -# rm -rf /var/lib/apt/lists/* - -RUN apt-get --yes update && \ - apt-get --yes install wget g++ git && \ +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ rm -rf /var/lib/apt/lists/* # Set Python to show logs as they occur diff --git a/src/device/client/DeviceClient.py b/src/device/client/DeviceClient.py index 3fea0276a8663e701239da12ce68257ea0c02f01..8397b89b8c43917a5a22dee2ed3ad5ec0d105aae 100644 --- a/src/device/client/DeviceClient.py +++ b/src/device/client/DeviceClient.py @@ -15,12 +15,16 @@ import grpc, logging from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc -from common.proto.context_pb2 import Device, DeviceConfig, DeviceId, Empty,OpticalConfig,OpticalConfigId ,OpticalConfigList +from common.proto.context_pb2 import ( + Device, DeviceConfig, DeviceId, Empty, + OpticalConfig, OpticalConfigId, OpticalConfigList +) from common.proto.device_pb2 import MonitoringSettings from common.proto.device_pb2_grpc import DeviceServiceStub +from common.proto.optical_device_pb2_grpc import OpenConfigServiceStub from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string -from common.proto.optical_device_pb2_grpc import OpenConfigServiceStub + LOGGER = logging.getLogger(__name__) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) @@ -41,12 +45,13 @@ class DeviceClient: def connect(self): self.channel = grpc.insecure_channel(self.endpoint) self.stub = DeviceServiceStub(self.channel) - self.openconfig_stub=OpenConfigServiceStub(self.channel) + self.openconfig_stub = OpenConfigServiceStub(self.channel) def close(self): if self.channel is not None: self.channel.close() self.channel = None self.stub = None + self.openconfig_stub = None @RETRY_DECORATOR def AddDevice(self, request : Device) -> DeviceId: @@ -82,23 +87,21 @@ class DeviceClient: response = self.stub.MonitorDeviceKpi(request) LOGGER.debug('MonitorDeviceKpi result: {:s}'.format(grpc_message_to_json_string(response))) return response - + def ConfigureOpticalDevice(self, request : OpticalConfig) -> OpticalConfigId: LOGGER.debug('ConfigureOpticalDevice request: {:s}'.format(grpc_message_to_json_string(request))) response = self.openconfig_stub.ConfigureOpticalDevice(request) LOGGER.debug('ConfigureOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response - + def GetDeviceConfiguration(self, request : OpticalConfigList) -> Empty: LOGGER.debug('ConfigureOpticalDevice request: {:s}'.format(grpc_message_to_json_string(request))) response = self.openconfig_stub.GetDeviceConfiguration(request) LOGGER.debug('ConfigureOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response - + def DisableOpticalDevice(self, request : OpticalConfig) -> Empty: LOGGER.debug('DisableOpticalDevice request: {:s}'.format(grpc_message_to_json_string(request))) response = self.openconfig_stub.DisableOpticalDevice(request) LOGGER.debug('DisableOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response - - diff --git a/src/device/service/drivers/oc_driver/OCDriver.py b/src/device/service/drivers/oc_driver/OCDriver.py index aa86acb559c3a65c52a0f2027a7ac6d1519834af..31c2b533fe57fbc9d97ebfddb08413a106f17c34 100644 --- a/src/device/service/drivers/oc_driver/OCDriver.py +++ b/src/device/service/drivers/oc_driver/OCDriver.py @@ -353,5 +353,3 @@ class OCDriver(_Driver): else: results = edit_config(self.__netconf_handler, self.__logger, resources, delete=True,conditions=conditions) return results - - diff --git a/src/device/service/drivers/oc_driver/templates/Interfaces/interfaces.py b/src/device/service/drivers/oc_driver/templates/Interfaces/interfaces.py index 0e5d924e1becc1d1c3961bf5c1c138e76329fb41..b8c3812f292270b63dbe1391d922cbd989415458 100644 --- a/src/device/service/drivers/oc_driver/templates/Interfaces/interfaces.py +++ b/src/device/service/drivers/oc_driver/templates/Interfaces/interfaces.py @@ -14,6 +14,7 @@ from yattag import Doc, indent import logging + def interface_template (interface_data:dict) : data={"name":"eth0","ip":"192.168.1.1","prefix-length":'24'} doc, tag, text = Doc().tagtext() @@ -31,13 +32,10 @@ def interface_template (interface_data:dict) : with tag('config'): with tag('ip'):text(interface_data["ip"]) with tag('prefix-length'):text(interface_data["prefix-length"]) - + result = indent( doc.getvalue(), indentation = ' '*2, newline = '\r\n' ) - - return result - - \ No newline at end of file + return result diff --git a/src/device/service/drivers/oc_driver/templates/Tools.py b/src/device/service/drivers/oc_driver/templates/Tools.py index ba1a0c71faa958d2520e8755a2d7572bdecd551e..92607aca88c1581218c97484c7dfcc87831b5912 100644 --- a/src/device/service/drivers/oc_driver/templates/Tools.py +++ b/src/device/service/drivers/oc_driver/templates/Tools.py @@ -492,7 +492,3 @@ def extract_openroadm_info(xml_data:str): if (clli is not None): roadm_info['clli']=clli.text return roadm_info - - - - diff --git a/src/device/service/drivers/oc_driver/templates/VPN/common.py b/src/device/service/drivers/oc_driver/templates/VPN/common.py index e4233da464f2ed2f7aa7f840505e8979dabba0ac..d84afc5563ad9cf1fbc7fda44800b90876ee302e 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/common.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/common.py @@ -1,4 +1,3 @@ - # Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,26 +13,6 @@ # limitations under the License. -from yattag import Doc, indent -import logging - - - - - - - - - - - - - - - - - - def seperate_port_config(resources:list,unwanted_keys=[])->list[list,dict,str]: config=[] ports={} @@ -51,8 +30,6 @@ def seperate_port_config(resources:list,unwanted_keys=[])->list[list,dict,str]: return [config,ports,index] - - def extract_ports (resources:list): if len(resources) ==0 :return ports=[] @@ -60,10 +37,6 @@ def extract_ports (resources:list): if flow is not None: ports = flow['value'] return ports - - - - def filter_config(resources:list,unwanted_keys=[])->list[list,dict,str]: config=[] @@ -80,5 +53,3 @@ def filter_config(resources:list,unwanted_keys=[])->list[list,dict,str]: ports = extract_ports(resources=resources) return [config,ports,index] - - diff --git a/src/device/service/drivers/oc_driver/templates/VPN/physical.py b/src/device/service/drivers/oc_driver/templates/VPN/physical.py index 82526db067c8237e99ea49156a590620729ab43f..11e6df5d99f8d365eeaeec3960da52f28c717551 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/physical.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/physical.py @@ -261,4 +261,4 @@ def edit_optical_channel (resources:list[dict]): if admin_state is None : results.extend(create_optical_channel(resources=resources,ports=ports,config=config) ) - return results \ No newline at end of file + return results diff --git a/src/device/service/drivers/oc_driver/templates/VPN/roadms.py b/src/device/service/drivers/oc_driver/templates/VPN/roadms.py index d4a0debbd6171e3de0c2ab71d0858498bfb51970..7e076588cc160cf22d773476119f8e91001a5053 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/roadms.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/roadms.py @@ -354,4 +354,4 @@ def delete_optical_band (resources:list): newline = '' ) results.append(result) - return results \ No newline at end of file + return results diff --git a/src/device/service/drivers/oc_driver/templates/VPN/transponder.py b/src/device/service/drivers/oc_driver/templates/VPN/transponder.py index 07706fe89397fbeed66412eeef77112a2ba787fb..a41c7e9a0853a371bf1f6d8d343913c52f9365ac 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/transponder.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/transponder.py @@ -13,8 +13,6 @@ # limitations under the License. - - from yattag import Doc, indent import logging @@ -156,4 +154,4 @@ def edit_optical_channel (resources:list[dict]): results.extend(create_optical_channel(resources=resources,ports=ports,config=config) ) - return results \ No newline at end of file + return results diff --git a/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py b/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py index b10ffde0e9f5689b7774896743e1222ad1c44612..e27fd923a4d3ec4a69b810667545d5bcae235269 100644 --- a/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py +++ b/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py @@ -1,4 +1,3 @@ - # Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,14 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import re,logging -import json +import re import lxml.etree as ET -from typing import Collection, Dict, Any - - - - def extract_channel_xmlns (data_xml:str,is_opticalband:bool): xml_bytes = data_xml.encode("utf-8") @@ -49,12 +42,8 @@ def extract_channel_xmlns (data_xml:str,is_opticalband:bool): if channels is not None: optical_channel_namespace = channels.tag.replace("optical-bands", "") namespace=optical_channel_namespace.replace("{", "").replace("}", "") - - return namespace - - def extract_optical_bands (data_xml:str,namespace:str): namespaces={"oc":namespace} xml_bytes = data_xml.encode("utf-8") @@ -64,10 +53,8 @@ def extract_optical_bands (data_xml:str,namespace:str): if optical_bands is not None : optical_bands_ele= optical_bands.findall('.//oc:optical-band',namespaces) - - + for optical_band in optical_bands_ele: - band_ele=optical_band.find('.//oc:name',namespaces) lower_freq_ele=optical_band.find('.//oc:lower-frequency',namespaces) upper_freq_ele=optical_band.find('.//oc:upper-frequency',namespaces) @@ -97,9 +84,7 @@ def extract_media_channels (data_xml:str): op_bands=[] if media_channels is not None : media_channels_ele= media_channels.findall('.//oc:channel',namespaces) - for optical_band in media_channels_ele: - band_ele=optical_band.find('.//oc:name',namespaces) lower_freq_ele=optical_band.find('.//oc:lower-frequency',namespaces) upper_freq_ele=optical_band.find('.//oc:upper-frequency',namespaces) @@ -119,62 +104,46 @@ def extract_media_channels (data_xml:str): 'channel_index':channel_index.text if channel_index is not None else None } op_bands.append(op_band_obj) - + return op_bands - - - def extract_roadm_ports_old (xml_data:str): - ports =[] pattern = r'\bMG_ON_OPTICAL_PORT_WAVEBAND\b' xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) with open('xml.log', 'w') as f: print(xml_bytes, file=f) - namespace = {'oc': 'http://openconfig.net/yang/platform'} ports = [] components = root.findall('.//oc:component',namespace) print(f"component {components}") - - + for component in components: - properties = component.find(".//oc:properties",namespace) - if (properties is not None): for property in properties : value = property.find(".//oc:value",namespace) - if (re.search(pattern,value.text)): name_element= component.find(".//oc:name",namespace) ports.append(name_element.text) return ports - def extract_roadm_ports (xml_data:str): - ports =[] pattern2=r'\bMG_ON_PORT_TYPE' pattern = r'\bMG_ON_OPTICAL_PORT_WAVEBAND\b' xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) - - namespace = {'oc': 'http://openconfig.net/yang/platform'} ports = [] components = root.findall('.//oc:component',namespace) #print(f"component {components}") - - + for component in components: - properties = component.find(".//oc:properties",namespace) - if (properties is not None): for property in properties : value = property.find(".//oc:value",namespace) @@ -184,50 +153,34 @@ def extract_roadm_ports (xml_data:str): name_element= component.find(".//oc:name",namespace) print('value',value.text) ports.append((name_element.text,value.text)) - return ports - - def roadm_values_extractor (data_xml:str,resource_keys:list,dic:dict): - ports_result=[] - ports = extract_roadm_ports(data_xml) - namespcae= extract_channel_xmlns(data_xml,True) - optical_bands=extract_optical_bands(data_xml=data_xml,namespace=namespcae) - media_cahannels=extract_media_channels(data_xml) - - - if len(ports)>0 : - for port in ports : - name,type=port - resource_key = '/endpoints/endpoint[{:s}]'.format(name) - resource_value = {'uuid': name, 'type':type} - - ports_result.append((resource_key, resource_value)) - - return [ports_result,optical_bands,media_cahannels] - - - - #/////////////// OpenRoadm ////////////// - - + ports_result=[] + ports = extract_roadm_ports(data_xml) + namespcae= extract_channel_xmlns(data_xml,True) + optical_bands=extract_optical_bands(data_xml=data_xml,namespace=namespcae) + media_cahannels=extract_media_channels(data_xml) + if len(ports)>0 : + for port in ports : + name,type=port + resource_key = '/endpoints/endpoint[{:s}]'.format(name) + resource_value = {'uuid': name, 'type':type} + ports_result.append((resource_key, resource_value)) + return [ports_result,optical_bands,media_cahannels] + +#/////////////// OpenRoadm ////////////// + def extract_roadm_circuits_pack (xml_data:str): - - xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) # with open('xml.log', 'w') as f: # print(xml_bytes, file=f) - - + namespace = {'oc': "http://org/openroadm/device"} - circuits = root.findall('.//oc:circuit-packs',namespace) - circuits_list =[] # print(f"component {components}") - if (circuits is not None): for circuit in circuits: circuit_info ={} @@ -240,20 +193,16 @@ def extract_roadm_circuits_pack (xml_data:str): slot= circuit.find("./oc:slot",namespace) shelf= circuit.find("./oc:shelf",namespace) ports = circuit.findall("./oc:ports",namespace) - - + if (ports is not None): - for port in ports : port_info={} port_name=port.find('./oc:port-name',namespace) port_qual= port.find("./oc:port-qual",namespace) - if port_name is not None : port_info["port_name"]=port_name.text if port_qual is not None : port_info["port_qual"]=port_qual.text - circuit_ports.append(port_info) if (circuit_name is not None): circuit_info["circuit_name"]=circuit_name.text @@ -269,17 +218,10 @@ def extract_roadm_circuits_pack (xml_data:str): circuit_info["slot"]=slot.text if (shelf is not None): circuit_info["shelf"]=shelf.text - circuit_info["ports"]=circuit_ports - circuits_list.append(circuit_info) - - - return circuits_list - - def extract_openroadm_info(xml_data:str): roadm_info={"node-id":None,"node-number":None,"node-type":None,'clli':None} xml_bytes = xml_data.encode("utf-8") @@ -300,7 +242,6 @@ def extract_openroadm_info(xml_data:str): roadm_info['node-type']=node_type.text if (clli is not None): roadm_info['clli']=clli.text - return roadm_info def openroadm_values_extractor (data_xml:str,resource_keys:list,dic:dict): @@ -309,19 +250,11 @@ def openroadm_values_extractor (data_xml:str,resource_keys:list,dic:dict): circuits_list = extract_roadm_circuits_pack(data_xml) dic["openroadm_info"]=openroadm_info dic["circuits"]=circuits_list - + for circuit in circuits_list : - for port in circuit['ports']: if port is not None and 'port_name' in port : resource_key = '/endpoints/endpoint[{:s}]'.format(port["port_name"]) resource_value = {'uuid': port["port_name"], 'type':port["port_qual"] if "port_qual" in port else None} ports_result.append((resource_key, resource_value)) return [dic,ports_result] - - - - - - - \ No newline at end of file diff --git a/src/device/service/drivers/oc_driver/templates/descovery_tool/transponders.py b/src/device/service/drivers/oc_driver/templates/descovery_tool/transponders.py index 2ad664b99443a7fca2e2e75b375d7b49748a16ba..e0ffc12ffd63f2e5b32ea4c7a813acee7d146c58 100644 --- a/src/device/service/drivers/oc_driver/templates/descovery_tool/transponders.py +++ b/src/device/service/drivers/oc_driver/templates/descovery_tool/transponders.py @@ -299,4 +299,3 @@ def transponder_values_extractor(data_xml:str,resource_keys:list,dic:dict): return [transceivers_dic,optical_channels_params,channel_namespace,endpoints,ports_result] - \ No newline at end of file