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