From 5c24f7edfd84bc75b64fce159f46b3e1a6599bcc Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Mon, 4 Jan 2021 12:32:13 +0100
Subject: [PATCH] add individual interface records for snmp indexes

... optimization for lookup performance
---
 inventory_provider/tasks/worker.py | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index 8edb7ff6..7e92f65a 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -89,23 +89,37 @@ class InventoryTask(Task):
 @log_task_entry_and_exit
 def snmp_refresh_interfaces(self, hostname, community):
     try:
-        value = list(snmp.get_router_snmp_indexes(hostname, community))
+        interfaces = list(snmp.get_router_snmp_indexes(hostname, community))
     except ConnectionError:
         msg = f'error loading snmp data from {hostname}'
         logger.exception(msg)
         self.log_warning(msg)
         r = get_current_redis(InventoryTask.config)
-        value = r.get(f'snmp-interfaces:{hostname}')
-        if not value:
+        interfaces = r.get(f'snmp-interfaces:{hostname}')
+        if not interfaces:
             raise InventoryTaskError(
                 f'snmp error with {hostname}'
                 f' and no cached netconf data found')
         # unnecessary json encode/decode here ... could be optimized
-        value = json.loads(value.decode('utf-8'))
+        interfaces = json.loads(interfaces.decode('utf-8'))
         self.log_warning(f'using cached snmp data for {hostname}')
 
     r = get_next_redis(InventoryTask.config)
-    r.set(f'snmp-interfaces:{hostname}', json.dumps(value))
+
+    rp = r.pipeline()
+    rp.set(f'snmp-interfaces:{hostname}', json.dumps(interfaces))
+
+    # optimization for DBOARD3-372
+    # interfaces is a list of dicts like: {'name': str, 'index': int}
+    for ifc in interfaces:
+        ifc['hostname'] = hostname
+        ifc['community'] = community
+        rp.set(
+            f'snmp-interfaces:{hostname}:{ifc["name"]}',
+            json.dumps(ifc))
+
+    rp.execute()
+
     self.log_info(f'snmp info loaded from {hostname}')
 
 
-- 
GitLab