From 2294e90ef567d08554bb65af2891cba1cb021434 Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Fri, 31 Jan 2020 11:03:01 +0100 Subject: [PATCH] route handler for lg endpoint --- inventory_provider/routes/lg.py | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 inventory_provider/routes/lg.py diff --git a/inventory_provider/routes/lg.py b/inventory_provider/routes/lg.py new file mode 100644 index 00000000..90539e81 --- /dev/null +++ b/inventory_provider/routes/lg.py @@ -0,0 +1,61 @@ +import json +import re + +from flask import Blueprint, jsonify, Response + +from inventory_provider.routes import common + +routes = Blueprint("lg-query-routes", __name__) + +ACCESS_PUBLIC = 'public' +ACCESS_INTERNAL = 'all' + + +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + +@routes.route("/routers/<string:access>", methods=['GET', 'POST']) +@common.require_accepts_json +def routers(access): + + if access not in {ACCESS_INTERNAL, ACCESS_PUBLIC}: + return Response( + response='unknown access level', + status=404, + mimetype='text/html') + + redis = common.get_current_redis() + + def _visible(router): + if access == ACCESS_INTERNAL: + return True + return router['type'] == 'CORE' + + def _routers(): + i = 0 + for k in redis.scan_iter(f'opsdb:lg:*'): + rtr = redis.get(k.decode('utf-8')).decode('utf-8') + rtr = json.loads(rtr) + i += 1 + if _visible(rtr): + yield rtr + + cache_key = f'classifier-cache:lg:{access}' + result = redis.get(cache_key) + + if result: + result = json.loads(result.decode('utf-8')) + else: + result = list(_routers()) + # cache this data for the next call + redis.set(cache_key, json.dumps(result).encode('utf-8')) + + if not result: + return Response( + response=f'no routers found for access level {access}', + status=404, + mimetype="text/html") + + return jsonify(result) -- GitLab