From 8b13a7f070db2f2026143f1a98ac47176d15d3cb Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Tue, 8 Jan 2019 15:45:34 +0100 Subject: [PATCH] added basic alarmsdb table cache sample --- inventory_provider/alarmsdb.py | 14 +++++++++++++ inventory_provider/routes/jobs.py | 11 ++++++++++ inventory_provider/tasks/worker.py | 33 ++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/alarmsdb.py index b3256e10..9b03fbca 100644 --- a/inventory_provider/alarmsdb.py +++ b/inventory_provider/alarmsdb.py @@ -60,3 +60,17 @@ def get_last_known_interface_status(connection, equipment, interface): result = get_last_known_juniper_link_interface_status( connection, equipment, interface) return result + + +def _load_juniper_servers_table(connection): + with db.cursor(connection) as crs: + crs.execute('select ip_address, project_name from juniper_servers') + for row in crs.fetchall(): + yield { + 'ip_address': row[0], + 'project_name': row[1] + } + + +def load_cache(connection): + yield "juniper_servers", list(_load_juniper_servers_table(connection)) \ No newline at end of file diff --git a/inventory_provider/routes/jobs.py b/inventory_provider/routes/jobs.py index b1a78c86..315c3e8d 100644 --- a/inventory_provider/routes/jobs.py +++ b/inventory_provider/routes/jobs.py @@ -38,6 +38,17 @@ def update(): return Response("OK") +@routes.route("/update-startup", methods=['GET', 'POST']) +def startup_update(): + task_logger = logging.getLogger(TASK_LOGGER_NAME) + task_logger.debug( + 'launching task: ' + 'inventory_provider.tasks.worker.update_alarmsdb_cache') + app.send_task( + 'inventory_provider.tasks.worker.update_alarmsdb_cache') + return Response("OK") + + @routes.route("update-services", methods=['GET']) def update_service(): config = current_app.config['INVENTORY_PROVIDER_CONFIG'] diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 78f8ef78..8f2efb84 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -6,8 +6,10 @@ import redis from lxml import etree from inventory_provider.tasks.app import app +from inventory_provider import alarmsdb from inventory_provider import config from inventory_provider import constants +from inventory_provider import db from inventory_provider import environment from inventory_provider import snmp from inventory_provider import juniper @@ -38,6 +40,25 @@ class InventoryTask(Task): "saved %s, key %s" % (hostname, key)) return "OK" + @staticmethod + def save_value(key, value): + assert isinstance(value, str), \ + "sanity failure: expected string data as value" + r = redis.StrictRedis( + host=InventoryTask.config["redis"]["hostname"], + port=InventoryTask.config["redis"]["port"]) + r.set( + name=key, + value=value) + InventoryTask.logger.debug("saved %s" % key) + return "OK" + + @staticmethod + def save_value_json(key, data_obj): + InventoryTask.save_value( + key, + json.dumps(data_obj)) + @staticmethod def save_key_json(hostname, key, data_obj): InventoryTask.save_key( @@ -102,3 +123,15 @@ def netconf_refresh_config(self, hostname): juniper.load_config(hostname, InventoryTask.config["ssh"])) logger.debug('FINISHED: netconf_refresh_config(%r)' % hostname) + + +@app.task(bind=InventoryTask) +def update_alarmsdb_cache(self): + logger = logging.getLogger(constants.TASK_LOGGER_NAME) + logger.debug('STARTING: update_alarmsdb_cache') + + with db.connection(InventoryTask.config["alarms-db"]) as cx: + for table_name, data in alarmsdb.load_cache(cx): + InventoryTask.save_value_json('alarmsdb:%s' % table_name, data) + + logger.debug('FINISHED: update_alarmsdb_cache') -- GitLab