Skip to content
Snippets Groups Projects
Commit 6778f8b2 authored by Erik Reid's avatar Erik Reid
Browse files

added location data to juniper-link-info response

parent 5a884eff
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,49 @@ def _unique_dicts_from_list(l):
return list(tmp_dict.values())
def _location_from_router(router_name):
r = common.get_current_redis()
result = r.get(f'opsdb:location:{router_name}')
if not result:
logger.error(f'error looking up location for {router_name}')
return None
result = json.loads(result.decode('utf-8'))
if not result:
logger.error(f'sanity failure: empty list for location {router_name}')
return None
return {
'a': {
'equipment': result[0]['equipment-name'],
'name': result[0]['pop']['name'],
'abbreviation': result[0]['pop']['abbreviation']
}
}
def _location_from_service_dict(s):
location = {
'a': {
'equipment': s['equipment'],
'name': s['pop_name'],
'abbreviation': s['pop_abbreviation']
}
}
if all(s[n] for n in (
'other_end_equipment',
'other_end_pop_name',
'other_end_pop_abbreviation')):
location['b'] = {
'equipment': s['other_end_equipment'],
'name': s['other_end_pop_name'],
'abbreviation': s['other_end_pop_abbreviation']
}
return location
class ClassifierRequestError(Exception):
status_code = 500
......@@ -91,7 +134,14 @@ def get_juniper_link_info(source_equipment, interface):
if result:
result = result.decode('utf-8')
else:
result = {}
result = {
'locations': []
}
router_location = _location_from_router(source_equipment)
result['locations'] += [router_location]
top_level_services = []
services = r.get(
......@@ -100,6 +150,8 @@ def get_juniper_link_info(source_equipment, interface):
result['services'] = json.loads(services.decode('utf=8'))
for s in result['services']:
top_level_services.extend(get_top_level_services(s['id'], r))
l = [_location_from_service_dict(s) for s in result['services']]
result['locations'] += l
ifc_info = r.get(
'netconf-interfaces:%s:%s' % (source_equipment, interface))
......@@ -137,6 +189,7 @@ def get_juniper_link_info(source_equipment, interface):
if top_level_services:
result['related-services'] = top_level_services
result['locations'] = _unique_dicts_from_list(result['locations'])
result = json.dumps(result)
# cache this data for the next call
r.set(cache_key, result.encode('utf-8'))
......@@ -207,51 +260,6 @@ def find_interfaces(address):
yield ifc
def _location_from_router(router_name):
r = common.get_current_redis()
result = r.get(f'opsdb:location:{router_name}')
empty_response ={
'a': {'equipment': '', 'name': '', 'abbreviation': ''}
}
if not result:
logger.error(f'error looking up location for {router_name}')
return empty_response
result = json.loads(result.decode('utf-8'))
if not result:
logger.error(f'sanity failure: empty list for location {router_name}')
return empty_response
return {
'a': {
'equipment': result[0]['equipment-name'],
'name': result[0]['pop']['name'],
'abbreviation': result[0]['pop']['abbreviation']
}
}
def _location_from_service_dict(s):
location = {
'a': {
'equipment': s['equipment'],
'name': s['pop_name'],
'abbreviation': s['pop_abbreviation']
}
}
if all(s[n] for n in (
'other_end_equipment',
'other_end_pop_name',
'other_end_pop_abbreviation')):
location['b'] = {
'equipment': s['other_end_equipment'],
'name': s['other_end_pop_name'],
'abbreviation': s['other_end_pop_abbreviation']
}
return location
def find_interfaces_and_services(address_str):
"""
......@@ -314,18 +322,16 @@ def peer_info(address):
info = info.decode('utf-8')
info = json.loads(info)
result['ix-public-peer-info'] = ix_peering_info(info)
result['locations'] += [
_location_from_router(info['router'])
]
router_location = _location_from_router(info['router'])
result['locations'] += [router_location]
info = r.get('vpn_rr_peer:%s' % address)
if info:
info = info.decode('utf-8')
info = json.loads(info)
result['vpn-rr-peer-info'] = info
result['locations'] += [
_location_from_router(info['router'])
]
router_location = _location_from_router(info['router'])
result['locations'] += [router_location]
interfaces = list(find_interfaces_and_services(address))
if interfaces:
......
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