pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
authorTero Marttila <terom@paivola.fi>
Mon, 31 Mar 2014 18:44:26 +0300
changeset 416 fb0fd4ac0168
parent 415 658bc929cf77
child 417 75bbfb05fbf3
pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port
bin/pvl.hosts-graph
--- a/bin/pvl.hosts-graph	Mon Mar 31 18:28:19 2014 +0300
+++ b/bin/pvl.hosts-graph	Mon Mar 31 18:44:26 2014 +0300
@@ -182,7 +182,7 @@
     hosts_by_ethernet = { } # ethernet: host
     hosts_by_location = { } # (domain, location): host
 
-    nodes_port = { } # (local, int(local_port)): remote
+    nodes_port = { } # (local, int(local_port)): {remote}
     nodes_out = { } # local: {remote}
     nodes_in = { } # remote: {local}
     links_out = { } # (local, remote): local_port
@@ -267,7 +267,7 @@
 
                     # directional mapping
                     links_out[(local_node, remote_node)] = local_port
-                    nodes_port[(local_node, port)] = remote_node
+                    nodes_port.setdefault((local_node, port), set()).add(remote_node)
                     nodes_out.setdefault(local_node, set()).add(remote_node)
                     nodes_in.setdefault(remote_node, set()).add(local_node)
                     
@@ -349,7 +349,7 @@
                     log.debug("%s:%s: confirm -> %s", host, port, remote_host)
                 
                 links_out[(local_node, remote_node)] = port
-                nodes_port[(local_node, port)] = remote_node
+                nodes_port.setdefault((local_node, port), set()).add(remote_node)
                 nodes_out.setdefault(local_node, set()).add(remote_node)
                 nodes_in.setdefault(remote_node, set()).add(local_node)
 
@@ -388,9 +388,16 @@
 
                     links[(local_node, local_port, None, remote_node)] = None
 
+
+    # verify non-p2p links
+    for (node, port), remotes in nodes_port.iteritems() :
+        if len(remotes) > 1 :
+            log.warning("%s:%s: multiple remotes: %s", node, port, ' '.join(str(host) for host in remotes))
+
     if options.graph_bridge :
         # scan hosts with bridges
         bridge_hosts = set()
+        bridge_ports = { }
 
         for host, host_attrs in snmp.iteritems() :
             if 'bridge' in host_attrs or any('bridge' in vlan_attrs for vlan_attrs in host_attrs.get('vlan', { }).itervalues()) :
@@ -418,7 +425,15 @@
                 local_node = host
                 local_port = port
                 
-                remote_node = nodes_port.get((local_node, local_port))
+                remote_nodes = nodes_port.get((local_node, local_port))
+                
+                if not remote_nodes :
+                    remote_node = None
+                elif len(remote_nodes) == 1 :
+                    remote_node, = remote_nodes
+                else :
+                    log.warning("%s:%s: ignore port with multiple remotes: %s", host, port, ' '.join(str(host) for host in remotes))
+                    continue
 
                 if remote_node :
                     remote_in = nodes_in.get(remote_node, set())
@@ -474,6 +489,9 @@
 
                     # directional link
                     links_out[(local_node, remote_node)] = local_port
+
+                    if local_port :
+                        bridge_ports.setdefault((local_node, local_port), set()).add(remote_node)
                     
                     # bidirectional link
                     forward = (local_node, local_port, None, remote_node)
@@ -495,8 +513,11 @@
                         log.info("%s:%s bridge -> %s", local_node, local_port, remote_host)
 
                         links[forward] = link_vlans
-
-
+        
+        # verify unmanaged bridges
+        for (node, port), remotes in bridge_ports.iteritems() :
+            if len(remotes) > 1 :
+                log.warning("%s:%s: multiple bridge remotes: %s", node, port, ' '.join(str(host) for host in remotes))
 
     return nodes, links