--- 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