| #!/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:\ngrahTopo.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/topology/links/json" % (host,port) |
| |
| # { |
| # "dst-port": 2, |
| # "dst-switch": "00:00:00:00:00:00:00:0a", |
| # "src-port": 3, |
| # "src-switch": "00:00:00:00:00:00:00:0c" |
| # } |
| |
| links = simple_json_get(URL) |
| nodeMap = {} |
| |
| sys.stderr.write("Writing to %s.dot ..." % (host)) |
| f = open("%s.dot" % host, 'w') |
| |
| f.write( "digraph Deps {\n") |
| |
| for link in links: |
| # sys.stderr.write("Discovered module %s\n" % mod) |
| if not link['dst-switch'] in nodeMap: |
| sw = link['dst-switch'] |
| nodeMap[sw] = "n%d" % len(nodeMap) |
| f.write(" %s [ label=\"dpid=%s\", color=\"blue\"];\n" % (nodeMap[sw], sw)) |
| |
| if not link['src-switch'] in nodeMap: |
| sw = link['src-switch'] |
| nodeMap[sw] = "n%d" % len(nodeMap) |
| f.write(" %s [ label=\"dpid=%s\", color=\"blue\"];\n" % (nodeMap[sw], sw)) |
| |
| |
| f.write(" %s -> %s [ label=\"%s\"];\n" % ( |
| nodeMap[link['dst-switch']], |
| nodeMap[link['src-switch']], |
| "src_port %d --> dst_port %d" % (link['src-port'],link['dst-port']) |
| ) |
| ) |
| |
| |
| f.write("}\n") |
| f.close(); |
| sys.stderr.write("Now type\ndot -Tpdf -o %s.pdf %s.dot\n" % ( |
| host, host)) |
| |