From 04b3a8245ccf8788e93ac925482cd1547adb551c Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Wed, 10 Mar 2021 14:06:14 +0000
Subject: [PATCH] changed _load_interfaces to use cached interface service info

---
 inventory_provider/routes/poller.py | 55 +++++++++++++----------------
 1 file changed, 24 insertions(+), 31 deletions(-)

diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index 85591b89..97b9e3db 100644
--- a/inventory_provider/routes/poller.py
+++ b/inventory_provider/routes/poller.py
@@ -6,7 +6,8 @@ from distutils.util import strtobool
 from flask import Blueprint, Response, current_app, request
 from inventory_provider import juniper
 from inventory_provider.routes import common
-from inventory_provider.routes.classifier import get_ims_equipment_name
+from inventory_provider.routes.classifier import get_ims_equipment_name, \
+    get_ims_interface
 
 logger = logging.getLogger(__name__)
 routes = Blueprint('poller-support-routes', __name__)
@@ -109,19 +110,9 @@ def _load_services(hostname=None):
     if hostname:
         hostname = get_ims_equipment_name(hostname)
 
-    key_pattern = f'ims:interface_port_ids:{hostname}:*' \
-        if hostname else 'ims:interface_port_ids:*'
-
-    port_id_interfaces = {}
-    interface_services = {}
-
-    def _get_port_id_services(s):
-        nonlocal port_id_interfaces
-        for d in s:
-            k = d['key']
-            v = d['value']
-            port_id_interfaces[v['port_id']] = k.split(':')[-2:]
-            yield f'ims:port_id_services:{v["port_id"]}'
+    result = dict()
+    key_pattern = f'ims:interface_services:{hostname}:*' \
+        if hostname else 'ims:interface_services:*'
 
     def _filter_and_format_services(_services):
         included_service_ids = set()
@@ -137,25 +128,24 @@ def _load_services(hostname=None):
                     'status': s['status']
                 }
 
-    if_ports = common.load_json_docs(
+    for doc in common.load_json_docs(
             config_params=current_app.config['INVENTORY_PROVIDER_CONFIG'],
             key_pattern=key_pattern,
-            num_threads=20)
-
-    for r in common.load_json_docs(
-            config_params=current_app.config['INVENTORY_PROVIDER_CONFIG'],
-            key_pattern=_get_port_id_services(if_ports),
             num_threads=20):
-        services = r['value']
-        if services:
-            h, i = port_id_interfaces[services[0]['port_a_id']]
-            ifs_h = interface_services.get(h, {})
-            interface_services[h] = ifs_h
-            ifs_h_i = ifs_h.get(i, [])
-            ifs_h_i.extend(list(_filter_and_format_services(services)))
-            ifs_h[i] = ifs_h_i
 
-    return interface_services
+        m = re.match(r'^ims:interface_services:([^:]+):(.+)', doc['key'])
+        if not m:
+            logger.warning(f'can\'t parse redis service key {doc["key"]}')
+            # there are some weird records (dtn*, dp1*)
+            continue
+
+        router = m.group(1)
+        interface = m.group(2)
+        result.setdefault(router, dict())
+        result[router][interface] = \
+            list(_filter_and_format_services(doc['value']))
+
+    return result
 
 
 def _load_interfaces(hostname):
@@ -199,9 +189,12 @@ def _load_poller_interfaces(hostname=None):
             base_ifc = ifc['name'].split('.')[0]
             ifc['bundle-parents'] = router_bundle.get(base_ifc, [])
 
-        router_services = services.get(ifc['router'], None)
+        router_services = services.get(
+            get_ims_equipment_name(ifc['router']), None)
         if router_services:
-            ifc['circuits'] = router_services.get(ifc['name'], [])
+            ifc['circuits'] = router_services.get(
+                get_ims_interface(ifc['name']), []
+            )
 
         yield ifc
 
-- 
GitLab