diff --git a/proto/context.proto b/proto/context.proto index 55a80470d40463742cc3e034ca9e933f4ff6c3f0..7c89d7c979dce8d07423a094cd501d558b9236d4 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -174,14 +174,30 @@ message Device { DeviceOperationalStatusEnum device_operational_status = 5; repeated DeviceDriverEnum device_drivers = 6; repeated EndPoint device_endpoints = 7; - repeated Component component = 8; // Used for inventory + map<string, Component> components = 8; // Used for inventory DeviceId controller_id = 9; // Identifier of node controlling the actual device } -message Component { - repeated string comp_string = 1; +message Component { //Defined previously to this section - Tested OK + Uuid uuid = 1; + string name = 2; + string type = 3; + repeated string child = 4; // list[sub-component.name] + map<string, string> attributes = 5; // dict[attr.name => json.dumps(attr.value)] +} + +message ComponentId { //NEW + DeviceId device_id = 1; + Uuid endpoint_uuid = 2; } +message ComponentIdList { //NEW + repeated ComponentId component_ids = 1; +} + + +// ----------------------------------------------------- + message DeviceConfig { repeated ConfigRule config_rules = 1; } diff --git a/src/context/service/database/Component.py b/src/context/service/database/Component.py new file mode 100644 index 0000000000000000000000000000000000000000..0d33bb9e0a82b9923a1c493239f25c3c9a6b4e99 --- /dev/null +++ b/src/context/service/database/Component.py @@ -0,0 +1,164 @@ + + + +# 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 datetime, json, logging +from sqlalchemy import delete +#from sqlalchemy.dialects import postgresql +from sqlalchemy.dialects.postgresql import insert +from sqlalchemy.orm import Session +from typing import Dict, List, Optional, Set +from common.proto.context_pb2 import Component +from common.proto.context_pb2 import ConfigRule +from common.tools.grpc.Tools import grpc_message_to_json_string +from .models.ComponentModel import ComponentModel +from .uuids._Builder import get_uuid_from_string +from .uuids.EndPoint import endpoint_get_uuid +from sqlalchemy.engine import Engine +from sqlalchemy.orm import Session, selectinload, sessionmaker +from sqlalchemy_cockroachdb import run_transaction +from common.proto.context_pb2 import ComponentIdList +from .models.ComponentModel import ComponentModel +from .uuids.Component import component_get_uuid +from .ConfigRule import compose_config_rules_data + +LOGGER = logging.getLogger(__name__) + +def compose_components_data( + components : List[Component], now : datetime.datetime, + device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None +) -> List[Dict]: + dict_components : List[Dict] = list() + for position,component in enumerate(components): + str_kind = component.WhichOneof('config_rule') + LOGGER.info("DATA") + message = (grpc_message_to_json_string(getattr(component, str_kind, {}))) + data = json.loads(message) + resource_key = data["resource_key"] + resource_value = data["resource_value"] + if '/inventory' in resource_key: + LOGGER.info('Parametros: KEY',resource_key,'Value',resource_value) + dict_component = { + 'data' : resource_value, + 'created_at': now, + 'updated_at': now, + } + + parent_kind,parent_uuid = '',None + if device_uuid is not None: + dict_component['device_uuid'] = device_uuid + parent_kind,parent_uuid = 'device',device_uuid + elif service_uuid is not None: + dict_component['service_uuid'] = service_uuid + parent_kind,parent_uuid = 'service',service_uuid + elif slice_uuid is not None: + dict_component['slice_uuid'] = slice_uuid + parent_kind,parent_uuid = 'slice',slice_uuid + else: + MSG = 'Parent for Component({:s}) cannot be identified '+\ + '(device_uuid={:s}, service_uuid={:s}, slice_uuid={:s})' + str_component = grpc_message_to_json_string(component) + raise Exception(MSG.format(str_component, str(device_uuid), str(service_uuid), str(slice_uuid))) + + + componenet_name = '{:s}:{:s}:{:s}'.format(parent_kind, 'custom', component.custom.resource_key) + + + component_uuid = get_uuid_from_string(componenet_name, prefix_for_name=parent_uuid) + dict_component['component_uuid'] = component_uuid + + dict_components.append(dict_component) + else: + continue + LOGGER.info('Parametros:',dict_components) + return dict_components + +''' +def upsert_components( + session : Session, components : List[Dict], is_delete : bool = False, + device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None, +) -> bool: + + if device_uuid is not None and service_uuid is None and slice_uuid is None: + klass = ComponentModel + + else: + MSG = 'DataModel cannot be identified (device_uuid={:s})' + raise Exception(MSG.format(str(device_uuid))) + + uuids_to_upsert : Dict[str, int] = dict() + rules_to_upsert : List[Dict] = list() + for component in components: + component_uuid = component['component_uuid'] + + position = uuids_to_upsert.get(component_uuid) + if position is None: + # if not added, add it + rules_to_upsert.append(component) + uuids_to_upsert[component_uuid] = len(rules_to_upsert) - 1 + else: + # if already added, update occurrence + rules_to_upsert[position] = component + + + upsert_affected = False + if len(rules_to_upsert) > 0: + stmt = insert(klass).values(rules_to_upsert) + stmt = stmt.on_conflict_do_update( + index_elements=[klass.component_uuid], + set_=dict( + data = stmt.excluded.data, + updated_at = stmt.excluded.updated_at, + ) + ) + stmt = stmt.returning(klass.created_at, klass.updated_at) + #str_stmt = stmt.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True}) + #LOGGER.warning('upsert stmt={:s}'.format(str(str_stmt))) + components_updates = session.execute(stmt).fetchall() + upsert_affected = any([(updated_at > created_at) for created_at,updated_at in components_updates]) + + return upsert_affected + + def component_list_names(db_engine: Engine, request: ComponentIdList) -> List[Dict]: + component_uuids = { + component_get_uuid(component_id, allow_random=False)[-1] + for component_id in request.component_ids + } + + def callback(session: Session) -> List[Dict]: + obj_list: List[ComponentModel] = session.query(ComponentModel)\ + .options(selectinload(ComponentModel.device))\ + .filter(ComponentModel.component_uuid.in_(component_uuids)).all() + return [obj.dump_name() for obj in obj_list] + + return run_transaction(sessionmaker(bind=db_engine), callback) + +def compose_components_data(data: Dict[str, any]) -> List[Dict]: + filtered_data = [] + + for item in data: + for key, value in item: + if any("inventory" in key): + filtered_data.append(item) + + LOGGER.info("Filtered Data:") + LOGGER.info(filtered_data) + + + + # Return the result + return filtered_data +''' \ No newline at end of file diff --git a/src/context/service/database/ConfigRule.py b/src/context/service/database/ConfigRule.py index c5b259a2dfc2ba684f6881dfb2a9a79b3a36032a..8a09e0b8c93a24c1a46e0edf16805106502dfd0e 100644 --- a/src/context/service/database/ConfigRule.py +++ b/src/context/service/database/ConfigRule.py @@ -34,6 +34,9 @@ def compose_config_rules_data( ) -> List[Dict]: dict_config_rules : List[Dict] = list() for position,config_rule in enumerate(config_rules): + + LOGGER.info("REQUEST") + LOGGER.info(position,config_rule) str_kind = config_rule.WhichOneof('config_rule') kind = ConfigRuleKindEnum._member_map_.get(str_kind.upper()) # pylint: disable=no-member dict_config_rule = { diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py index 8560399cc705729685cbaa7c10399a0ec7589015..67d8e9b0f7ba1f1a68981932388ab86f2b488025 100644 --- a/src/context/service/database/Device.py +++ b/src/context/service/database/Device.py @@ -26,12 +26,14 @@ from context.service.database.uuids.Topology import topology_get_uuid from .models.DeviceModel import DeviceModel from .models.EndPointModel import EndPointModel from .models.TopologyModel import TopologyDeviceModel +from .models.ComponentModel import ComponentModel from .models.enums.DeviceDriver import grpc_to_enum__device_driver from .models.enums.DeviceOperationalStatus import grpc_to_enum__device_operational_status from .models.enums.KpiSampleType import grpc_to_enum__kpi_sample_type from .uuids.Device import device_get_uuid from .uuids.EndPoint import endpoint_get_uuid from .ConfigRule import compose_config_rules_data, upsert_config_rules +from .Component import compose_components_data LOGGER = logging.getLogger(__name__) @@ -46,6 +48,7 @@ def device_list_objs(db_engine : Engine) -> List[Dict]: obj_list : List[DeviceModel] = session.query(DeviceModel)\ .options(selectinload(DeviceModel.endpoints))\ .options(selectinload(DeviceModel.config_rules))\ + .options(selectinload(DeviceModel.components))\ .all() #.options(selectinload(DeviceModel.components))\ return [obj.dump() for obj in obj_list] @@ -133,7 +136,8 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]: }) topology_uuids.add(endpoint_topology_uuid) - config_rules = compose_config_rules_data(request.device_config.config_rules, now, device_uuid=device_uuid) + components_data = compose_components_data(request.device_config.config_rules, now, device_uuid=device_uuid) + config_rules = compose_config_rules_data(request.device_config.config_rules, now, device_uuid=device_uuid) device_data = [{ 'device_uuid' : device_uuid, @@ -187,9 +191,26 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]: index_elements=[TopologyDeviceModel.topology_uuid, TopologyDeviceModel.device_uuid] )) + updated_components = False + + LOGGER.info("HERE ERRPR DEBUG") + LOGGER.info(components_data) + if len(components_data) > 0: + stmt = insert(ComponentModel).values(components_data) + stmt = stmt.on_conflict_do_update( + index_elements=[ComponentModel.component_uuid], + set_=dict( + data = stmt.excluded.data, + updated_at = stmt.excluded.updated_at, + ) + ) + stmt = stmt.returning(ComponentModel.created_at, ComponentModel.updated_at) + component_updates = session.execute(stmt).fetchall() + updated_components = any([(updated_at > created_at) for created_at,updated_at in component_updates]) + changed_config_rules = upsert_config_rules(session, config_rules, device_uuid=device_uuid) - return updated or updated_endpoints or changed_config_rules + return updated or updated_components or changed_config_rules updated = run_transaction(sessionmaker(bind=db_engine), callback) return json_device_id(device_uuid),updated diff --git a/src/context/service/database/models/ComponentModel.py b/src/context/service/database/models/ComponentModel.py new file mode 100644 index 0000000000000000000000000000000000000000..52ebf2fb5e6fac3dec23ee8b478bb72fc0fbc7c8 --- /dev/null +++ b/src/context/service/database/models/ComponentModel.py @@ -0,0 +1,51 @@ +# 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 json +from sqlalchemy import Column, DateTime, ForeignKey, String +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship +from typing import Dict +from ._Base import _Base + +class ComponentModel(_Base): #Inherited functionality from the base class _Base + __tablename__ = 'device_component' #Name of the table in the DB associtaed with this model + + component_uuid = Column(UUID(as_uuid=False), primary_key=True) #Unique identifier that serves as a primary key for this table + device_uuid = Column(ForeignKey('device.device_uuid',ondelete='CASCADE' ), nullable=False, index=True) #Foreign Key relationship with the field device_uuid from the Device table (CASCADE' behavior for deletion, meaning when a device is deleted, its components will also be dele) + # component_name = Column(String, nullable=False) #String field that stores the name of the component + data = Column(String, nullable=False) #String field that stores data about the component + created_at = Column(DateTime, nullable=False) #Stores the creaton timestamp for the component + updated_at = Column(DateTime, nullable=False) #Stores the last upadted timestamp for the component + + device = relationship('DeviceModel', back_populates='components')# lazy='selectin'#Defines a relationship between ComponentModel and DeviceModel + #Represents a 1:n relationship where 1 device -> N components // The relationship is defined by the FK device_uuid + def dump_id(self) -> Dict: + return{ + 'device_id' : self.device.dump_id(), + 'component_uuid': {'uuid': self.component_uuid}, + } + + def dump(self) -> Dict: + return { + 'component_id' : self.dump_id(), + 'data' : self.data, + } + + def dump_name(self) -> Dict: + return { + 'component_id' : self.dump_id(), + 'device_name' : self.device.device_name, + 'component_name': self.name, + } diff --git a/src/context/service/database/models/DeviceModel.py b/src/context/service/database/models/DeviceModel.py index 1097d0b9ab47a86c47ce2ad8394d067ae9f9953e..376dc98c4053f68c511a8c717117d58d9eda1cca 100644 --- a/src/context/service/database/models/DeviceModel.py +++ b/src/context/service/database/models/DeviceModel.py @@ -36,6 +36,7 @@ class DeviceModel(_Base): #topology_devices = relationship('TopologyDeviceModel', back_populates='device') config_rules = relationship('DeviceConfigRuleModel', passive_deletes=True) # lazy='joined', back_populates='device' endpoints = relationship('EndPointModel', passive_deletes=True) # lazy='joined', back_populates='device' + components = relationship('ComponentModel', passive_deletes=True) # lazy='joined', back_populates='device' controller = relationship('DeviceModel', remote_side=[device_uuid], passive_deletes=True) # lazy='joined', back_populates='device' def dump_id(self) -> Dict: @@ -55,7 +56,7 @@ class DeviceModel(_Base): ]} def dump_components(self) -> List[Dict]: - return [] + return [component.dump() for component in self.components] def dump(self, include_endpoints : bool = True, include_config_rules : bool = True, include_components : bool = True, @@ -70,5 +71,5 @@ class DeviceModel(_Base): } if include_endpoints: result['device_endpoints'] = self.dump_endpoints() if include_config_rules: result['device_config'] = self.dump_config_rules() - if include_components: result['component'] = self.dump_components() + if include_components: result['components'] = self.dump_components() return result diff --git a/src/context/service/database/models/_Base.py b/src/context/service/database/models/_Base.py index b87b9b06d6adc5825ab5dd84cf64347eb9c26f66..b325381f9320c0403f439812f1c13d8cf182f495 100644 --- a/src/context/service/database/models/_Base.py +++ b/src/context/service/database/models/_Base.py @@ -60,6 +60,9 @@ def create_performance_enhancers(db_engine : sqlalchemy.engine.Engine) -> None: index_storing('topology_context_uuid_rec_idx', 'topology', ['context_uuid'], [ 'topology_name', 'created_at', 'updated_at' ]), + index_storing('device_component_idx', 'device_component', ['device_uuid'], [ + 'data', 'created_at', 'updated_at' + ]), ] def callback(session : Session) -> bool: for stmt in statements: session.execute(stmt) diff --git a/src/context/service/database/uuids/Component.py b/src/context/service/database/uuids/Component.py new file mode 100644 index 0000000000000000000000000000000000000000..218cc793c78d90f1c57074654d8504b02babb800 --- /dev/null +++ b/src/context/service/database/uuids/Component.py @@ -0,0 +1,45 @@ +# 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. + +from typing import Tuple +from common.proto.context_pb2 import ComponentId +from common.method_wrappers.ServiceExceptions import InvalidArgumentsException +from ._Builder import get_uuid_from_string, get_uuid_random +from .Device import device_get_uuid + +def component_get_uuid( + component_id: ComponentId, component_name: str = '', allow_random: bool = False +) -> str: + device_uuid = device_get_uuid(component_id.device_id, allow_random=False) + raw_component_uuid = component_id.component_uuid.uuid + + if raw_component_uuid: + prefix_for_name = f'{device_uuid}' + return get_uuid_from_string(raw_component_uuid, prefix_for_name=prefix_for_name) + + if component_name: + prefix_for_name = f'{device_uuid}' + return get_uuid_from_string(component_name, prefix_for_name=prefix_for_name) + + if allow_random: + return get_uuid_random() + + raise InvalidArgumentsException( + [ + ('component_id.component_uuid.uuid', raw_component_uuid), + ('name', component_name), + ], + extra_details=['At least one is required to produce a Component UUID'] + ) + diff --git a/src/device/service/drivers/openconfig/templates/Interfaces.py b/src/device/service/drivers/openconfig/templates/Interfaces.py index 3855db17b45505d4131089b2b9abd995fa221419..8d1dcf16e7928eb648f56d519848310397cd4ba5 100644 --- a/src/device/service/drivers/openconfig/templates/Interfaces.py +++ b/src/device/service/drivers/openconfig/templates/Interfaces.py @@ -22,6 +22,7 @@ LOGGER = logging.getLogger(__name__) XPATH_INTERFACES = "//oci:interfaces/oci:interface" XPATH_SUBINTERFACES = ".//oci:subinterfaces/oci:subinterface" XPATH_IPV4ADDRESSES = ".//ociip:ipv4/ociip:addresses/ociip:address" +XPATH_IPV6ADDRESSES = ".//ociip:ipv6/ociip:addresses/ociip:address" def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: response = [] @@ -97,6 +98,15 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: #add_value_from_collection(subinterface, 'ipv4_addresses', ipv4_addresses) + for xml_ipv6_address in xml_subinterface.xpath(XPATH_IPV6ADDRESSES, namespaces=NAMESPACES): + #LOGGER.info('xml_ipv6_address = {:s}'.format(str(ET.tostring(xml_ipv6_address)))) + + address = xml_ipv6_address.find('ociip:state/ociip:ip', namespaces=NAMESPACES) + add_value_from_tag(subinterface, 'address_ipv6', address) + + prefix = xml_ipv6_address.find('ociip:state/ociip:prefix-length', namespaces=NAMESPACES) + add_value_from_tag(subinterface, 'address_prefix_v6', prefix, cast=int) + if len(subinterface) == 0: continue resource_key = '/interface[{:s}]/subinterface[{:s}]'.format(interface['name'], str(subinterface['index'])) response.append((resource_key, subinterface)) diff --git a/src/device/service/drivers/openconfig/templates/Interfaces_mng.py b/src/device/service/drivers/openconfig/templates/Interfaces_mng.py deleted file mode 100644 index ced1932523a4ed83afefa3c318135f1b92b7fb2b..0000000000000000000000000000000000000000 --- a/src/device/service/drivers/openconfig/templates/Interfaces_mng.py +++ /dev/null @@ -1,100 +0,0 @@ -# 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. - - -""" -#Method Name: parse - -#Parameters: - - - xml_data: [ET.Element] Represents the XML data to be parsed. - -# Functionality: - -The parse function of the interfaces_mng class has the functionality to parse -an XML document represented by the xml_data parameter and extract specific -information from the XML elements, namely the active interfaces with their name, -type, ipv4 and ipv6 addresses in case they have. - -To generate the template the following steps are performed: - -1) An empty list called response is created to store the results of the analysis. - -2) Iterate over the XML elements that match the pattern specified by the XPATH_PORTS -expression. These elements represent management interfaces in the XML document. - -3) For each management interfaces: -A dictionary called interfaces_mng is initialized that will store the information extracted -from the interfaces.The values of the relevant XML elements are extracted and added to -the dictionary. - -#Return: -List[Tuple[str, Dict[str, Any]]] The response list containing the tuples (path, dictionary) -with the information extracted from the XML document interfaces is returned. - -""" - - -import logging, lxml.etree as ET -from typing import Any, Dict, List, Tuple -from .Namespace import NAMESPACES -from .Tools import add_value_from_tag - -LOGGER = logging.getLogger(__name__) - -XPATH_PORTS = "//oci:interfaces/oci:interface" -XPATH_SUBINTERFACES = ".//oci:subinterfaces/oci:subinterface" -XPATH_IPV4ADDRESSES = ".//ociip:ipv4/ociip:addresses/ociip:address" -XPATH_IPV6ADDRESSES = ".//ociip:ipv6/ociip:addresses/ociip:address" - -def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: - response = [] - LOGGER.debug("Interfaces_mngPrueba") - - for xml_interface_mng in xml_data.xpath(XPATH_PORTS, namespaces=NAMESPACES): - LOGGER.info('xml_component xml_interfaces_mng = {:s}'.format(str(ET.tostring(xml_interface_mng)))) - interfaces_mng = {} - - interface_enabled = xml_interface_mng.find('oci:config/oci:enabled', namespaces=NAMESPACES) - if interface_enabled == None: - interface_enabled = xml_interface_mng.find('oci:state/oci:enabled', namespaces=NAMESPACES) - if interface_enabled == None: continue - if 'false' in interface_enabled or 'false' in interface_enabled.text: continue - - interface_name = xml_interface_mng.find('oci:name', namespaces=NAMESPACES) - if interface_name is None or interface_name.text is None: continue - add_value_from_tag(interfaces_mng, 'name', interface_name) - - interface_type = xml_interface_mng.find('oci:config/oci:type', namespaces=NAMESPACES) - if interface_type is None: - interface_type = xml_interface_mng.find('oci:state/oci:type', namespaces=NAMESPACES) - if interface_type is None: continue - interface_type.text = interface_type.text.replace('ianaift:','') - add_value_from_tag(interfaces_mng, 'type', interface_type) - - for xml_subinterface in xml_interface_mng.xpath(XPATH_SUBINTERFACES, namespaces=NAMESPACES): - for xml_ipv4_address in xml_subinterface.xpath(XPATH_IPV4ADDRESSES, namespaces=NAMESPACES): - address_ipv4 = xml_ipv4_address.find('ociip:state/ociip:ip', namespaces=NAMESPACES) - if not address_ipv4 is None: - add_value_from_tag(interfaces_mng, 'ipv4', address_ipv4) - - for xml_ipv6_address in xml_subinterface.xpath(XPATH_IPV6ADDRESSES, namespaces=NAMESPACES): - address_ipv6 = xml_ipv6_address.find('ociip:state/ociip:ip', namespaces=NAMESPACES) - if not address_ipv6 is None: - add_value_from_tag(interfaces_mng, 'ipv6', address_ipv6) - if not 'ipv4' in interfaces_mng and not 'ipv6' in interfaces_mng: - if 'ip' in interfaces_mng['type'] or 'Loopback' in interfaces_mng['type']: continue - response.append(('/interfaces_mng/{:s}'.format(interfaces_mng['name']), interfaces_mng)) - - return response diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py index 3dde94fc50cb215c11210cf1906e217038c2564c..87eea1f0b6673c4bff3222598d81a16b383b4c3b 100644 --- a/src/device/service/drivers/openconfig/templates/__init__.py +++ b/src/device/service/drivers/openconfig/templates/__init__.py @@ -20,10 +20,9 @@ from jinja2 import Environment, PackageLoader, select_autoescape import paramiko from .Tools import generate_templates from device.service.driver_api._Driver import ( - RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_INTERFACES_MNG,RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_ACL, RESOURCE_INVENTORY) + RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_ACL, RESOURCE_INVENTORY) from .EndPoints import parse as parse_endpoints from .Interfaces import parse as parse_interfaces, parse_counters -from .Interfaces_mng import parse as parse_interfaces_mng from .NetworkInstances import parse as parse_network_instances from .RoutingPolicy import parse as parse_routing_policy from .Acl import parse as parse_acl @@ -34,7 +33,6 @@ ALL_RESOURCE_KEYS = [ RESOURCE_INVENTORY, RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, - RESOURCE_INTERFACES_MNG, RESOURCE_ROUTING_POLICIES, # routing policies should come before network instances RESOURCE_NETWORK_INSTANCES, RESOURCE_ACL, @@ -44,7 +42,6 @@ RESOURCE_KEY_MAPPINGS = { RESOURCE_INVENTORY : 'inventory', RESOURCE_ENDPOINTS : 'component', RESOURCE_INTERFACES : 'interface', - RESOURCE_INTERFACES_MNG : 'interfaces_mng', RESOURCE_NETWORK_INSTANCES: 'network_instance', RESOURCE_ROUTING_POLICIES : 'routing_policy', RESOURCE_ACL : 'acl', @@ -54,7 +51,6 @@ RESOURCE_PARSERS = { 'inventory' : parse_inventory, 'component' : parse_endpoints, 'interface' : parse_interfaces, - 'interfaces_mng' : parse_interfaces_mng, 'network_instance': parse_network_instances, 'routing_policy' : parse_routing_policy, 'interfaces/interface/state/counters': parse_counters, diff --git a/src/device/service/drivers/openconfig/templates/interfaces_mng/get.xml b/src/device/service/drivers/openconfig/templates/interfaces_mng/get.xml deleted file mode 100644 index 1003bff154619cedd3e8aecb9d3044aac0b6a0a3..0000000000000000000000000000000000000000 --- a/src/device/service/drivers/openconfig/templates/interfaces_mng/get.xml +++ /dev/null @@ -1,3 +0,0 @@ -<interfaces xmlns="http://openconfig.net/yang/interfaces"> - <interface/> -</interfaces> \ No newline at end of file