Skip to content
Snippets Groups Projects
Commit f0b09c6b authored by Erik Reid's avatar Erik Reid
Browse files

Finished feature redis-inventory-cache.

parents 6db59626 571f579a
Branches
Tags
No related merge requests found
...@@ -29,9 +29,23 @@ CONFIG_SCHEMA = { ...@@ -29,9 +29,23 @@ CONFIG_SCHEMA = {
}, },
"required": ["private-key", "known-hosts"], "required": ["private-key", "known-hosts"],
"additionalProperties": False "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 "additionalProperties": False
} }
......
...@@ -3,6 +3,7 @@ import logging ...@@ -3,6 +3,7 @@ import logging
from multiprocessing import Process, Queue from multiprocessing import Process, Queue
import click import click
import redis
from inventory_provider import constants from inventory_provider import constants
from inventory_provider import snmp from inventory_provider import snmp
...@@ -24,7 +25,7 @@ def ssh_exec_commands_q(hostname, ssh_params, commands, q): ...@@ -24,7 +25,7 @@ def ssh_exec_commands_q(hostname, ssh_params, commands, q):
threading_logger.debug("[<<EXIT] exec_router_commands_q: %r" % hostname) 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) threading_logger = logging.getLogger(constants.THREADING_LOGGER_NAME)
...@@ -52,21 +53,26 @@ def get_router_details(router, params, q): ...@@ -52,21 +53,26 @@ def get_router_details(router, params, q):
command_output = commands_proc_queue.get() command_output = commands_proc_queue.get()
assert len(command_output) == len(commands) 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): for c, o in zip(commands, command_output):
if c["key"]: 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() commands_proc.join()
threading_logger.debug("... got commands result & joined: %r" % router) threading_logger.debug("... got commands result & joined: %r" % router)
threading_logger.debug("waiting for snmp ifc results: %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() snmpifc_proc.join()
threading_logger.debug("... got snmp ifc result & joined: %r" % router) threading_logger.debug("... got snmp ifc result & joined: %r" % router)
q.put(result)
threading_logger.debug("[<<EXIT]get_router_details: %r" % router) threading_logger.debug("[<<EXIT]get_router_details: %r" % router)
...@@ -76,16 +82,14 @@ def load_network_details(params): ...@@ -76,16 +82,14 @@ def load_network_details(params):
processes = [] processes = []
for r in params["routers"]: for r in params["routers"]:
q = Queue() p = Process(target=get_router_details, args=(r, params))
p = Process(target=get_router_details, args=(r, params, q))
p.start() p.start()
processes.append({"router": r, "process": p, "queue": q}) processes.append({"router": r, "process": p})
result = {} result = {}
for p in processes: for p in processes:
threading_logger.debug( threading_logger.debug(
"waiting for get_router_details result: %r" % p["router"]) "waiting for get_router_details result: %r" % p["router"])
result[p["router"]["hostname"]] = p["queue"].get()
p["process"].join() p["process"].join()
threading_logger.debug( threading_logger.debug(
"got result and joined get_router_details proc: %r" % p["router"]) "got result and joined get_router_details proc: %r" % p["router"])
...@@ -106,11 +110,25 @@ def _validate_config(ctx, param, value): ...@@ -106,11 +110,25 @@ def _validate_config(ctx, param, value):
default=open("config.json"), default=open("config.json"),
callback=_validate_config) callback=_validate_config)
def cli(params): 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" filename = "/tmp/router-info.json"
logging.debug("writing output to: " + filename) logging.debug("writing output to: " + filename)
with open(filename, "w") as f: with open(filename, "w") as f:
f.write(json.dumps(network_details)) f.write(json.dumps(result))
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -4,5 +4,6 @@ pysnmp ...@@ -4,5 +4,6 @@ pysnmp
jsonschema jsonschema
paramiko paramiko
flask flask
redis
pytest pytest
...@@ -15,6 +15,7 @@ setup( ...@@ -15,6 +15,7 @@ setup(
'pysnmp', 'pysnmp',
'jsonschema', 'jsonschema',
'paramiko', 'paramiko',
'flask' 'flask',
'redis'
] ]
) )
...@@ -99,6 +99,10 @@ def data_config_filename(tmp_dir_name): ...@@ -99,6 +99,10 @@ def data_config_filename(tmp_dir_name):
"ssh": { "ssh": {
"private-key": "private-key-filename", "private-key": "private-key-filename",
"known-hosts": "known-hosts=filename" "known-hosts": "known-hosts=filename"
},
"redis": {
"hostname": "xxxxxx",
"port": 6379
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment