Skip to content
Snippets Groups Projects
Commit 6e4a8876 authored by Robert Latta's avatar Robert Latta
Browse files

Merge branch 'feature/DBOARD3-894' into develop

parents 55e891a2 cb8fb44c
No related branches found
No related tags found
No related merge requests found
import ipaddress
import logging import logging
import re import re
...@@ -70,3 +71,22 @@ def get_lags(config): ...@@ -70,3 +71,22 @@ def get_lags(config):
lags = config.findall('./n:configure/n:lag', namespaces=NS) lags = config.findall('./n:configure/n:lag', namespaces=NS)
for lag in lags: for lag in lags:
yield _lag_info(lag) yield _lag_info(lag)
def interface_addresses(config):
def _interface_info(e, _name):
for details_parent in e:
address = details_parent[0].text
prefix_length = details_parent[1].text
ip_string = f'{address}/{prefix_length}'
yield {
'name': ipaddress.ip_interface(ip_string).ip.exploded,
'interface address': ip_string,
'interface name': _name,
}
interfaces = config.findall('./n:configure/n:router/n:interface', namespaces=NS)
for interface in interfaces:
interface_name = interface.find('./n:interface-name', namespaces=NS).text
for element in interface.xpath('./n:ipv4|./n:ipv6', namespaces=NS):
yield from _interface_info(element, interface_name)
...@@ -659,11 +659,14 @@ def refresh_nokia_interface_list(hostname, netconf): ...@@ -659,11 +659,14 @@ def refresh_nokia_interface_list(hostname, netconf):
def _refresh_nokia_interface_list(hostname, netconf, redis, lab=False): def _refresh_nokia_interface_list(hostname, netconf, redis, lab=False):
bundles_keybase = f'netconf-interface-bundles:{hostname}' bundles_keybase = f'netconf-interface-bundles:{hostname}'
interfaces_all_key = f'netconf-interfaces-hosts:{hostname}'
if lab: if lab:
bundles_keybase = f'lab:{bundles_keybase}' bundles_keybase = f'lab:{bundles_keybase}'
interfaces_all_key = f'lab:{interfaces_all_key}'
logger.debug(f'removing cached netconf-interfaces for {hostname}') logger.debug(f'removing cached netconf-interfaces for {hostname}')
rp = redis.pipeline() rp = redis.pipeline()
rp.delete(interfaces_all_key)
for k in redis.scan_iter( for k in redis.scan_iter(
f'{bundles_keybase}:*', count=1000): f'{bundles_keybase}:*', count=1000):
rp.delete(k) rp.delete(k)
...@@ -673,6 +676,10 @@ def _refresh_nokia_interface_list(hostname, netconf, redis, lab=False): ...@@ -673,6 +676,10 @@ def _refresh_nokia_interface_list(hostname, netconf, redis, lab=False):
rp.set( rp.set(
f'{bundles_keybase}:{lag["name"]}', f'{bundles_keybase}:{lag["name"]}',
json.dumps(lag['ports'])) json.dumps(lag['ports']))
rp.set(
interfaces_all_key,
json.dumps(list(nokia.interface_addresses(netconf))))
rp.execute() rp.execute()
......
...@@ -152,8 +152,8 @@ class MockedRedis(object): ...@@ -152,8 +152,8 @@ class MockedRedis(object):
if isinstance(key, bytes): if isinstance(key, bytes):
key = key.decode('utf-8') key = key.decode('utf-8')
# redis ignores delete for keys that don't exist # redis ignores delete for keys that don't exist
# ... but in our test environment we don't expect this if key in MockedRedis.db:
del MockedRedis.db[key] del MockedRedis.db[key]
def scan_iter(self, glob=None, count='unused'): def scan_iter(self, glob=None, count='unused'):
if not glob: if not glob:
......
...@@ -2,7 +2,7 @@ import pathlib ...@@ -2,7 +2,7 @@ import pathlib
from lxml import etree from lxml import etree
from inventory_provider.nokia import get_lags from inventory_provider.nokia import get_lags, interface_addresses
netconf_doc = etree.parse(pathlib.Path(__file__).parent.joinpath( netconf_doc = etree.parse(pathlib.Path(__file__).parent.joinpath(
'data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml')) 'data/rt0.lon.uk.lab.office.geant.net-netconf-nokia.xml'))
...@@ -14,3 +14,12 @@ def test_get_lags(): ...@@ -14,3 +14,12 @@ def test_get_lags():
found_names = {lag['name'] for lag in lags} found_names = {lag['name'] for lag in lags}
expected_names = {'lag-1', 'lag-2', 'lag-3', 'lag-31'} expected_names = {'lag-1', 'lag-2', 'lag-3', 'lag-31'}
assert found_names == expected_names assert found_names == expected_names
def test_interface_addresses():
if_addresses = list(interface_addresses(netconf_doc))
assert len(if_addresses) == 9
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
import json import json
import pathlib import pathlib
import jsonschema
from lxml import etree from lxml import etree
from inventory_provider.tasks import common from inventory_provider.tasks import common
...@@ -851,10 +852,37 @@ def test_refresh_nokia_interface_list(mocked_redis, data_config): ...@@ -851,10 +852,37 @@ def test_refresh_nokia_interface_list(mocked_redis, data_config):
k = k.decode('utf-8') k = k.decode('utf-8')
bundles[k] = json.loads(r.get(k).decode('utf-8')) bundles[k] = json.loads(r.get(k).decode('utf-8'))
expected = { expected_bundles = {
f'{keybase}lag-1': ['1/1/c8/1', '1/1/c9/1'], f'{keybase}lag-1': ['1/1/c8/1', '1/1/c9/1'],
f'{keybase}lag-2': ['2/1/c8/1'], f'{keybase}lag-2': ['2/1/c8/1'],
f'{keybase}lag-3': ['1/1/c2/2'], f'{keybase}lag-3': ['1/1/c2/2'],
f'{keybase}lag-31': ['1/1/c2/1'], f'{keybase}lag-31': ['1/1/c2/1'],
} }
assert bundles == expected assert bundles == expected_bundles
interfaces = json.loads(r.get(
'lab:netconf-interfaces-hosts:rt0.lon.uk.lab.office.geant.net'
).decode('utf-8'))
assert len(interfaces) == 9
schema = {
'$schema': 'http://json-schema.org/draft-07/schema#',
'type': 'array',
'items': {
'type': 'object',
'properties': {
'name': {
'type': 'string'
},
'interface address': {
'type': 'string'
},
'interface name': {
'type': 'string'
}
},
'required': ['name', 'interface address', 'interface name'],
'additionalProperties': False
}
}
jsonschema.validate(interfaces, schema)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment