diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 863f1f0cbb2c50fc44d7b8685631b2f18b5e3115..143960335200928d8b9e14edb14f7a2f0eea65a5 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -43,16 +43,10 @@ def after_request(resp): return common.after_request(resp) -def base_interface_name(interface): - m = re.match(r'(.*?)(\.\d+)?$', interface) - assert m # sanity: anything should match - return m.group(1) - - def related_interfaces(hostname, interface): r = common.get_current_redis() prefix = 'netconf-interfaces:%s:' % hostname - for k in r.keys(prefix + base_interface_name(interface) + '.*'): + for k in r.keys(prefix + interface + '.*'): k = k.decode('utf-8') assert k.startswith(prefix) # sanity assert len(k) > len(prefix) # sanity (contains at least an interface) @@ -93,33 +87,12 @@ def get_juniper_link_info(source_equipment, interface): result = {} top_level_services = [] - def _get_top_level_services(circuit_id): - tls = [] - results = r.get("opsdb:services:children:{}".format(circuit_id)) - if results: - results = json.loads(results.decode('utf-8')) - - for c in results: - if circuit_id == c['child_circuit_id']: - tls.append( - {'name': c['parent_circuit'], - 'status': c['parent_circuit_status']}) - else: - temp_parents = \ - _get_top_level_services(c['child_circuit_id']) - if not temp_parents: - tls.append( - {'name': c['parent_circuit'], - 'status': c['parent_circuit_status']}) - tls.extend(temp_parents) - return tls - services = r.get( 'opsdb:interface_services:%s:%s' % (source_equipment, interface)) if services: result['services'] = json.loads(services.decode('utf=8')) for s in result['services']: - top_level_services.extend(_get_top_level_services(s['id'])) + top_level_services.extend(get_top_level_services(s['id'], r)) ifc_info = r.get( 'netconf-interfaces:%s:%s' % (source_equipment, interface)) @@ -140,26 +113,21 @@ def get_juniper_link_info(source_equipment, interface): for related in related_interfaces(source_equipment, interface): rs = r.get('opsdb:interface_services:%s:%s' % (source_equipment, related)) + all_rs = [] if rs: for s in json.loads(rs.decode('utf-8')): top_level_services.extend( - _get_top_level_services(s['id'])) - yield {'name': s['name'], 'status': s['status']} + get_top_level_services(s['id'], r)) + if s['circuit_type'].lower() == 'service': + all_rs.append( + {'name': s['name'], 'status': s['status']}) + return all_rs - related_services = list(_related_services()) + related_services = _related_services() if related_services: related_services.extend(top_level_services) result['related-services'] = related_services - # no longer possible, now that at least 'interface' is - # returned for unknown interfaces - # if not result: - # return Response( - # response="no available info for {} {}".format( - # source_equipment, interface), - # status=404, - # mimetype="text/html") - result = json.dumps(result) # cache this data for the next call r.set(cache_key, result.encode('utf-8')) @@ -290,12 +258,6 @@ def peer_info(address): if interfaces: result['interfaces'] = interfaces - # if not result: - # return Response( - # response='no peering info found for %s' % address, - # status=404, - # mimetype="text/html") - result = json.dumps(result) # cache this data for the next call r.set(cache_key, result.encode('utf-8')) diff --git a/test/test_classifier_utilities.py b/test/test_classifier_utilities.py index 4075e69054aa9fe0f30b00eb7f614211223c0bda..80308e574c64f570849372b5d8168a461a161d46 100644 --- a/test/test_classifier_utilities.py +++ b/test/test_classifier_utilities.py @@ -1,29 +1,7 @@ -import pytest -from inventory_provider.routes import classifier from inventory_provider.routes.classifier import get_top_level_services from inventory_provider.tasks import common -@pytest.mark.parametrize('interface_name,base_name', [ - ('ae0', 'ae0'), - ('ae0.0', 'ae0'), - ('ae1.0', 'ae1'), - ('ae10.2603', 'ae10'), - ('et-3/1/2', 'et-3/1/2'), - ('et-3/1/2.100', 'et-3/1/2'), - ('xe-2/1/0', 'xe-2/1/0'), - ('xe-2/1/0.933', 'xe-2/1/0'), - - # degenerate cases ... check expected regex behavior - ('xe-2/1/0.933.933', 'xe-2/1/0.933'), - (' sss.333.aaa ', ' sss.333.aaa '), - (' sss.333.aaa .999', ' sss.333.aaa ') -] -) -def test_base_interface_name(interface_name, base_name): - assert classifier.base_interface_name(interface_name) == base_name - - # todo - not too keen on this as it relies on the extracted opsdb data, which # could change and lead to this test failing def test_get_top_level_circuits(mocked_redis):