| #!/usr/bin/python |
| |
| import urllib2 |
| import json |
| import sys |
| |
| |
| def simple_json_get(url): |
| return json.loads(urllib2.urlopen(url).read()) |
| |
| |
| def shorten(s): |
| return s.replace('net.floodlightcontroller','n.f' |
| ).replace('com.bigswitch','c.b') |
| |
| def usage(s): |
| sys.stderr.write("Usage:\ngrahDeps.py hostname [port]\n%s" % s) |
| sys.stderr.write("\n\n\n\n writes data to 'hostname.dot' for use with graphviz\n") |
| sys.exit(1) |
| |
| |
| if __name__ == '__main__': |
| |
| host='localhost' |
| port=8080 |
| |
| if len(sys.argv) == 1 or sys.argv[1] == '-h' or sys.argv[1] == '--help': |
| usage("need to specify hostname") |
| |
| host = sys.argv[1] |
| if len(sys.argv) > 2: |
| port = int(sys.argv[2]) |
| |
| sys.stderr.write("Connecting to %s:%d ..." % (host,port)) |
| URL="http://%s:%d/wm/core/module/loaded/json" % (host,port) |
| |
| deps = simple_json_get(URL) |
| serviceMap = {} |
| nodeMap = {} |
| nodeCount = 0 |
| |
| sys.stderr.write("Writing to %s.dot ..." % (host)) |
| f = open("%s.dot" % host, 'w') |
| |
| f.write( "digraph Deps {\n") |
| |
| for mod, info in deps.iteritems(): |
| # sys.stderr.write("Discovered module %s\n" % mod) |
| nodeMap[mod] = "n%d" % nodeCount |
| nodeCount += 1 |
| label = shorten(mod) + "\\n" |
| for service, serviceImpl in info['provides'].iteritems(): |
| # sys.stderr.write(" Discovered service %s implemented with %s\n" % (service,serviceImpl)) |
| label += "\\nService=%s" % shorten(service) |
| serviceMap[serviceImpl] = mod |
| f.write(" %s [ label=\"%s\", color=\"blue\"];\n" % (nodeMap[mod], label)) |
| |
| f.write("\n") # for readability |
| |
| for mod, info in deps.iteritems(): |
| for dep, serviceImpl in info['depends'].iteritems(): |
| f.write(" %s -> %s [ label=\"%s\"];\n" % ( |
| nodeMap[mod], |
| shorten(nodeMap[serviceMap[serviceImpl]]), |
| shorten(dep))) |
| |
| |
| f.write("}\n") |
| f.close(); |
| sys.stderr.write("Now type\ndot -Tpdf -o %s.pdf %s.dot\n" % ( |
| host, host)) |
| |