From 9eb4623aa728c645177a79ccaa1f28e391ceefc9 Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Thu, 22 Nov 2018 15:44:09 +0100 Subject: [PATCH] moved routes into their own package --- inventory_provider/opsdb.py | 42 +++++++++++++++ inventory_provider/routes/__init__.py | 0 .../{data_routes.py => routes/data.py} | 0 .../{job_routes.py => routes/jobs.py} | 0 inventory_provider/routes/opsdb.py | 52 +++++++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 inventory_provider/opsdb.py create mode 100644 inventory_provider/routes/__init__.py rename inventory_provider/{data_routes.py => routes/data.py} (100%) rename inventory_provider/{job_routes.py => routes/jobs.py} (100%) create mode 100644 inventory_provider/routes/opsdb.py diff --git a/inventory_provider/opsdb.py b/inventory_provider/opsdb.py new file mode 100644 index 00000000..01a4390b --- /dev/null +++ b/inventory_provider/opsdb.py @@ -0,0 +1,42 @@ +import contextlib +import logging + +import mysql.connector + +from inventory_provider.constants import DATABASE_LOGGER_NAME + + +@contextlib.contextmanager +def connection(alarmsdb): + cx = None + try: + cx = mysql.connector.connect( + host=alarmsdb["hostname"], + user=alarmsdb["username"], + passwd=alarmsdb["password"], + db=alarmsdb["dbname"]) + yield cx + finally: + if cx: + cx.close() + + +@contextlib.contextmanager +def cursor(cnx): + csr = None + try: + csr = cnx.cursor() + yield csr + finally: + if csr: + csr.close() + + +def _db_test(db, router): + database_logger = logging.getLogger(DATABASE_LOGGER_NAME) + with cursor(db) as crs: + database_logger.debug("_db_test: %r" % router) + query = "SELECT absid FROM routers WHERE hostname = %s" + crs.execute(query, (router['hostname'],)) + for (absid,) in crs: + database_logger.debug("absid: %r" % absid) diff --git a/inventory_provider/routes/__init__.py b/inventory_provider/routes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/inventory_provider/data_routes.py b/inventory_provider/routes/data.py similarity index 100% rename from inventory_provider/data_routes.py rename to inventory_provider/routes/data.py diff --git a/inventory_provider/job_routes.py b/inventory_provider/routes/jobs.py similarity index 100% rename from inventory_provider/job_routes.py rename to inventory_provider/routes/jobs.py diff --git a/inventory_provider/routes/opsdb.py b/inventory_provider/routes/opsdb.py new file mode 100644 index 00000000..b515bf44 --- /dev/null +++ b/inventory_provider/routes/opsdb.py @@ -0,0 +1,52 @@ +import functools +import json + +from flask import Blueprint, request, Response, current_app +import redis + +routes = Blueprint("inventory-data-query-routes", __name__) + +VERSION = { + "api": "0.1", + "module": "0.1" +} + + +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("/version", methods=['GET', 'POST']) +@require_accepts_json +def version(): + return Response( + json.dumps(VERSION), + mimetype="application/json" + ) + + +@routes.route("/routers", methods=['GET', 'POST']) +@require_accepts_json +def routers(): + redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] + r = redis.StrictRedis( + host=redis_config["hostname"], + port=redis_config["port"]) + return Response( + json.dumps(list([k.decode("utf-8") for k in r.keys("*")])), + mimetype="application/json") -- GitLab