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()