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