# HG changeset patch # User Tero Marttila # Date 1396280666 -10800 # Node ID fb0fd4ac0168410f7f037e7fe613b33a93d76631 # Parent 658bc929cf779eeb64cc48ffa656c86f290bb3ba pvl.hosts-graph: warn on multiple remotes on one port, multiple bridge hosts on one port diff -r 658bc929cf77 -r fb0fd4ac0168 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