blob: 505d51642b7e180b0b498a75224a3cbc4f991f45 [file] [log] [blame]
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08001#!/usr/bin/python
2
3import urllib2
4import json
5import sys
6
7
8def simple_json_get(url):
9 return json.loads(urllib2.urlopen(url).read())
10
11
12def shorten(s):
13 return s.replace('net.floodlightcontroller','n.f'
14 ).replace('com.bigswitch','c.b')
15
16def usage(s):
17 sys.stderr.write("Usage:\ngrahDeps.py hostname [port]\n%s" % s)
18 sys.stderr.write("\n\n\n\n writes data to 'hostname.dot' for use with graphviz\n")
19 sys.exit(1)
20
21
22if __name__ == '__main__':
23
24 host='localhost'
25 port=8080
26
27 if len(sys.argv) == 1 or sys.argv[1] == '-h' or sys.argv[1] == '--help':
28 usage("need to specify hostname")
29
30 host = sys.argv[1]
31 if len(sys.argv) > 2:
32 port = int(sys.argv[2])
33
34 sys.stderr.write("Connecting to %s:%d ..." % (host,port))
35 URL="http://%s:%d/wm/core/module/loaded/json" % (host,port)
36
37 deps = simple_json_get(URL)
38 serviceMap = {}
39 nodeMap = {}
40 nodeCount = 0
41
42 sys.stderr.write("Writing to %s.dot ..." % (host))
43 f = open("%s.dot" % host, 'w')
44
45 f.write( "digraph Deps {\n")
46
47 for mod, info in deps.iteritems():
48 # sys.stderr.write("Discovered module %s\n" % mod)
49 nodeMap[mod] = "n%d" % nodeCount
50 nodeCount += 1
51 label = shorten(mod) + "\\n"
52 for service, serviceImpl in info['provides'].iteritems():
53 # sys.stderr.write(" Discovered service %s implemented with %s\n" % (service,serviceImpl))
54 label += "\\nService=%s" % shorten(service)
55 serviceMap[serviceImpl] = mod
56 f.write(" %s [ label=\"%s\", color=\"blue\"];\n" % (nodeMap[mod], label))
57
58 f.write("\n") # for readability
59
60 for mod, info in deps.iteritems():
61 for dep, serviceImpl in info['depends'].iteritems():
62 f.write(" %s -> %s [ label=\"%s\"];\n" % (
63 nodeMap[mod],
64 shorten(nodeMap[serviceMap[serviceImpl]]),
65 shorten(dep)))
66
67
68 f.write("}\n")
69 f.close();
70 sys.stderr.write("Now type\ndot -Tpdf -o %s.pdf %s.dot\n" % (
71 host, host))
72