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