diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index c26157582261ea3c2d1a8d24e0ce65d0d7fc6197..08110ba2d0645cf28686d7e8209e0807c40f185b 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -46,9 +46,10 @@ def _remove_duplicates_from_list(all_: list) -> list: def _location_from_equipment(equipment_name: str, r: Redis) -> Optional[dict]: - result = r.get(f'ims:location:{equipment_name}') + k = f'ims:location:{equipment_name}' + result = r.get(k) if not result: - logger.error(f'error looking up location for {equipment_name}') + logger.error(f'error looking up location for key: {k}') return None result = json.loads(result.decode('utf-8')) @@ -148,7 +149,7 @@ def get_related_services(source_equipment: str, interface: str, r) -> dict: yield from s['top-level-services'] -def get_interface_services_and_locs(ims_source_equipment, ims_interface, r): +def get_interface_services_and_loc(ims_source_equipment, ims_interface, redis): def _format_service(_s): keys = { @@ -160,19 +161,15 @@ def get_interface_services_and_locs(ims_source_equipment, ims_interface, r): keys_to_remove = set(_s.keys()) - keys for k in keys_to_remove: _s.pop(k) - result = { - 'locations': [] - } - raw_services = r.get( + raw_services = redis.get( f'ims:interface_services:{ims_source_equipment}:{ims_interface}') + result = {} if raw_services: result['services'] = json.loads(raw_services.decode('utf-8')) for s in result['services']: _format_service(s) - result['related-services'] = \ - list(get_related_services(ims_source_equipment, ims_interface, r)) - result['locations'] = \ - list(_location_from_services(result['services'], r)) + result['related-services'] = list( + get_related_services(ims_source_equipment, ims_interface, redis)) if not result['services']: result.pop('services', None) if result['related-services']: @@ -181,11 +178,8 @@ def get_interface_services_and_locs(ims_source_equipment, ims_interface, r): else: result.pop('related-services', None) - if not result.get('locations', None): - locations = build_locations( - _location_from_equipment(ims_source_equipment, r)) - result['locations'] = [locations] if locations else [] - result['locations'] = _remove_duplicates_from_list(result['locations']) + loc = _location_from_equipment(ims_source_equipment, redis) + result['locations'] = [build_locations(loc)] if loc else [] return result @@ -277,13 +271,18 @@ def get_juniper_link_info(source_equipment: str, interface: str) -> Response: result['interface']['bundle_members'] = [] result.update( - get_interface_services_and_locs( + get_interface_services_and_loc( ims_source_equipment, ims_interface, r ) ) + # don't want to report related services for bundle members, just the + # aggregate + if result['interface']['bundle']: + result['related-services'] = [] + result = json.dumps(result) # cache this data for the next call r.set(cache_key, result.encode('utf-8')) @@ -543,7 +542,7 @@ def peer_info(address_str: str) -> Response: ims_equipment = get_ims_equipment_name(interface["router"]) ims_interface = get_ims_interface(interface["interface name"]) - services_and_locs = get_interface_services_and_locs( + services_and_locs = get_interface_services_and_loc( ims_equipment, ims_interface, r @@ -611,7 +610,7 @@ def get_trap_metadata(source_equipment: str, interface: str, circuit_id: str) \ 'locations': [] } - result.update(get_interface_services_and_locs( + result.update(get_interface_services_and_loc( ims_source_equipment, ims_interface, r @@ -808,7 +807,7 @@ def get_coriant_info(equipment_name: str, entity_string: str) -> Response: } interface_name = f'{card_id}/{port}' - result.update(get_interface_services_and_locs( + result.update(get_interface_services_and_loc( ims_source_equipment, interface_name, r