From 01d40f1ee50ace32638720124503bfb21fc6e07a Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Thu, 21 Apr 2022 10:52:25 +0000
Subject: [PATCH] added interfaces endpoint and test

---
 inventory_provider/routes/mic.py | 25 +++++++++++++++++++++++++
 test/test_mic_routes.py          | 13 ++++++++++++-
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/inventory_provider/routes/mic.py b/inventory_provider/routes/mic.py
index e4b7499d..83858f6e 100644
--- a/inventory_provider/routes/mic.py
+++ b/inventory_provider/routes/mic.py
@@ -45,6 +45,13 @@ NODES_LIST_SCHEMA = {
     "additionalProperties": False
 }
 
+INTERFACES_LIST_SCHEMA = {
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "array",
+    "items": {"type": "string"},
+    "additionalProperties": False
+}
+
 
 @routes.route('/sites')
 def get_sites():
@@ -80,3 +87,21 @@ def get_nodes(site):
             r.set(cache_key, result)
             result = result.decode('utf-8')
     return Response(result, mimetype='application/json')
+
+
+@routes.route('/interfaces/<node>')
+def get_interfaces(node):
+    cache_key = f'classifier-cache:mic:interfaces:{node}'
+    r = common.get_current_redis()
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
+    if not result:
+        def _get_intefaces():
+            key_pattern = f"ims:interface_services:{node}:*"
+            for k in r.scan_iter(key_pattern, count=1000):
+                yield ":".join(k.decode('utf-8').split(':')[3:])
+
+        interfaces_ = sorted(_get_intefaces())
+        if interfaces_:
+            result = json.dumps(interfaces_)
+            r.set(cache_key, result.encode('utf-8'))
+    return Response(result, mimetype='application/json')
diff --git a/test/test_mic_routes.py b/test/test_mic_routes.py
index 1f527444..d744c195 100644
--- a/test/test_mic_routes.py
+++ b/test/test_mic_routes.py
@@ -2,7 +2,8 @@ import json
 
 import jsonschema
 
-from inventory_provider.routes.mic import SITES_LIST_SCHEMA, NODES_LIST_SCHEMA
+from inventory_provider.routes.mic import SITES_LIST_SCHEMA, \
+    NODES_LIST_SCHEMA, INTERFACES_LIST_SCHEMA
 
 DEFAULT_REQUEST_HEADERS = {
     "Content-type": "application/json",
@@ -28,3 +29,13 @@ def test_get_nodes(client, mocked_redis):
     assert rv.is_json
     response_data = json.loads(rv.data.decode('utf-8'))
     jsonschema.validate(response_data, NODES_LIST_SCHEMA)
+
+
+def test_get_interfaces(client, mocked_redis):
+    rv = client.get(
+        '/mic/interfaces/MX1.LON.UK',
+        headers=DEFAULT_REQUEST_HEADERS)
+    assert rv.status_code == 200
+    assert rv.is_json
+    response_data = json.loads(rv.data.decode('utf-8'))
+    jsonschema.validate(response_data, INTERFACES_LIST_SCHEMA)
-- 
GitLab