Skip to content
Snippets Groups Projects
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()