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