diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index cff87797f0bf6281c9116f9c1a5750df26f558cd..49192830307e136b7ab774e694fcc6dedc11ffa6 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 a3f485d8eb2a268f996e1ac71d7f09c903f2ce5a..fbeeaae12f3418e1b586db00f211921f363038c7 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()}"