pvl.hosts-lldp: support multiple edges between nodes
authorTero Marttila <terom@paivola.fi>
Mon, 17 Mar 2014 20:30:28 +0200
changeset 388 5a034dbd641c
parent 387 75158fd28784
child 389 93e3b199cbe6
pvl.hosts-lldp: support multiple edges between nodes
bin/pvl.hosts-lldp
--- a/bin/pvl.hosts-lldp	Mon Mar 17 20:01:31 2014 +0200
+++ b/bin/pvl.hosts-lldp	Mon Mar 17 20:30:28 2014 +0200
@@ -81,13 +81,14 @@
     import pydot
 
     dot = pydot.Dot(graph_name='lldp_hosts', graph_type='digraph',
-            splines     = 'true',
+            # XXX: breaks multi-edges?
+            #splines     = 'true',
 
             sep             = '+25,25',
             overlap         = 'scalexy',
 
             # only applies to loops
-            nodesep     = 0.5,
+            #nodesep     = 0.5,
     )
     dot.set_edge_defaults(
             labeldistance   = 3.0,
@@ -131,12 +132,12 @@
         headlabel = '"{remote[port]}"'.format(remote=remote)
         taillabel = '"{local[port]}"'.format(local=local)
 
-        if (src_name, dst_name) in edges :
-            log.warning("%s <- %s: duplicate", src_name, dst_name)
+        if (src_name, local['port'], dst_name, remote['port']) in edges :
+            log.warning("%s:%s <- %s:%s: duplicate", src_name, local['port'], dst_name, remote['port'])
         
-        elif (dst_name, src_name) in edges :
+        elif (dst_name, remote['port'], src_name, local['port']) in edges :
             log.info("%s <-> %s", src_name, dst_name)
-            edge = edges[(dst_name, src_name)]
+            edge = edges[(dst_name, remote['port'], src_name, local['port'])]
 
             if edge.get('headlabel') != taillabel :
                 log.warn("%s -> %s: local port mismatch: %s vs %s", src_name, dst_name, local['port'], edge.get('headlabel'))
@@ -145,12 +146,12 @@
                 log.warn("%s -> %s: remote port mismatch: %s vs %s", src_name, dst_name, remote['port'], edge.get('taillabel'))
 
             # mark as bidirectional
-            edges[(src_name, dst_name)] = edge
+            edges[(src_name, local['port'], dst_name, remote['port'])] = edge
             
             edge.set('dir', 'both')
 
         else :
-            edge = edges[(src_name, dst_name)] = pydot.Edge(src, dst,
+            edge = edges[(src_name, local['port'], dst_name, remote['port'])] = pydot.Edge(src, dst,
                     dir         = 'back',
                     headlabel   = headlabel,
                     taillabel   = taillabel,