diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/alarmsdb.py index c3e7d5bb57d843e1134a0a7c9bb2e7eb61bf4092..43831dbeb8d9e5d380f3f0e7c300c58687ecca0f 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 ce06752987a037d8958f227a4b32268805c4b5c9..3da931b2a31289b83636c737d42a8f26fd1a2b7c 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")