From cb92b26d71154482ea65b47db561277a8e8bd8f0 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Fri, 7 Dec 2018 14:30:06 +0000
Subject: [PATCH] Added alarmsdb interface check implementation and route

---
 inventory_provider/alarmsdb.py        | 69 ++++++++++++++++++++++-----
 inventory_provider/routes/alarmsdb.py | 13 +++--
 2 files changed, 65 insertions(+), 17 deletions(-)

diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/alarmsdb.py
index c3e7d5bb..43831dbe 100644
--- a/inventory_provider/alarmsdb.py
+++ b/inventory_provider/alarmsdb.py
@@ -1,10 +1,6 @@
 import contextlib
-import logging
-
 import mysql.connector
 
-from inventory_provider.constants import DATABASE_LOGGER_NAME
-
 
 @contextlib.contextmanager
 def connection(alarmsdb):
@@ -32,12 +28,61 @@ def cursor(cnx):
             csr.close()
 
 
-def _db_test(db, router):
-    database_logger = logging.getLogger(DATABASE_LOGGER_NAME)
+def get_last_known_infinera_interface_status(db, equipment, interface):
+    query = "SELECT status FROM infinera_alarms" \
+            " WHERE" \
+            " CONCAT(ne_name, '-', REPLACE(object_name, 'T', '')) = %s" \
+            " ORDER BY ne_init_time DESC, ne_clear_time DESC LIMIT 1"
+    search_string = equipment + "-" + interface
+    with cursor(db) as crs:
+        crs.execute(query, (search_string,))
+        result = crs.fetchone()
+    if not result:
+        return "unknown"
+    elif result[0] == "Raised":
+        return "down"
+    else:
+        return "up"
+
+
+def get_last_known_coriant_interface_status(db, equipment, interface):
+    query = "SELECT status FROM coriant_alarms" \
+            " WHERE ne_id_name = %s AND entity_string LIKE %s" \
+            " ORDER BY last_event_time DESC LIMIT 1"
     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)
-            yield absid
+        crs.execute(query, (equipment, interface + "-%"))
+        result = crs.fetchone()
+    if not result:
+        return "unknown"
+    elif result[0] == "Raised":
+        return "down"
+    else:
+        return "up"
+
+
+def get_last_known_juniper_link_interface_status(db, equipment, interface):
+    query = "SELECT IF(link_admin_status = 'up'" \
+            " AND link_oper_status = 'up', 1, 0) AS up FROM juniper_alarms" \
+            " WHERE equipment_name = %s AND link_interface_name = %s" \
+            " ORDER BY alarm_id DESC LIMIT 1"
+    with cursor(db) as crs:
+        crs.execute(query, ('lo0.' + equipment, interface))
+        result = crs.fetchone()
+    if not result:
+        return "unknown"
+    elif result[0] == 0:
+        return "down"
+    else:
+        return "up"
+
+
+def get_last_known_interface_status(db, equipment, interface):
+    result = get_last_known_infinera_interface_status(
+        db, equipment, interface)
+    if result == "unknown":
+        result = get_last_known_coriant_interface_status(
+                db, equipment, interface)
+    if result == "unknown":
+        result = get_last_known_juniper_link_interface_status(
+            db, equipment, interface)
+    return result
diff --git a/inventory_provider/routes/alarmsdb.py b/inventory_provider/routes/alarmsdb.py
index ce067529..3da931b2 100644
--- a/inventory_provider/routes/alarmsdb.py
+++ b/inventory_provider/routes/alarmsdb.py
@@ -26,16 +26,19 @@ def require_accepts_json(f):
     return decorated_function
 
 
-@routes.route("/test", methods=['GET', 'POST'])
+@routes.route("/interface-status", methods=['GET', 'POST'])
 @require_accepts_json
-def alarmsdb_test():
+def get_interface_status():
     config = current_app.config['INVENTORY_PROVIDER_CONFIG']
 
-    result = {}
+    equipment = request.args.get("equipment")
+    interface = request.args.get("interface")
+
     with alarmsdb.connection(config['alarms-db']) as db:
-        for r in config['routers']:
-            result[r['hostname']] = list(alarmsdb._db_test(db, r))
+        result = {"status": alarmsdb.get_last_known_interface_status(
+            db, equipment, interface)}
 
+    print(result)
     return Response(
         json.dumps(result),
         mimetype="application/json")
-- 
GitLab