From 14eeb4d5641be68cd6000f89a3081d9318a7da37 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Tue, 30 Mar 2021 14:51:25 +0000
Subject: [PATCH] removed related services from bundle members; only reported
 location for interface source

---
 inventory_provider/routes/classifier.py | 39 ++++++++++++-------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index c2615758..08110ba2 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
-- 
GitLab