From a9573048f6aceea17c6d6830e06a42f4c60f91e2 Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Thu, 22 Nov 2018 16:00:36 +0100 Subject: [PATCH] added test route for alarmsdb connection --- inventory_provider/__init__.py | 3 ++ inventory_provider/alarmsdb.py | 1 + inventory_provider/routes/alarmsdb.py | 41 +++++++++++++++++++++++++++ inventory_provider/routes/opsdb.py | 14 ++------- 4 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 inventory_provider/routes/alarmsdb.py diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py index 40a08173..a8e55e8e 100644 --- a/inventory_provider/__init__.py +++ b/inventory_provider/__init__.py @@ -26,6 +26,9 @@ def create_app(): from inventory_provider.routes import opsdb app.register_blueprint(opsdb.routes, url_prefix='/opsdb') + from inventory_provider.routes import alarmsdb + app.register_blueprint(alarmsdb.routes, url_prefix='/alarmsdb') + if "SETTINGS_FILENAME" not in os.environ: assert False, \ "environment variable SETTINGS_FILENAME' must be defined" diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/alarmsdb.py index 01a4390b..ee16e0dd 100644 --- a/inventory_provider/alarmsdb.py +++ b/inventory_provider/alarmsdb.py @@ -40,3 +40,4 @@ def _db_test(db, router): crs.execute(query, (router['hostname'],)) for (absid,) in crs: database_logger.debug("absid: %r" % absid) + yield absid \ No newline at end of file diff --git a/inventory_provider/routes/alarmsdb.py b/inventory_provider/routes/alarmsdb.py new file mode 100644 index 00000000..ce067529 --- /dev/null +++ b/inventory_provider/routes/alarmsdb.py @@ -0,0 +1,41 @@ +import functools +import json + +from flask import Blueprint, request, Response, current_app +from inventory_provider import alarmsdb + +routes = Blueprint("inventory-alarmsdb-query-routes", __name__) + + +def require_accepts_json(f): + """ + used as a route handler decorator to return an error + unless the request allows responses with type "application/json" + :param f: the function to be decorated + :return: the decorated function + """ + @functools.wraps(f) + def decorated_function(*args, **kwargs): + # TODO: use best_match to disallow */* ...? + if not request.accept_mimetypes.accept_json: + return Response( + response="response will be json", + status=406, + mimetype="text/html") + return f(*args, **kwargs) + return decorated_function + + +@routes.route("/test", methods=['GET', 'POST']) +@require_accepts_json +def alarmsdb_test(): + config = current_app.config['INVENTORY_PROVIDER_CONFIG'] + + result = {} + with alarmsdb.connection(config['alarms-db']) as db: + for r in config['routers']: + result[r['hostname']] = list(alarmsdb._db_test(db, r)) + + return Response( + json.dumps(result), + mimetype="application/json") diff --git a/inventory_provider/routes/opsdb.py b/inventory_provider/routes/opsdb.py index 92cea909..1b3195ec 100644 --- a/inventory_provider/routes/opsdb.py +++ b/inventory_provider/routes/opsdb.py @@ -6,11 +6,6 @@ from inventory_provider import opsdb routes = Blueprint("inventory-opsdb-query-routes", __name__) -VERSION = { - "api": "0.1", - "module": "0.1" -} - def require_accepts_json(f): """ @@ -35,14 +30,11 @@ def require_accepts_json(f): @require_accepts_json def opsdb_test(): config = current_app.config['INVENTORY_PROVIDER_CONFIG'] - result = [] - with opsdb.connection(config['ops-db']) as db: + result = {} + with opsdb.connection(config['ops-db']) as db: for r in config['routers']: - result.append({ - 'router': r['hostname'], - 'info': list(opsdb._db_test(db, r)) - }) + result[r['hostname']] = list(opsdb._db_test(db, r)) return Response( json.dumps(result), -- GitLab