Source code for contrail_api_cli.commands.tree

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from ..command import Command, Arg, Option, expand_paths
from ..resource import Resource
from ..utils import format_tree, parallel_map, Path
from ..exceptions import ResourceMissing


[docs]class Tree(Command): """Show tree of references of a resource. .. code-block:: bash # tree of references admin@localhost:/> tree logical-router/dd954810-d614-4892-9ec6-9a9595cc64ff /logical-router/dd954810-d614-4892-9ec6-9a9595cc64ff default-domain:admin:router1 ├── /virtual-machine-interface/18b02f01-4300-427f-a646-0a44351034a6 default-domain:admin:18b02f01-4300-427f-a646-0a44351034a6 │ ├── /routing-instance/2f6907e9-20e7-415a-9969-bb5af375574d default-domain:admin:net2:net2 │ │ ├── /route-target/721618d4-0861-4bda-8a33-bb116584d4bb target:64512:8000005 │ │ ├── /route-target/d0e33aea-f63d-403b-a3e7-5bcef88e6053 target:64512:8000003 │ │ └── /route-target/ecd725e8-6523-428b-9811-00828926f91b target:64512:8000002 │ ├── /virtual-network/49d00de8-4351-446f-b6ee-d16dec3de413 default-domain:admin:net2 │ │ └── /network-ipam/0edc36a1-c802-47be-b230-4b462d905b93 default-domain:default-project:default-network-ipam │ └── /security-group/8282a986-b9fd-4be1-96bd-ab100bd2bb8e default-domain:admin:default ├── /virtual-machine-interface/6d9637e5-99ae-4d09-950e-50353b29411c default-domain:admin:6d9637e5-99ae-4d09-950e-50353b29411c │ ├── /routing-instance/5692de00-533a-4911-965b-dd9f6dbc6f55 default-domain:admin:net1:net1 │ │ ├── /route-target/79b5278c-a846-49f4-82ab-f1b8c05aff67 target:64512:8000001 │ │ └── /route-target/d0e33aea-f63d-403b-a3e7-5bcef88e6053 target:64512:8000003 │ ├── /virtual-network/5a9fbd42-a730-42f7-9947-be8a5d808b70 default-domain:admin:net1 │ │ └── /network-ipam/0edc36a1-c802-47be-b230-4b462d905b93 default-domain:default-project:default-network-ipam │ └── /security-group/8282a986-b9fd-4be1-96bd-ab100bd2bb8e default-domain:admin:default └── /route-target/d0e33aea-f63d-403b-a3e7-5bcef88e6053 target:64512:8000003 # tree of parents admin@localhost:/> tree -p routing-instance/5692de00-533a-4911-965b-dd9f6dbc6f55 /routing-instance/5692de00-533a-4911-965b-dd9f6dbc6f55 default-domain:admin:net1:net1 └── /virtual-network/5a9fbd42-a730-42f7-9947-be8a5d808b70 default-domain:admin:net1 └── /project/d0afbb0b-dd83-4a33-a673-9cb2b244e804 default-domain:admin └── /domain/cbc6051f-fd47-4a26-82ee-cb3482926e17 default-domain """ description = "Tree of resource references" paths = Arg(nargs="*", help="Resource path(s)", metavar='path', complete='resources::path') reverse = Option('-r', help="Show tree of back references", action="store_true", default=False) parent = Option('-p', help="Show tree of parents", action="store_true", default=False) def _create_tree(self, resource, parent_path): tree = {} resource.fetch() tree['node'] = [str(self.current_path(resource)), str(resource.fq_name)] tree['childs'] = [] if self.parent: try: childs = [resource.parent] except ResourceMissing: childs = [] elif self.reverse: childs = list(resource.back_refs) else: childs = list(resource.refs) # avoid parent -> child -> parent and parent -> parent loops for idx, child in enumerate(childs[:]): if (child.path == parent_path or child.path == resource.path): node = { 'node': [str(self.current_path(child)), str(child.fq_name)] } tree['childs'].append(node) del childs[idx] if childs: tree['childs'] += parallel_map(self._create_tree, childs, args=(resource.path,)) return tree def __call__(self, paths=None, reverse=False, parent=False): resources = expand_paths(paths, predicate=lambda r: isinstance(r, Resource)) self.reverse = reverse self.parent = parent trees = parallel_map(self._create_tree, resources, args=(Path('/'),), workers=50) return '\n'.join([format_tree(tree) for tree in trees])