From 375c7b31e4ba0025d00156057681575c509e2cd7 Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Wed, 31 Mar 2021 18:01:39 +0200
Subject: [PATCH] get basic info from lab routers

---
 inventory_provider/config.py       |  4 ++++
 inventory_provider/tasks/worker.py | 33 ++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/inventory_provider/config.py b/inventory_provider/config.py
index d8ce6e9f..2ddd10ee 100644
--- a/inventory_provider/config.py
+++ b/inventory_provider/config.py
@@ -108,6 +108,10 @@ CONFIG_SCHEMA = {
             "items": {"type": "integer"}
         },
         "managed-routers": {"type": "string"},
+        "lab-routers": {
+            "type": "array",
+            "items": {"type": "string"}
+        },
         "unmanaged-interfaces": {
             "type": "array",
             "items": {"$ref": "#/definitions/interface-address"}
diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index 91027314..00595f41 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -469,6 +469,32 @@ def refresh_juniper_interface_list(hostname, netconf):
     rp.execute()
 
 
+@app.task(base=InventoryTask, bind=True, name='reload_router_config')
+@log_task_entry_and_exit
+def reload_lab_router_config(self, hostname):
+    self.log_info(f'loading netconf data for lab {hostname}')
+
+    # load new netconf data, in this thread
+    netconf_refresh_config.apply(args=[hostname])
+
+    netconf_doc = load_netconf_data(hostname)
+
+    # load snmp indexes
+    community = juniper.snmp_community_string(netconf_doc)
+    if not community:
+        raise InventoryTaskError(
+            f'error extracting community string for {hostname}')
+    else:
+        self.log_info(f'refreshing snmp interface indexes for {hostname}')
+        logical_systems = juniper.logical_systems(netconf_doc)
+
+        # load snmp data, in this thread
+        snmp_refresh_interfaces.apply(
+            args=[hostname, community, logical_systems])
+
+    self.log_info(f'updated configuration for lab {hostname}')
+
+
 @app.task(base=InventoryTask, bind=True, name='reload_router_config')
 @log_task_entry_and_exit
 def reload_router_config(self, hostname):
@@ -483,6 +509,8 @@ def reload_router_config(self, hostname):
         logger.debug(
             'current netconf timestamp: %r' % current_netconf_timestamp)
     except InventoryTaskError:
+        # NOTE: should always reach here,
+        #       since we always erase everything before starting
         pass  # ok at this point if not found
 
     # load new netconf data, in this thread
@@ -562,6 +590,11 @@ def internal_refresh_phase_2(self):
             logger.debug('queueing router refresh jobs for %r' % hostname)
             subtasks.append(reload_router_config.apply_async(args=[hostname]))
 
+        lab_routers = InventoryTask.config.get('lab-routers', [])
+        for hostname in lab_routers:
+            logger.debug('queueing router refresh jobs for lab %r' % hostname)
+            subtasks.append(reload_lab_router_config.apply_async(args=[hostname]))
+
         pending_task_ids = [x.id for x in subtasks]
 
         refresh_finalizer.apply_async(args=[json.dumps(pending_task_ids)])
-- 
GitLab