Skip to content
Snippets Groups Projects
circuit_tree.py 4.09 KiB
import json
import os
from operator import itemgetter

import click
import redis
from tree_format import format_tree

from inventory_provider.db.ims import IMS, CIRCUIT_PROPERTIES, InventoryStatus

username = 'TEST05'
password = ''
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.argument('root_circuit_identifier', type=click.STRING, required=True)
def cli(carriers, local, root_circuit_identifier):
    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

        try:
            root_circuit_identifier = int(root_circuit_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_circuit_identifier.lower() == details['name'].lower():
                    root_circuit_identifier = details['id']
                    break
            else:
                print(f'No circuit found for: {root_circuit_identifier}')
                exit(0)
        tree = _get_childcircuit_tree_local(root_circuit_identifier)
    else:

        def _get_childcircuit_tree(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(
                        child_circuit[childid]
                    ))
                _tree.append(children)
            else:
                _tree.append([])
            return _tree

        try:
            root_circuit_identifier = int(root_circuit_identifier)
        except ValueError:
            root_circuit = \
                ds.get_entity_by_name('circuit', root_circuit_identifier)
            if root_circuit:
                root_circuit_identifier = root_circuit['id']
            else:
                print(f'No circuit found for: {root_circuit_identifier}')
                exit(0)

        tree = _get_childcircuit_tree(root_circuit_identifier)
    print(format_tree(
        tree, format_node=itemgetter(0), get_children=itemgetter(1))
    )


if __name__ == '__main__':
    # 659386
    cli()