Skip to content
Snippets Groups Projects
Commit 12686de9 authored by Release Webservice's avatar Release Webservice
Browse files

Finished release 0.31.

parents f778cad4 087760ad
No related branches found
No related tags found
No related merge requests found
...@@ -43,16 +43,10 @@ def after_request(resp): ...@@ -43,16 +43,10 @@ def after_request(resp):
return common.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): def related_interfaces(hostname, interface):
r = common.get_current_redis() r = common.get_current_redis()
prefix = 'netconf-interfaces:%s:' % hostname 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') k = k.decode('utf-8')
assert k.startswith(prefix) # sanity assert k.startswith(prefix) # sanity
assert len(k) > len(prefix) # sanity (contains at least an interface) assert len(k) > len(prefix) # sanity (contains at least an interface)
...@@ -68,11 +62,11 @@ def get_top_level_services(circuit_id, r): ...@@ -68,11 +62,11 @@ def get_top_level_services(circuit_id, r):
for c in results: for c in results:
temp_parents = \ temp_parents = \
get_top_level_services(c['parent_circuit_id'], r) get_top_level_services(c['parent_circuit_id'], r)
if not temp_parents and \ if not temp_parents:
c['parent_circuit_type'].lower() == 'service':
tls.append( tls.append(
{'name': c['parent_circuit'], {'name': c['parent_circuit'],
'status': c['parent_circuit_status']}) 'status': c['parent_circuit_status'],
'circuit_type': c['parent_circuit_type'].lower()})
tls.extend(temp_parents) tls.extend(temp_parents)
return tls return tls
...@@ -93,33 +87,12 @@ def get_juniper_link_info(source_equipment, interface): ...@@ -93,33 +87,12 @@ def get_juniper_link_info(source_equipment, interface):
result = {} result = {}
top_level_services = [] 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( services = r.get(
'opsdb:interface_services:%s:%s' % (source_equipment, interface)) 'opsdb:interface_services:%s:%s' % (source_equipment, interface))
if services: if services:
result['services'] = json.loads(services.decode('utf=8')) result['services'] = json.loads(services.decode('utf=8'))
for s in result['services']: 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( ifc_info = r.get(
'netconf-interfaces:%s:%s' % (source_equipment, interface)) 'netconf-interfaces:%s:%s' % (source_equipment, interface))
...@@ -140,25 +113,24 @@ def get_juniper_link_info(source_equipment, interface): ...@@ -140,25 +113,24 @@ def get_juniper_link_info(source_equipment, interface):
for related in related_interfaces(source_equipment, interface): for related in related_interfaces(source_equipment, interface):
rs = r.get('opsdb:interface_services:%s:%s' rs = r.get('opsdb:interface_services:%s:%s'
% (source_equipment, related)) % (source_equipment, related))
all_rs = []
if rs: if rs:
for s in json.loads(rs.decode('utf-8')): for s in json.loads(rs.decode('utf-8')):
top_level_services.extend( top_level_services.extend(
_get_top_level_services(s['id'])) get_top_level_services(s['id'], r))
yield {'name': s['name'], 'status': s['status']} all_rs.append(
{
related_services = list(_related_services()) 'name': s['name'],
'status': s['status'],
'circuit_type': s['circuit_type']
})
return all_rs
related_services = _related_services()
if related_services: if related_services:
related_services.extend(top_level_services) top_level_services.extend(related_services)
result['related-services'] = related_services if top_level_services:
result['related-services'] = top_level_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) result = json.dumps(result)
# cache this data for the next call # cache this data for the next call
...@@ -265,6 +237,14 @@ def find_interfaces_and_services(address_str): ...@@ -265,6 +237,14 @@ def find_interfaces_and_services(address_str):
@common.require_accepts_json @common.require_accepts_json
def peer_info(address): def peer_info(address):
# canonicalize the input address first ...
try:
obj = ipaddress.ip_address(address)
address = obj.exploded
except ValueError:
raise ClassifierProcessingError(
'unable to parse %r as an ip address' % address)
r = common.get_current_redis() r = common.get_current_redis()
cache_key = 'classifier-cache:peer:%s' % address cache_key = 'classifier-cache:peer:%s' % address
...@@ -290,12 +270,6 @@ def peer_info(address): ...@@ -290,12 +270,6 @@ def peer_info(address):
if interfaces: if interfaces:
result['interfaces'] = 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) result = json.dumps(result)
# cache this data for the next call # cache this data for the next call
r.set(cache_key, result.encode('utf-8')) r.set(cache_key, result.encode('utf-8'))
......
...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages ...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name='inventory-provider', name='inventory-provider',
version="0.30", version="0.31",
author='GEANT', author='GEANT',
author_email='swd@geant.org', author_email='swd@geant.org',
description='Dashboard inventory provider', description='Dashboard inventory provider',
......
import pytest
from inventory_provider.routes import classifier
from inventory_provider.routes.classifier import get_top_level_services from inventory_provider.routes.classifier import get_top_level_services
from inventory_provider.tasks import common 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 # todo - not too keen on this as it relies on the extracted opsdb data, which
# could change and lead to this test failing # could change and lead to this test failing
def test_get_top_level_circuits(mocked_redis): def test_get_top_level_circuits(mocked_redis):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment