From 0a370496af29256deb3d6381218ef306db04757c Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Wed, 29 Jul 2020 14:34:17 +0000
Subject: [PATCH] added population of equipment location data and testing route
 to call it

---
 inventory_provider/routes/testing.py   |  5 +++++
 inventory_provider/tasks/ims_worker.py | 29 ++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/inventory_provider/routes/testing.py b/inventory_provider/routes/testing.py
index 6f9ce50e..668d7b10 100644
--- a/inventory_provider/routes/testing.py
+++ b/inventory_provider/routes/testing.py
@@ -21,6 +21,11 @@ def flushdb():
 
 # IMS routes
 
+@routes.route("update-equipment-locations-ims", methods=['GET', 'POST'])
+def update_equipment_locations_ims():
+    ims_worker.update_equipment_locations_ims.delay(use_current=True)
+    return Response('OK')
+
 @routes.route("update-lg-routers-ims", methods=['GET', 'POST'])
 def update_lg_routers_ims():
     ims_worker.update_lg_routers_ims.delay(use_current=True)
diff --git a/inventory_provider/tasks/ims_worker.py b/inventory_provider/tasks/ims_worker.py
index b7c2e85c..e966d228 100644
--- a/inventory_provider/tasks/ims_worker.py
+++ b/inventory_provider/tasks/ims_worker.py
@@ -21,6 +21,35 @@ environment.setup_logging()
 logger = logging.getLogger(__name__)
 
 
+@app.task(base=InventoryTask, bind=True, name='update_equipment_locations_ims')
+@log_task_entry_and_exit
+def update_equipment_locations_ims(self, use_current=False):
+    r = get_current_redis(InventoryTask.config)
+
+    if use_current:
+        r = get_current_redis(InventoryTask.config)
+        rp = r.pipeline()
+        # scan with bigger batches, to mitigate network latency effects
+        for k in r.scan_iter('ims:location:*', count=1000):
+            rp.delete(k)
+        rp.execute()
+    else:
+        r = get_next_redis(InventoryTask.config)
+
+    c = InventoryTask.config["ims"]
+    ds = IMS(c['api'], c['username'], c['password'])
+
+    rp = r.pipeline()
+    hostnames_found = set()
+    for h, d in ims_data.get_node_locations(ds):
+        # put into a list to match non-IMS version
+        rp.set(f'ims:location:{h}', json.dumps([d]))
+        if h in hostnames_found:
+            print(f'Multiple entries for {h}')
+        hostnames_found.add(h)
+    rp.execute()
+
+
 @app.task(base=InventoryTask, bind=True, name='update_lg_routers_ims')
 @log_task_entry_and_exit
 def update_lg_routers_ims(self, use_current=False):
-- 
GitLab