bin/pvl.hosts-graph
changeset 418 9d243809532d
parent 417 75bbfb05fbf3
child 419 8783e036174b
equal deleted inserted replaced
417:75bbfb05fbf3 418:9d243809532d
   305     # second graph: manual ports
   305     # second graph: manual ports
   306     for host in hosts :
   306     for host in hosts :
   307         local_node = host
   307         local_node = host
   308         host_links = host.extensions.get('link')
   308         host_links = host.extensions.get('link')
   309 
   309 
       
   310         # XXX: copy-pasta
       
   311         if host in snmp and 'vlan' in snmp[host] :
       
   312             vlans = dict(host_vlans(host, snmp[host]['vlan']))
       
   313         else :
       
   314             vlans = None
       
   315 
   310         if host_links :
   316         if host_links :
   311             if local_node not in nodes :
   317             if local_node not in nodes :
   312                 # XXX: copypasta
   318                 # XXX: copypasta
   313                 nodes[local_node] = host.location or str(host)
   319                 nodes[local_node] = host.location or str(host)
   314 
   320 
   337 
   343 
   338                 if remote_node not in nodes :
   344                 if remote_node not in nodes :
   339                     # XXX: copypasta
   345                     # XXX: copypasta
   340                     nodes[remote_node] = remote_label
   346                     nodes[remote_node] = remote_label
   341             
   347             
       
   348                 # local vlans
       
   349                 if vlans and port in vlans :
       
   350                     local_untag, local_tagged = vlans[port]
       
   351 
       
   352                     log.info("%s:%s link vlans (%s) <%s>", host, port, local_untag, ':'.join(str(tag) for tag in local_tagged))
       
   353 
       
   354                     link_vlans = (local_untag, local_tagged, None)
       
   355                 else :
       
   356                     # unknown
       
   357                     link_vlans = None
       
   358                     
       
   359                     log.warning("%s:%s unknown vlans", host, port)
       
   360 
   342                 # directional links
   361                 # directional links
   343                 local_port = links_out.get((local_node, remote_node))
   362                 local_port = links_out.get((local_node, remote_node))
   344                 
   363                 
   345                 if not local_port :
   364                 if not local_port :
   346                     log.info("%s:%s: unconfirmed -> %s", host, port, remote_host)
   365                     log.info("%s:%s: unconfirmed -> %s", host, port, remote_host)
   378 
   397 
   379                 elif remote_port :
   398                 elif remote_port :
   380                     # we had the reverse mapping already, make it bidirectional
   399                     # we had the reverse mapping already, make it bidirectional
   381                     local_port = port
   400                     local_port = port
   382                     log.info("%s:%s link <- %s:%s", local_node, local_port, remote_port, remote_node)
   401                     log.info("%s:%s link <- %s:%s", local_node, local_port, remote_port, remote_node)
   383 
   402                     
       
   403                     # TODO: update vlan info
   384                     links[(remote_node, remote_port, local_port, local_node)] = links.pop((remote_node, remote_port, None, local_node))
   404                     links[(remote_node, remote_port, local_port, local_node)] = links.pop((remote_node, remote_port, None, local_node))
   385                 
   405                 
   386                 else :
   406                 else :
   387                     local_port = port
   407                     local_port = port
   388 
   408 
   389                     # mapping was completely missing
   409                     # mapping was completely missing
   390                     log.info("%s:%s link -> %s", local_node, local_port, remote_node)
   410                     log.info("%s:%s link -> %s", local_node, local_port, remote_node)
   391 
   411 
   392                     links[(local_node, local_port, None, remote_node)] = None
   412                     links[(local_node, local_port, None, remote_node)] = link_vlans
   393 
   413 
   394 
   414 
   395     # verify non-p2p links
   415     # verify non-p2p links
   396     for (node, port), remotes in nodes_port.iteritems() :
   416     for (node, port), remotes in nodes_port.iteritems() :
   397         if len(remotes) > 1 :
   417         if len(remotes) > 1 :
   403         bridge_ports = { }
   423         bridge_ports = { }
   404 
   424 
   405         for host, host_attrs in snmp.iteritems() :
   425         for host, host_attrs in snmp.iteritems() :
   406             if 'bridge' in host_attrs or any('bridge' in vlan_attrs for vlan_attrs in host_attrs.get('vlan', { }).itervalues()) :
   426             if 'bridge' in host_attrs or any('bridge' in vlan_attrs for vlan_attrs in host_attrs.get('vlan', { }).itervalues()) :
   407                 bridge_hosts.add(host)
   427                 bridge_hosts.add(host)
   408 
   428         
   409         # third graph: bridge
   429         # third graph: bridge
   410         for host, host_attrs in snmp.iteritems() :
   430         for host, host_attrs in snmp.iteritems() :
   411             local_out = nodes_out.get(host)
   431             local_out = nodes_out.get(host)
   412 
   432 
   413             if not local_out :
   433             if not local_out :
   494                         log.debug("%s:%s: lazy-add remote %s (%s)", host, port, remote_node, remote_label)
   514                         log.debug("%s:%s: lazy-add remote %s (%s)", host, port, remote_node, remote_label)
   495 
   515 
   496                         nodes[remote_node] = remote_label
   516                         nodes[remote_node] = remote_label
   497                     
   517                     
   498                     # unknown vlans
   518                     # unknown vlans
   499                     link_vlans = None
   519                     if vlan :
       
   520                         link_vlans = (vlan, (), None)
       
   521                     else :
       
   522                         link_vlans = None
   500 
   523 
   501                     # directional link
   524                     # directional link
   502                     links_out[(local_node, remote_node)] = local_port
   525                     links_out[(local_node, remote_node)] = local_port
   503 
   526 
   504                     if local_port :
   527                     if local_port :