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