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): ...@@ -18,6 +18,49 @@ def _unique_dicts_from_list(l):
return list(tmp_dict.values()) 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): class ClassifierRequestError(Exception):
status_code = 500 status_code = 500
...@@ -91,7 +134,14 @@ def get_juniper_link_info(source_equipment, interface): ...@@ -91,7 +134,14 @@ def get_juniper_link_info(source_equipment, interface):
if result: if result:
result = result.decode('utf-8') result = result.decode('utf-8')
else: else:
result = {}
result = {
'locations': []
}
router_location = _location_from_router(source_equipment)
result['locations'] += [router_location]
top_level_services = [] top_level_services = []
services = r.get( services = r.get(
...@@ -100,6 +150,8 @@ def get_juniper_link_info(source_equipment, interface): ...@@ -100,6 +150,8 @@ def get_juniper_link_info(source_equipment, interface):
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'], r)) 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( ifc_info = r.get(
'netconf-interfaces:%s:%s' % (source_equipment, interface)) 'netconf-interfaces:%s:%s' % (source_equipment, interface))
...@@ -137,6 +189,7 @@ def get_juniper_link_info(source_equipment, interface): ...@@ -137,6 +189,7 @@ def get_juniper_link_info(source_equipment, interface):
if top_level_services: if top_level_services:
result['related-services'] = top_level_services result['related-services'] = top_level_services
result['locations'] = _unique_dicts_from_list(result['locations'])
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'))
...@@ -207,51 +260,6 @@ def find_interfaces(address): ...@@ -207,51 +260,6 @@ def find_interfaces(address):
yield ifc 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): def find_interfaces_and_services(address_str):
""" """
...@@ -314,18 +322,16 @@ def peer_info(address): ...@@ -314,18 +322,16 @@ def peer_info(address):
info = info.decode('utf-8') info = info.decode('utf-8')
info = json.loads(info) info = json.loads(info)
result['ix-public-peer-info'] = ix_peering_info(info) result['ix-public-peer-info'] = ix_peering_info(info)
result['locations'] += [ router_location = _location_from_router(info['router'])
_location_from_router(info['router']) result['locations'] += [router_location]
]
info = r.get('vpn_rr_peer:%s' % address) info = r.get('vpn_rr_peer:%s' % address)
if info: if info:
info = info.decode('utf-8') info = info.decode('utf-8')
info = json.loads(info) info = json.loads(info)
result['vpn-rr-peer-info'] = info result['vpn-rr-peer-info'] = info
result['locations'] += [ router_location = _location_from_router(info['router'])
_location_from_router(info['router']) result['locations'] += [router_location]
]
interfaces = list(find_interfaces_and_services(address)) interfaces = list(find_interfaces_and_services(address))
if interfaces: if interfaces:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment