From c7af73696ea2685a59178bbf24cab0264ed94e4c Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Wed, 9 Jan 2019 13:51:26 +0000
Subject: [PATCH] Added addiotional route and implementation for getting
 interface status from cache

---
 inventory_provider/alarmsdb.py    | 29 +++++++++++++----------------
 inventory_provider/routes/data.py | 20 ++++++++++++++++++--
 2 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/alarmsdb.py
index 89117314..7eb2cba5 100644
--- a/inventory_provider/alarmsdb.py
+++ b/inventory_provider/alarmsdb.py
@@ -1,15 +1,14 @@
 from inventory_provider import db
 
 
-def get_last_known_infinera_interface_status(connection, equipment, interface):
+def get_last_known_infinera_interface_status(crs, 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 db.cursor(connection) as crs:
-        crs.execute(query, (search_string,))
-        result = crs.fetchone()
+    crs.execute(query, (search_string,))
+    result = crs.fetchone()
     if not result:
         return "unknown"
     elif result[0] == "Raised":
@@ -18,13 +17,12 @@ def get_last_known_infinera_interface_status(connection, equipment, interface):
         return "up"
 
 
-def get_last_known_coriant_interface_status(connection, equipment, interface):
+def get_last_known_coriant_interface_status(crs, 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 db.cursor(connection) as crs:
-        crs.execute(query, (equipment, interface + "-%"))
-        result = crs.fetchone()
+    crs.execute(query, (equipment, interface + "-%"))
+    result = crs.fetchone()
     if not result:
         return "unknown"
     elif result[0] == "Raised":
@@ -34,14 +32,13 @@ def get_last_known_coriant_interface_status(connection, equipment, interface):
 
 
 def get_last_known_juniper_link_interface_status(
-        connection, equipment, interface):
+        crs, 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 db.cursor(connection) as crs:
-        crs.execute(query, ('lo0.' + equipment, interface))
-        result = crs.fetchone()
+    crs.execute(query, ('lo0.' + equipment, interface))
+    result = crs.fetchone()
     if not result:
         return "unknown"
     elif result[0] == 0:
@@ -50,15 +47,15 @@ def get_last_known_juniper_link_interface_status(
         return "up"
 
 
-def get_last_known_interface_status(connection, equipment, interface):
+def get_last_known_interface_status(crs, equipment, interface):
     result = get_last_known_infinera_interface_status(
-        connection, equipment, interface)
+        crs, equipment, interface)
     if result == "unknown":
         result = get_last_known_coriant_interface_status(
-            connection, equipment, interface)
+            crs, equipment, interface)
     if result == "unknown":
         result = get_last_known_juniper_link_interface_status(
-            connection, equipment, interface)
+            crs, equipment, interface)
     return result
 
 
diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py
index 3cc9e58f..30810e45 100644
--- a/inventory_provider/routes/data.py
+++ b/inventory_provider/routes/data.py
@@ -2,11 +2,12 @@ import functools
 import json
 import pkg_resources
 
-from flask import Blueprint, request, Response, current_app
+from flask import Blueprint, jsonify, request, Response, current_app
 from lxml import etree
 import redis
 
-from inventory_provider import juniper
+from inventory_provider import db, juniper
+from inventory_provider.storage import external_inventory
 
 routes = Blueprint("inventory-data-query-routes", __name__)
 
@@ -162,3 +163,18 @@ def bgp_configs(hostname):
     return Response(
         json.dumps(routes),
         mimetype="application/json")
+
+
+@routes.route("/interfaces/status/<hostname>/<path:interface>",
+              methods=['GET', 'POST'])
+@require_accepts_json
+def interface_statuses(hostname, interface):
+    r = db.get_redis()
+    result = r.hget(external_inventory.interface_status_key,
+                    "{}::{}".format(hostname, interface))
+    if not result:
+        return Response(
+            response="no available info for {} {}".format(hostname, interface),
+            status=404,
+            mimetype="text/html")
+    return jsonify({"status": result.decode('utf-8')})
-- 
GitLab