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 back / childs references
localhost:/> tree service-instance/f8e191c5-83fa-47f1-a242-e8ad7cab46c0
service-instance/f8e191c5-83fa-47f1-a242-e8ad7cab46c0 default-domain:project:a2fb6399-18ce-44ec-839d-d373221a6a8f
├── loadbalancer/a2fb6399-18ce-44ec-839d-d373221a6a8f default-domain:project:lbv2
│ └── loadbalancer-listener/434b7b92-b68a-41f6-8321-8e7e2519d483 default-domain:project:lbv2_listener
│ └── loadbalancer-pool/82cce54d-b13a-427c-bac6-fb7e976bcf5f default-domain:project:lbv2_pool
│ ├── loadbalancer-member/cc6e4c32-92c1-4668-879d-d6802f8ad3de default-domain:project:lbv2_pool:cc6e4c32-92c1-4668-879d-d6802f8ad3de
│ └── loadbalancer-member/fb30633f-407b-461d-bf20-3ac9f0cbe504 default-domain:project:lbv2_pool:fb30633f-407b-461d-bf20-3ac9f0cbe504
├── virtual-machine/68243a56-298d-4354-a077-b41b6bb55b7c default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f__1
│ └── virtual-machine-interface/4a0bf808-19d7-48e9-b076-54064bebaf2e default-domain:project:default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f__1__right__1
│ └── instance-ip/44a9dc2a-446f-4d34-9148-4a2cc1f9a6f7 default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f-right
└── virtual-machine/114be9ed-ac45-4dc8-9f45-559470037cfd default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f__2
└── virtual-machine-interface/43afc4fe-8a84-47ba-96d9-73a8dd1d6b63 default-domain:project:default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f__2__right__1
└── instance-ip/44a9dc2a-446f-4d34-9148-4a2cc1f9a6f7 default-domain__project__a2fb6399-18ce-44ec-839d-d373221a6a8f-right
# tree of parents / references
admin@localhost:/> tree -r routing-instance/f792b52d-ff69-487e-b2a5-c13060e3ce77
routing-instance/f792b52d-ff69-487e-b2a5-c13060e3ce77 default-domain:project:test1:test1
├── route-target/7454c39a-b3c7-4d42-b766-bd276710d0b1 target:64518:8000133
└── virtual-network/ce88182e-4e6e-4c61-9df1-7ffb24543578 default-domain:project:test1
├── network-ipam/d6bdafea-58d2-4240-8c65-2acf837d6750 default-domain:default-project:default-network-ipam
│ └── project/acb58362-0272-4d27-97a1-da4ac1e2c5e3 default-domain:default-project
│ └── domain/ff62f8f7-cccd-4a30-ba32-2ee3764fac79 default-domain
└── project/0ed483e0-83ef-4f70-8250-1fcfa5d98c0e default-domain:project
└── domain/ff62f8f7-cccd-4a30-ba32-2ee3764fac79 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 refs / parents",
action="store_true", default=False)
def _create_tree(self, resource, parent_path):
if resource.uuid not in self._cache:
self._cache[resource.uuid] = resource.fetch()
else:
resource = self._cache[resource.uuid]
tree = {
'node': [str(self.current_path(resource)),
str(resource.fq_name)],
'childs': []
}
if not self.reverse:
childs = list(resource.back_refs) + list(resource.children)
else:
try:
parents = [resource.parent]
except ResourceMissing:
parents = []
childs = list(resource.refs) + parents
# 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):
resources = expand_paths(paths,
predicate=lambda r: isinstance(r, Resource))
self._cache = {}
self.reverse = reverse
trees = parallel_map(self._create_tree,
resources,
args=(Path('/'),),
workers=50)
return '\n'.join([format_tree(tree) for tree in trees])