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