From 84d3395bff260ae7e6a83f9a9fd4ed02b8fbfb6c Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Tue, 10 Mar 2020 11:58:03 +0100 Subject: [PATCH] added msr route --- inventory_provider/__init__.py | 3 ++ inventory_provider/routes/msr.py | 42 ++++++++++++++++++++++++++ test/test_msr_routes.py | 51 ++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 inventory_provider/routes/msr.py create mode 100644 test/test_msr_routes.py diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py index f862a653..adbe8290 100644 --- a/inventory_provider/__init__.py +++ b/inventory_provider/__init__.py @@ -61,6 +61,9 @@ def create_app(): from inventory_provider.routes import lg app.register_blueprint(lg.routes, url_prefix='/lg') + from inventory_provider.routes import msr + app.register_blueprint(msr.routes, url_prefix='/msr') + if app.config.get('ENABLE_TESTING_ROUTES', False): from inventory_provider.routes import testing app.register_blueprint(testing.routes, url_prefix='/testing') diff --git a/inventory_provider/routes/msr.py b/inventory_provider/routes/msr.py new file mode 100644 index 00000000..32fe7392 --- /dev/null +++ b/inventory_provider/routes/msr.py @@ -0,0 +1,42 @@ +import json + +from flask import Blueprint, jsonify, Response + +from inventory_provider.routes import common + +routes = Blueprint("msr-query-routes", __name__) + + +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + +@routes.route("/access-services", methods=['GET', 'POST']) +@common.require_accepts_json +def access_services(): + + redis = common.get_current_redis() + + def _services(): + for k in redis.scan_iter('opsdb:access_services:*'): + service = redis.get(k.decode('utf-8')).decode('utf-8') + yield json.loads(service) + + cache_key = f'classifier-cache:msr:access-services' + result = redis.get(cache_key) + + if result: + result = json.loads(result.decode('utf-8')) + else: + result = list(_services()) + # 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 access services found', + status=404, + mimetype="text/html") + + return jsonify(result) diff --git a/test/test_msr_routes.py b/test/test_msr_routes.py new file mode 100644 index 00000000..af13f232 --- /dev/null +++ b/test/test_msr_routes.py @@ -0,0 +1,51 @@ +import json +import jsonschema +import pytest + +DEFAULT_REQUEST_HEADERS = { + "Content-type": "application/json", + "Accept": ["application/json"] +} + +ACCESS_SERVICES_LIST_SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema#", + + "definitions": { + "service": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "name": {"type": "string"}, + "equipment": {"type": "string"}, + "pop_name": {"type": "string"}, + "other_end_equipment": {"type": "string"}, + "other_end_pop_name": {"type": "string"}, + "speed_value": {"type": "integer"}, + "speed_unit": {"type": "string"} + }, + "required": [ + "id", "name", + "pop_name", "equipment", + "other_end_pop_name", "other_end_equipment", + "speed_value", "speed_unit" + ], + "additionalProperties": False + } + }, + + "type": "array", + "items": {"$ref": "#/definitions/service"} +} + + +def test_access_services(client): + rv = client.get( + '/msr/access-services', + 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, ACCESS_SERVICES_LIST_SCHEMA) + + assert response_data # test data is non-empty + -- GitLab