diff --git a/inventory_provider/opsdb.py b/inventory_provider/opsdb.py new file mode 100644 index 0000000000000000000000000000000000000000..01a4390b2ba53bf112185a508da8b760365ef42b --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..b515bf443de6842d004aa35901b3d92bbeb19772 --- /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")