From c07ec1e36817aed63afc6ef2689c88b3471bf330 Mon Sep 17 00:00:00 2001 From: Pelle Koster <pelle.koster@geant.org> Date: Thu, 17 Oct 2024 11:29:33 +0200 Subject: [PATCH] add endpoint for all routers that are both in gap and in ims --- inventory_provider/routes/classifier.py | 22 +++++++++++++++------- test/test_classifier_routes.py | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index cff8779..4919283 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -61,7 +61,7 @@ import re from functools import lru_cache from typing import Iterable, List, Optional -from flask import Blueprint, Response, jsonify, request +from flask import Blueprint, Response, request from redis import Redis from inventory_provider.routes import common @@ -1158,14 +1158,22 @@ def _get_coriant_info( @common.require_accepts_json def get_all_routers() -> Response: redis = common.get_current_redis() + result = cache_result( + "classifier-cache:router:list", + func=functools.partial(_get_router_list, redis), + redis=redis, + ) + return Response(result, mimetype="application/json") + + +def _get_router_list(redis): all_routers_raw = redis.get("netdash") all_routers = json.loads(all_routers_raw) if all_routers_raw else {} - return jsonify( - [ - {"hostname": hostname, "vendor": vendor} - for hostname, vendor in all_routers.items() - ] - ) + return [ + {"hostname": hostname, "vendor": vendor} + for hostname, vendor in all_routers.items() + if get_ims_equipment_name_or_none(hostname) + ] @routes.route("/router-info/<equipment_name>", methods=["GET"]) diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py index a3f485d..fbeeaae 100644 --- a/test/test_classifier_routes.py +++ b/test/test_classifier_routes.py @@ -236,6 +236,22 @@ def test_router_info_all_routers(client): jsonschema.validate(result, ROUTER_INFO_ALL_ROUTERS_RESPONSE_SCHEMA) assert len(result) > 0 +def test_router_info_all_routers(client, mocked_redis): + rv = client.get("/classifier/router-info", headers=DEFAULT_REQUEST_HEADERS) + assert rv.status_code == 200 + assert rv.is_json + result = rv.json + + jsonschema.validate(result, ROUTER_INFO_ALL_ROUTERS_RESPONSE_SCHEMA) + assert len(result) > 0 + +def test_all_routers_skips_routers_not_in_ims(client, mocked_redis): + all_routers = json.loads(mocked_redis.get('netdash')) + all_routers['invalid.router'] = 'juniper' + mocked_redis.set('netdash', json.dumps(all_routers)) + result = client.get("/classifier/router-info", headers=DEFAULT_REQUEST_HEADERS).json + + assert not any(r['hostname'] == 'invalid.router' for r in result) @pytest.mark.parametrize("router", ["mx1.ams.nl", "mx1.ams.nl.geant.net"]) def test_router_info(client, router): @@ -250,6 +266,7 @@ def test_router_info(client, router): assert len(result['contacts']) > 0 + def test_router_info_caches_result(client, mocked_redis): router = "mx1.ams.nl" cache_key = f"classifier-cache:router:{router.upper()}" -- GitLab