diff --git a/inventory_provider/config.py b/inventory_provider/config.py index b6631ad366aab7a43f3dd2c6b3b432766b2c514f..36d814633db7b53fdc9038b5c373f173bf4e6326 100644 --- a/inventory_provider/config.py +++ b/inventory_provider/config.py @@ -29,9 +29,23 @@ CONFIG_SCHEMA = { }, "required": ["private-key", "known-hosts"], "additionalProperties": False + }, + "redis": { + "type": "object", + "properties": { + "hostname": {"type": "string"}, + "port": {"type": "integer"} + }, + "required": ["hostname", "port"], + "additionalProperties": False } }, - "required": ["alarms-db", "oid_list.conf", "routers_community.conf"], + "required": [ + "alarms-db", + "oid_list.conf", + "routers_community.conf", + "ssh", + "redis"], "additionalProperties": False } diff --git a/inventory_provider/router_interfaces.py b/inventory_provider/router_interfaces.py index 84127bbfecb4be844b68aab9342e3385e0b96678..95a09be5492c59710b33c6377bf50a951dd26839 100644 --- a/inventory_provider/router_interfaces.py +++ b/inventory_provider/router_interfaces.py @@ -3,6 +3,7 @@ import logging from multiprocessing import Process, Queue import click +import redis from inventory_provider import constants from inventory_provider import snmp @@ -24,7 +25,7 @@ def ssh_exec_commands_q(hostname, ssh_params, commands, q): threading_logger.debug("[<<EXIT] exec_router_commands_q: %r" % hostname) -def get_router_details(router, params, q): +def get_router_details(router, params): threading_logger = logging.getLogger(constants.THREADING_LOGGER_NAME) @@ -52,21 +53,26 @@ def get_router_details(router, params, q): command_output = commands_proc_queue.get() assert len(command_output) == len(commands) - result = {} + r = redis.StrictRedis( + host=params["redis"]["hostname"], + port=params["redis"]["port"]) for c, o in zip(commands, command_output): if c["key"]: - result[c["key"]] = c["parser"](o) - + r.hset( + name=router["hostname"], + key=c["key"], + value=json.dumps(c["parser"](o))) commands_proc.join() threading_logger.debug("... got commands result & joined: %r" % router) threading_logger.debug("waiting for snmp ifc results: %r" % router) - result["snmp-interfaces"] = snmpifc_proc_queue.get() + r.hset( + name=router["hostname"], + key="snmp-interfaces", + value=json.dumps(snmpifc_proc_queue.get())) snmpifc_proc.join() threading_logger.debug("... got snmp ifc result & joined: %r" % router) - q.put(result) - threading_logger.debug("[<<EXIT]get_router_details: %r" % router) @@ -76,16 +82,14 @@ def load_network_details(params): processes = [] for r in params["routers"]: - q = Queue() - p = Process(target=get_router_details, args=(r, params, q)) + p = Process(target=get_router_details, args=(r, params)) p.start() - processes.append({"router": r, "process": p, "queue": q}) + processes.append({"router": r, "process": p}) result = {} for p in processes: threading_logger.debug( "waiting for get_router_details result: %r" % p["router"]) - result[p["router"]["hostname"]] = p["queue"].get() p["process"].join() threading_logger.debug( "got result and joined get_router_details proc: %r" % p["router"]) @@ -106,11 +110,25 @@ def _validate_config(ctx, param, value): default=open("config.json"), callback=_validate_config) def cli(params): - network_details = load_network_details(params) + load_network_details(params) + + r = redis.StrictRedis( + host=params["redis"]["hostname"], + port=params["redis"]["port"]) + + result = {} + for hostname in r.keys(): + host = {} + for key in r.hkeys(name=hostname): + host[key.decode("utf-8")] = json.loads( + r.hget(hostname, key).decode("utf-8") + ) + result[hostname.decode("utf-8")] = host + filename = "/tmp/router-info.json" logging.debug("writing output to: " + filename) with open(filename, "w") as f: - f.write(json.dumps(network_details)) + f.write(json.dumps(result)) if __name__ == "__main__": diff --git a/requirements.txt b/requirements.txt index ea667eb9d92fa5f7855ca9f376c17a27a22e1686..9d2440c74c133be6ad934a9d78f3bb2df2bd1bfe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,6 @@ pysnmp jsonschema paramiko flask +redis pytest diff --git a/setup.py b/setup.py index 65e429b28e1424c732fa1a447ed49e7ee09e7cbc..df1c056a7d1475714452ca99c30bbdb821a5af7b 100644 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ setup( 'pysnmp', 'jsonschema', 'paramiko', - 'flask' + 'flask', + 'redis' ] ) diff --git a/test/test_data_routes.py b/test/test_data_routes.py index de7c0f809227a9aeff1a4aa9991df7451dcc93a6..811adb0df69bac7f190d05c5e42a8a8860a8bf97 100644 --- a/test/test_data_routes.py +++ b/test/test_data_routes.py @@ -99,6 +99,10 @@ def data_config_filename(tmp_dir_name): "ssh": { "private-key": "private-key-filename", "known-hosts": "known-hosts=filename" + }, + "redis": { + "hostname": "xxxxxx", + "port": 6379 } }