-
Robert Latta authoredRobert Latta authored
circuit_tree.py 4.76 KiB
import json
import os
from operator import itemgetter
import click
import redis
from click import BadParameter
from tree_format import format_tree
from inventory_provider.db.ims import IMS, CIRCUIT_PROPERTIES, InventoryStatus
username = 'TEST05'
password = 'robert_Testing250'
bt = os.getenv('IMS_BT')
ds = IMS('http://83.97.94.128:2080/api', username, password, bt)
NAV_PROPS = [
CIRCUIT_PROPERTIES['Speed'],
CIRCUIT_PROPERTIES['Product']
]
@click.command()
@click.option('-c', 'carriers', is_flag=True)
@click.option('-l', 'local', is_flag=True)
@click.option('-i', 'interface_', is_flag=True)
@click.argument('root_identifier', type=click.STRING, required=True)
def cli(carriers, local, interface_, root_identifier):
if interface_ and not local:
raise BadParameter('-i flag only works with -l flag')
if local:
if carriers:
children_prop = 'carrier-circuits'
else:
children_prop = 'sub-circuits'
else:
if carriers:
children_prop = 'carriercircuits'
childid = 'carriercircuitid'
NAV_PROPS.append(CIRCUIT_PROPERTIES['CarrierCircuits'])
else:
children_prop = 'subcircuits'
childid = 'subcircuitid'
NAV_PROPS.append(CIRCUIT_PROPERTIES['SubCircuits'])
if local:
r = redis.StrictRedis(
host='localhost', db=0, decode_responses=True,
encoding='utf-8')
def _get_childcircuit_tree_local(circuit_id):
circuit = r.get(f'ims:circuit_hierarchy:{circuit_id}')
if not circuit:
return None
circuit = json.loads(circuit)[0]
_tree = [
f'{circuit["id"]} -- {circuit["name"]} -- '
f'prod: {circuit["product"]} -- '
f'spd: {circuit["speed"]} -- '
f'status: {circuit["status"]}'
]
if circuit.get(children_prop, None):
children = []
for child_id in circuit[children_prop]:
v = _get_childcircuit_tree_local(child_id)
if v:
children.append(v)
_tree.append(children)
else:
_tree.append([])
return _tree
if interface_:
if_services = r.get(f'ims:interface_services:{root_identifier}')
if if_services:
root_identifiers = [s['id'] for s in json.loads(if_services)]
children = []
for id_ in root_identifiers:
children.append(_get_childcircuit_tree_local(id_))
tree = [root_identifier, children]
else:
print(f'No circuit found for: {root_identifier}')
exit(0)
else:
try:
root_identifier = int(root_identifier)
except ValueError:
for k in r.scan_iter('ims:circuit_hierarchy:*', count=2000):
ch = r.get(k)
details = json.loads(ch)[0]
if root_identifier.lower() == details['name'].lower():
root_identifier = details['id']
break
else:
print(f'No circuit found for: {root_identifier}')
exit(0)
tree = _get_childcircuit_tree_local(root_identifier)
else:
def _get_childcircuit_tree_remote(circuit_id):
circuit = ds.get_entity_by_id(
'circuit', circuit_id, navigation_properties=NAV_PROPS)
_tree = [
f'{circuit["id"]} -- {circuit["name"]} -- '
f'prod: {circuit["product"]["name"]} -- '
f'spd: {circuit["speed"]["name"]} -- '
f'status: {InventoryStatus(circuit["inventorystatusid"]).name}'
]
if circuit[children_prop]:
children = []
for child_circuit in circuit[children_prop]:
children.append(_get_childcircuit_tree_remote(
child_circuit[childid]
))
_tree.append(children)
else:
_tree.append([])
return _tree
try:
root_identifier = int(root_identifier)
except ValueError:
root_circuit = \
ds.get_entity_by_name('circuit', root_identifier)
if root_circuit:
root_identifier = root_circuit['id']
else:
print(f'No circuit found for: {root_identifier}')
exit(0)
tree = _get_childcircuit_tree_remote(root_identifier)
print(format_tree(
tree, format_node=itemgetter(0), get_children=itemgetter(1))
)
if __name__ == '__main__':
# 659386
cli()