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