diff --git a/inventory_provider/nokia.py b/inventory_provider/nokia.py index cfa7260687febfc3b8c7cf60315b6e3399b28c81..d303fd7878719d4f3cd439ed789dea0aed9ecb9f 100644 --- a/inventory_provider/nokia.py +++ b/inventory_provider/nokia.py @@ -1,3 +1,4 @@ +from lxml import etree import logging import re @@ -5,16 +6,6 @@ from ncclient import manager, xml_ logger = logging.getLogger(__name__) - -ROOT_NS = 'urn:ietf:params:xml:ns:netconf:base:1.0' -NOKIA_NS = 'urn:nokia.com:sros:ns:yang:sr:conf' -NOKIA_STATE_NS = 'urn:nokia.com:sros:ns:yang:sr:state' -NS = { - 'r': ROOT_NS, - 'n': NOKIA_NS, - 's': NOKIA_STATE_NS, -} - BREAKOUT_PATTERN = re.compile( r'c(?P<count>\d+)-(?P<speed>\d+)(?P<unit>[a-zA-Z]+)' ) @@ -90,6 +81,13 @@ STATE_FILTER = '''<filter> </filter>''' +def remove_xml_namespaces(etree_doc): + for elem in etree_doc.iter(): + elem.tag = etree.QName(elem).localname + etree.cleanup_namespaces(etree_doc) + return etree_doc + + def load_docs(hostname, ssh_params): """ Load the running and state docs for the given hostname @@ -113,34 +111,33 @@ def load_docs(hostname, ssh_params): # which is of type ncclient.operations.retrieve.GetReply and has a data property running = xml_.to_ele(m.get_config(source='running').data_xml).getchildren()[0] state = xml_.to_ele(m.get(filter=STATE_FILTER).data_xml).getchildren()[0] - return running, state + return remove_xml_namespaces(running), remove_xml_namespaces(state) def get_ports_state(state_doc): def _port_info(e): pi = { - 'port-id': e.find('s:port-id', namespaces=NS).text, - 'oper-state': e.find('s:oper-state', namespaces=NS).text, - 'port-state': e.find('s:port-state', namespaces=NS).text, - 'type': e.find('s:type', namespaces=NS).text, - 'if-index': e.find('s:if-index', namespaces=NS).text, + 'port-id': e.find('port-id').text, + 'oper-state': e.find('oper-state').text, + 'port-state': e.find('port-state').text, + 'type': e.find('type').text, + 'if-index': e.find('if-index').text, } - down_reason = e.find('s:down-reason', namespaces=NS) + down_reason = e.find('down-reason') if down_reason is not None: pi['down-reason'] = down_reason.text return pi - ports = state_doc.findall('./s:state/s:port', namespaces=NS) - for port in ports: + for port in state_doc.xpath('./state/port'): yield _port_info(port) def get_lags_state(state_doc): def _lag_info(e): - _name = e.find('s:lag-name', namespaces=NS).text - _state = e.find('s:oper-state', namespaces=NS).text - _if_index = e.find('s:if-index', namespaces=NS).text - _number_port_up = e.find('s:number-port-up', namespaces=NS).text - ports = [p.find('s:port-id', namespaces=NS).text for p in e.findall('s:port', namespaces=NS)] + _name = e.find('lag-name').text + _state = e.find('oper-state').text + _if_index = e.find('if-index').text + _number_port_up = e.find('number-port-up').text + ports = [p.find('port-id').text for p in e.findall('port')] return { 'name': _name, 'oper-state': _state, @@ -148,40 +145,38 @@ def get_lags_state(state_doc): 'number-port-up': _number_port_up, 'ports': ports, } - lags = state_doc.findall('./s:state/s:lag', namespaces=NS) - for lag in lags: + for lag in state_doc.findall('./state/lag'): yield _lag_info(lag) def get_interfaces_state(state_doc): - interfaces = state_doc.findall('./s:state/s:router/s:interface', namespaces=NS) - for interface_ in interfaces: + for interface_ in state_doc.findall('./state/router/interface'): details = { - "interface-name": interface_.find('s:interface-name', namespaces=NS).text, - "if-index": int(interface_.find('s:if-index', namespaces=NS).text), - "oper-state": interface_.find('s:oper-state', namespaces=NS).text, + "interface-name": interface_.find('interface-name').text, + "if-index": int(interface_.find('if-index').text), + "oper-state": interface_.find('oper-state').text, } - ipv4 = interface_.find('s:ipv4', namespaces=NS) + ipv4 = interface_.find('ipv4') if ipv4 is not None: - details['ipv4-state'] = ipv4.find('s:oper-state', namespaces=NS).text - ipv6 = interface_.find('s:ipv6', namespaces=NS) + details['ipv4-state'] = ipv4.find('oper-state').text + ipv6 = interface_.find('ipv6') if ipv6 is not None: - details['ipv6-state'] = ipv6.find('s:oper-state', namespaces=NS).text + details['ipv6-state'] = ipv6.find('oper-state').text yield details def get_ports_config(netconf_config): def _port_info(e): pi = { - 'port-id': e.find('n:port-id', namespaces=NS).text + 'port-id': e.find('port-id').text } - admin_state = e.find('n:admin-state', namespaces=NS) + admin_state = e.find('admin-state') pi['admin-state'] = admin_state.text if admin_state is not None else 'enabled' # assume enabled if not present - description = e.find('n:description', namespaces=NS) + description = e.find('description') pi['description'] = description.text if description is not None else '' - breakout = e.find('./n:connector/n:breakout', namespaces=NS) + breakout = e.find('./connector/breakout') if breakout is not None: breakout = breakout.text breakout_match = BREAKOUT_PATTERN.match(breakout) @@ -192,10 +187,9 @@ def get_ports_config(netconf_config): return pi # making the assumption that the breakout ports are listed directly before their - # child ports - ports = netconf_config.findall('./n:configure/n:port', namespaces=NS) current_parent_port = None - for port in ports: + # child ports + for port in netconf_config.findall('./configure/port'): port_info = _port_info(port) if 'breakout' in port_info: current_parent_port = port_info @@ -213,12 +207,12 @@ def get_lags_config(netconf_config): } def _lag_info(e): - _name = e.find('./n:lag-name', namespaces=NS).text + _name = e.find('./lag-name').text - port_elements = e.findall('./n:port', namespaces=NS) - port_ids = (p.find('./n:port-id', namespaces=NS).text for p in port_elements) - admin_state = e.find('./n:admin-state', namespaces=NS) - description_e = e.find('n:description', namespaces=NS) + port_elements = e.findall('./port') + port_ids = (p.find('./port-id').text for p in port_elements) + admin_state = e.find('./admin-state') + description_e = e.find('description') ifc = { 'name': _name, 'description': ( @@ -229,36 +223,32 @@ def get_lags_config(netconf_config): } return ifc - lags = netconf_config.findall('./n:configure/n:lag', namespaces=NS) - for lag in lags: + for lag in netconf_config.findall('./configure/lag'): yield _lag_info(lag) def get_interfaces_config(netconf_config): - - interfaces = netconf_config.findall( - 'n:configure/n:router/n:interface', namespaces=NS) - for interface in interfaces: + for interface in netconf_config.findall('configure/router/interface'): details = { - "interface-name": interface.find('n:interface-name', namespaces=NS).text, + "interface-name": interface.find('interface-name').text, "ipv4": [], "ipv6": [], } - description = interface.find('n:description', namespaces=NS) + description = interface.find('description') details["description"] = description.text if description is not None else "" - admin_state = interface.find('n:admin-state', namespaces=NS) + admin_state = interface.find('admin-state') if admin_state is not None: details["admin-state"] = admin_state.text - for element in interface.xpath('n:ipv4/n:primary | n:ipv4/n:secondary', namespaces=NS): - address = element.find('n:address', namespaces=NS).text - prefix_length = element.find('n:prefix-length', namespaces=NS).text + for element in interface.xpath('ipv4/primary | ipv4/secondary'): + address = element.find('address').text + prefix_length = element.find('prefix-length').text details["ipv4"].append(f'{address}/{prefix_length}') - for element in interface.xpath('n:ipv6/n:address', namespaces=NS): - address = element.find('n:ipv6-address', namespaces=NS).text - prefix_length = element.find('n:prefix-length', namespaces=NS).text + for element in interface.xpath('ipv6/address'): + address = element.find('ipv6-address').text + prefix_length = element.find('prefix-length').text details["ipv6"].append(f'{address}/{prefix_length}') yield details diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index e58e997603a43feba239681871513d5f99c1d791..bf95aab9a08fdce57ad68606b3eaa58d64028a21 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -650,8 +650,8 @@ def retrieve_and_persist_config_nokia( f'Nokia doc error with {hostname}' f' and no cached data found for {failed_docs}' ) - netconf_config = etree.fromstring(netconf_str) - state = etree.fromstring(state_str) + netconf_config = nokia.remove_xml_namespaces(etree.fromstring(netconf_str)) + state = nokia.remove_xml_namespaces(etree.fromstring(state_str)) update_callback(f'Returning cached nokia data for {hostname}') else: netconf_str = etree.tostring(netconf_config) diff --git a/test/data/DBOARD3-965/rt0.ams.nl.geant.net-netconf.xml b/test/data/nokia/rt0.ams.nl.geant.net-netconf.xml similarity index 98% rename from test/data/DBOARD3-965/rt0.ams.nl.geant.net-netconf.xml rename to test/data/nokia/rt0.ams.nl.geant.net-netconf.xml index 5b1d0d6f5f8daedd02863a4c6c9474f473ab6b1f..b4ae02720650258ec37b6df48427d9c3c0e857f8 100644 --- a/test/data/DBOARD3-965/rt0.ams.nl.geant.net-netconf.xml +++ b/test/data/nokia/rt0.ams.nl.geant.net-netconf.xml @@ -1068,6 +1068,22 @@ <port-id>1/1/c5/1</port-id> </port> </lag> + <lag> + <lag-name>lag-RL</lag-name> + <admin-state>enable</admin-state> + <description>LAG INFRASTRUCTURE BACKBONE $GA-01915 | </description> + <mode>network</mode> + <lacp> + <mode>active</mode> + <administrative-key>8</administrative-key> + </lacp> + <port> + <port-id>9/1/c1/1</port-id> + </port> + <port> + <port-id>9/1/c5/1</port-id> + </port> + </lag> <log> <file> <file-policy-name>20</file-policy-name> @@ -1345,6 +1361,34 @@ </lldp> </ethernet> </port> + <port> + <port-id>9/1/c1</port-id> + <admin-state>enable</admin-state> + <connector> + <breakout>c1-400g</breakout> + </connector> + </port> + <port> + <port-id>9/1/c1/1</port-id> + <admin-state>enable</admin-state> + <description>ADDED TO DOC MANUALLY FOR TEST - also added above port (9/1/c1)</description> + <ethernet> + <mode>network</mode> + <mtu>9212</mtu> + <lldp> + <dest-mac> + <mac-type>nearest-bridge</mac-type> + <receive>true</receive> + <transmit>true</transmit> + <tx-tlvs> + <port-desc>true</port-desc> + <sys-name>true</sys-name> + <sys-cap>true</sys-cap> + </tx-tlvs> + </dest-mac> + </lldp> + </ethernet> + </port> <port> <port-id>1/1/c2</port-id> <admin-state>enable</admin-state> @@ -1380,6 +1424,27 @@ <breakout>c1-400g</breakout> </connector> </port> + <port> + <port-id>9/1/c5/1</port-id> + <admin-state>disable</admin-state> + <description>ADDED AND DISABLED MANUALLY FOR TEST</description> + <ethernet> + <mode>network</mode> + <mtu>9212</mtu> + <lldp> + <dest-mac> + <mac-type>nearest-bridge</mac-type> + <receive>true</receive> + <transmit>true</transmit> + <tx-tlvs> + <port-desc>true</port-desc> + <sys-name>true</sys-name> + <sys-cap>true</sys-cap> + </tx-tlvs> + </dest-mac> + </lldp> + </ethernet> + </port> <port> <port-id>1/1/c5/1</port-id> <admin-state>enable</admin-state> diff --git a/test/data/DBOARD3-965/rt0.fra.de.geant.net-netconf.xml b/test/data/nokia/rt0.fra.de.geant.net-netconf.xml similarity index 100% rename from test/data/DBOARD3-965/rt0.fra.de.geant.net-netconf.xml rename to test/data/nokia/rt0.fra.de.geant.net-netconf.xml diff --git a/test/data/DBOARD3-965/rt0.gen.ch.geant.net-netconf.xml b/test/data/nokia/rt0.gen.ch.geant.net-netconf.xml similarity index 100% rename from test/data/DBOARD3-965/rt0.gen.ch.geant.net-netconf.xml rename to test/data/nokia/rt0.gen.ch.geant.net-netconf.xml diff --git a/test/data/DBOARD3-965/rt0.lon.uk.geant.net-netconf.xml b/test/data/nokia/rt0.lon.uk.geant.net-netconf.xml similarity index 100% rename from test/data/DBOARD3-965/rt0.lon.uk.geant.net-netconf.xml rename to test/data/nokia/rt0.lon.uk.geant.net-netconf.xml diff --git a/test/data/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml b/test/data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml similarity index 100% rename from test/data/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml rename to test/data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml diff --git a/test/data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml b/test/data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml similarity index 100% rename from test/data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml rename to test/data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml diff --git a/test/data/DBOARD3-965/rt0.lon2.uk.geant.net-netconf.xml b/test/data/nokia/rt0.lon2.uk.geant.net-netconf.xml similarity index 100% rename from test/data/DBOARD3-965/rt0.lon2.uk.geant.net-netconf.xml rename to test/data/nokia/rt0.lon2.uk.geant.net-netconf.xml diff --git a/test/test_nokia.py b/test/test_nokia.py index b1a410ea1bc21ccee4daad1c4ab2f40d9f505384..5928af89f939e7610d3f712e92c606eb80d107ca 100644 --- a/test/test_nokia.py +++ b/test/test_nokia.py @@ -1,61 +1,123 @@ +import os import pathlib -from copy import deepcopy +from functools import lru_cache +import pytest from lxml import etree - -from inventory_provider.nokia import get_lags_config, get_interfaces_config, \ - get_ports_config, get_ports_state, get_lags_state, get_interfaces_state, NS - -netconf_doc = etree.parse(pathlib.Path(__file__).parent.joinpath( - 'data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml')) -state_doc = etree.parse(pathlib.Path(__file__).parent.joinpath( - 'data/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml')) - - -def test_get_lags(): - lags = {lag['name']: lag for lag in get_lags_config(netconf_doc)} - found_names = set(lags.keys()) - expected_names = {'lag-1', 'lag-2', 'lag-3', 'lag-31'} - assert found_names == expected_names - expected_bundles = { - 'lag-1': ['1/1/c8/1', '1/1/c9/1'], - 'lag-2': ['2/1/c8/1'], - 'lag-3': ['1/1/c2/2'], - 'lag-31': ['1/1/c2/1'], - } +import jsonschema + +from inventory_provider import nokia + + +PORT_SCHEMA = { + '$schema': 'https://json-schema.org/draft-07/schema#', + 'type': 'object', + 'properties': { + 'port-id': {'type': 'string'}, + 'admin-state': {'type': 'string'}, + 'description': {'type': 'string'}, + 'speed': {'type': 'integer'}, + 'speed-unit': {'type': 'string', 'enum': ['Gbps', 'Unknown']} + }, + 'required': ['port-id', 'description', 'admin-state'], + 'additionalProperties': True +} + + +@lru_cache +def _load_xml_doc(filename): + full_filename = os.path.join( + os.path.dirname(__file__), + 'data', + 'nokia', + filename) + return nokia.remove_xml_namespaces(etree.parse(full_filename)) + + +def _load_netconf_config(hostname): + return _load_xml_doc(f'{hostname}-netconf.xml') + + +def _load_state_doc(hostname): + return _load_xml_doc(f'{hostname}-state.xml') + + +state_doc = nokia.remove_xml_namespaces(etree.parse(pathlib.Path(__file__).parent.joinpath( + 'data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia-state.xml'))) + + +@pytest.mark.parametrize('hostname,expected_bundles', [ + ('rt0.ams.nl.geant.net', { + 'lag-5': ['1/1/c19/1', '2/1/c19/1'], + 'lag-8': ['1/1/c1/1', '1/1/c5/1'], + 'lag-RL': ['9/1/c1/1']}), + ('rt0.fra.de.geant.net', {'lag-1': ['1/1/c2/1', '1/1/c2/2']}), + ('rt0.gen.ch.geant.net', {'lag-1': ['1/1/c2/1', '1/1/c2/2']}), + ('rt0.lon.uk.geant.net', {'lag-1': ['1/1/c2/1', '1/1/c2/2']}), + ('rt0.lon2.uk.geant.net', {'lag-1': ['2/1/c2/1', '2/1/c2/2']}), +]) +def test_get_lags(hostname, expected_bundles): + netconf_doc = _load_netconf_config(hostname) + lags = {lag['name']: lag for lag in nokia.get_lags_config(netconf_doc)} + assert set(lags.keys()) == set(expected_bundles.keys()) for ex_name, ex_ports in expected_bundles.items(): assert lags[ex_name]['ports'] == ex_ports - netconf_copy = deepcopy(netconf_doc) - for p in netconf_copy.findall('./n:configure/n:port', namespaces=NS): - if p.find('n:port-id', namespaces=NS).text == '1/1/c9/1': - e = p.find('n:admin-state', namespaces=NS) - e.text = 'disable' - break - lags = {lag['name']: lag for lag in get_lags_config(netconf_copy)} - assert lags['lag-1']['ports'] == ['1/1/c8/1'] - - -def test_interface_info(): - if_addresses = list(get_interfaces_config(netconf_doc)) - found_names = {_interface['interface-name'] for _interface in if_addresses} - expected_names = {'lag-1.0', 'lag-2.0', 'system', 'to_rt0_ams_ZR-INFINERA', - 'to_rt0_ams_ZR-NOKIA'} - assert found_names == expected_names -def test_get_ports(): - ports = list(get_ports_config(netconf_doc)) - found_port_ids = {port['port-id'] for port in ports} - expected_ports = { - '1/1/c2', '1/1/c2/1', '1/1/c2/2', '1/1/c2/3', '1/1/c7', '1/1/c7/1', - '1/1/c8', '1/1/c8/1', '1/1/c9', '1/1/c9/1', '1/1/c13', '1/1/c13/1', - '2/1/c7', '2/1/c7/1', '2/1/c8', '2/1/c8/1', '2/1/c13', '2/1/c13/1', - } - assert found_port_ids == expected_ports +@pytest.mark.parametrize( + 'hostname,all_expected_data', [ + ('rt0.ams.nl.geant.net', ( + ('lag-5.0', {'62.40.98.39/31'}, {'2001:798:cc::62/126'}), + ('lag-8.0', {'62.40.98.20/31'}, {'2001:798:cc::21/126'}), + ('system', {'62.40.96.16/32'}, {'2001:798:aa:1::8/128'}), + )), + ('rt0.fra.de.geant.net', ( + ('lag-1.0', {'62.40.98.73/31'}, {'2001:798:cc::72/126'}), + ('system', {'62.40.96.26/32'}, {'2001:798:aa:1::a/128'}), + )), + ('rt0.gen.ch.geant.net', ( + ('lag-1.0', {'62.40.98.77/31'}, {'2001:798:cc::7a/126'}), + ('system', {'62.40.96.29/32'}, {'2001:798:aa:1::20/128'}), + )), + ('rt0.lon.uk.geant.net', ( + ('lag-1.0', {'62.40.98.60/31'}, {'2001:798:cc::65/126'}), + ('system', {'62.40.96.21/32'}, {'2001:798:aa:1::9/128'}), + )), + ('rt0.lon2.uk.geant.net', ( + ('lag-1.0', {'62.40.98.62/31'}, {'2001:798:cc::69/126'}), + ('system', {'62.40.96.25/32'}, {'2001:798:aa:1::b/128'}), + )), + ]) +def test_interface_info(hostname, all_expected_data): + netconf_doc = nokia.remove_xml_namespaces(_load_netconf_config(hostname=hostname)) + interfaces_by_id = {ifc['interface-name']: ifc for ifc in + nokia.get_interfaces_config(netconf_doc)} + assert len(interfaces_by_id) == len(all_expected_data) + for expected_data in all_expected_data: + ifc = interfaces_by_id[expected_data[0]] + assert ifc['interface-name'] == expected_data[0] + assert set(ifc['ipv4']) == expected_data[1] + assert set(ifc['ipv6']) == expected_data[2] + + +@pytest.mark.parametrize('hostname,port_count', [ + ('rt0.ams.nl.geant.net', 66), + ('rt0.fra.de.geant.net', 58), + ('rt0.gen.ch.geant.net', 141), + ('rt0.lon.uk.geant.net', 58), + ('rt0.lon2.uk.geant.net', 139), +]) +def test_get_ports(hostname, port_count): + netconf_doc = nokia.remove_xml_namespaces(_load_netconf_config(hostname=hostname)) + ports = list(nokia.get_ports_config(netconf_doc)) + + assert len(ports) == port_count + for port in ports: + jsonschema.validate(port, PORT_SCHEMA) def test_get_port_state(): - ports = {p['port-id']: p for p in get_ports_state(state_doc)} + ports = {p['port-id']: p for p in nokia.get_ports_state(state_doc)} assert len(ports) == 197 found_port_ids = {p_id for p_id in ports} ports_sample = { @@ -73,7 +135,7 @@ def test_get_port_state(): def test_get_lag_state(): - lags = {x['name']: x for x in get_lags_state(state_doc)} + lags = {x['name']: x for x in nokia.get_lags_state(state_doc)} found_names = {lag_name for lag_name in lags} expected_names = {'lag-1', 'lag-2', 'lag-3'} assert found_names == expected_names @@ -82,7 +144,7 @@ def test_get_lag_state(): def test_get_interface_state(): - interfaces = {x['interface-name']: x for x in get_interfaces_state(state_doc)} + interfaces = {x['interface-name']: x for x in nokia.get_interfaces_state(state_doc)} found_names = {interface_name for interface_name in interfaces} expected_names = {'system', 'lag-1.0', 'lag-2.0', 'lag-3.0', 'exfo400', 'guy', 'exfo400-100', 'management'} @@ -93,7 +155,7 @@ def test_get_interface_state(): def test_snmp_index(): - interfaces = get_interfaces_state(state_doc) + interfaces = nokia.get_interfaces_state(state_doc) expected = { "system": 1, "lag-1.0": 2, diff --git a/test/test_nokia_data_tmp.py b/test/test_nokia_data_tmp.py deleted file mode 100644 index ad3510047acb9af1d639ff1931831395c18198a1..0000000000000000000000000000000000000000 --- a/test/test_nokia_data_tmp.py +++ /dev/null @@ -1,29 +0,0 @@ -import os - -from lxml import etree -import pytest - -from inventory_provider import nokia - - -def _load_netconf_config(hostname): - filename = os.path.join( - os.path.dirname(__file__), - 'data', - 'DBOARD3-965', - f'{hostname}-netconf.xml') - with open(filename) as f: - return etree.fromstring(f.read()) - - -@pytest.mark.parametrize( - 'nokia_router_hostname', [ - 'rt0.lon2.uk.geant.net', - 'rt0.lon.uk.geant.net', - 'rt0.gen.ch.geant.net', - 'rt0.fra.de.geant.net', - 'rt0.ams.nl.geant.net']) -def test_DBOARD3_965(nokia_router_hostname): - netconf_doc = _load_netconf_config(hostname=nokia_router_hostname) - for ifc in nokia.get_interfaces_config(netconf_doc): - assert ifc['interface-name'] # trivial sanity check, TODO: proper test diff --git a/test/test_worker.py b/test/test_worker.py index 0cad8a59947a86c0a438629d4bfff52741f57a57..fbc5e6c599007a18092ef9e341b25685ffcd7ad5 100644 --- a/test/test_worker.py +++ b/test/test_worker.py @@ -4,6 +4,7 @@ import pathlib import jsonschema from lxml import etree +from inventory_provider.nokia import remove_xml_namespaces from inventory_provider.tasks import common from inventory_provider.tasks.worker import populate_error_report_interfaces_cache, transform_ims_data, \ extract_ims_data, persist_ims_data, \ @@ -847,8 +848,8 @@ def test_populate_poller_interfaces_cache( def test_refresh_nokia_interface_list(mocked_redis, data_config): - netconf_config = etree.parse(pathlib.Path(__file__).parent.joinpath( - 'data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml')) + netconf_config = remove_xml_namespaces(etree.parse(pathlib.Path(__file__).parent.joinpath( + 'data/nokia/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml'))) r = common._get_redis(data_config) refresh_nokia_interface_list('rt0.lon.uk.lab.office.geant.net', netconf_config, r, True) keybase = 'lab:netconf-interface-bundles:rt0.lon.uk.lab.office.geant.net:'