record-style output in color
http://graphviz.org/doc/info/shapes.html#record
This commit is contained in:
parent
0dc41a015c
commit
de1d39175a
1 changed files with 34 additions and 22 deletions
|
@ -7,15 +7,38 @@ import json
|
|||
from graphviz import Graph
|
||||
|
||||
dot = Graph(comment='Docker Network Graph',
|
||||
graph_attr=dict( rankdir="LR")
|
||||
graph_attr=dict( rankdir="TB", packmode='graph', pack='true')
|
||||
)
|
||||
|
||||
docker_client = Client(os.environ.get("DOCKER_HOST", "unix:///var/run/docker.sock"))
|
||||
|
||||
#pprint.pprint(docker_client.networks())
|
||||
def dump_json(obj):
|
||||
print json.dumps(obj, indent=4)
|
||||
|
||||
for c in sorted(docker_client.containers()):
|
||||
name = c['Names'][0]
|
||||
container_id = c['Id']
|
||||
|
||||
node_id = 'container_%s' % container_id
|
||||
|
||||
iface_labels = []
|
||||
|
||||
for net_name, net_info in c['NetworkSettings']['Networks'].iteritems():
|
||||
label_iface = "<%s> %s" % (net_info['EndpointID'], net_info['IPAddress'])
|
||||
|
||||
iface_labels.append(label_iface)
|
||||
|
||||
print '|'.join(iface_labels)
|
||||
|
||||
|
||||
dot.node(node_id,
|
||||
shape='record',
|
||||
label="{ %s | { %s } }" % (name, '|'.join(iface_labels)),
|
||||
fillcolor='#ff9999',
|
||||
style='filled')
|
||||
|
||||
|
||||
|
||||
for net in sorted(docker_client.networks()):
|
||||
#print "Net"
|
||||
net_name = net['Name']
|
||||
|
@ -38,35 +61,24 @@ for net in sorted(docker_client.networks()):
|
|||
|
||||
net_node_id = "net_%s" % (net_name,)
|
||||
|
||||
net_label_html = '<br/>'.join([s for s in ['<font color="#77777"><i>network</i></font>', net_name, subnet, gateway] if s != None])
|
||||
net_label_html = '<br/>'.join([s for s in ['<font color="#777777"><i>network</i></font>', net_name, subnet, gateway] if s != None])
|
||||
|
||||
dot.node(net_node_id, label="<%s>" % net_label_html, shape='note')
|
||||
dot.node(net_node_id,
|
||||
shape='record',
|
||||
label="{<gw_iface> %s| %s }" % (gateway, net_name),
|
||||
fillcolor='#99ff99',
|
||||
style='filled')
|
||||
|
||||
|
||||
for container_id, container in sorted(net['Containers'].iteritems()):
|
||||
dump_json(container)
|
||||
print " * ", container['Name'], container['IPv4Address'], container['IPv6Address']
|
||||
|
||||
container_node_id = 'container_%s' % container_id
|
||||
label_html = "<font color='#777777'><i>container</i></font><br/>%s" % container['Name']
|
||||
|
||||
dot.node(container_node_id,
|
||||
label="<%s>" % label_html,
|
||||
shape='component')
|
||||
container_iface_ref = "%s:%s" % (container_node_id, container['EndpointID'])
|
||||
|
||||
|
||||
label_html = "%s<br/>%s" % (container['IPv4Address'].split('/')[0], container['IPv6Address'])
|
||||
|
||||
container_iface_id = "iface_%s" % container['IPv4Address']
|
||||
|
||||
dot.node(container_iface_id,
|
||||
label="<%s>" % label_html,
|
||||
shape='box')
|
||||
|
||||
|
||||
|
||||
|
||||
dot.edge(container_node_id, container_iface_id)
|
||||
dot.edge(container_iface_id, net_node_id)
|
||||
dot.edge(container_iface_ref, net_node_id+":gw_iface")
|
||||
|
||||
print dot.source
|
||||
dot.render('dng.gv')
|
||||
|
|
Loading…
Reference in a new issue