basic connectivity graph from netbox
diff --git a/graph/graph.go b/graph/graph.go
index 1fdb5ab..8681b8f 100644
--- a/graph/graph.go
+++ b/graph/graph.go
@@ -4,9 +4,9 @@
"context"
"fmt"
- "github.com/davecgh/go-spew/spew"
"github.com/digitalocean/go-netbox/netbox/client"
"github.com/digitalocean/go-netbox/netbox/client/dcim"
+ "github.com/digitalocean/go-netbox/netbox/models"
"github.com/golang/glog"
confpb "code.hackerspace.pl/q3k/topo/proto/config"
@@ -137,6 +137,22 @@
}
func (g *Graph) FeedFromNetbox(ctx context.Context, nb *client.NetBox) error {
+ // Clear all connections first, because it's easier that way.
+ for _, machine := range g.Machines {
+ for _, port := range machine.Ports {
+ port.OtherEnd = nil
+ }
+ }
+ for _, sw := range g.Switches {
+ for _, port := range sw.Ports {
+ port.OtherEnd = nil
+ }
+ }
+
+ // Load new connections.
+ // Iterating over just machines should be fine if all connections are
+ // guaranteed to be between machines and switches (which is the model for
+ // now).
for _, machine := range g.Machines {
req := &dcim.DcimInterfaceConnectionsListParams{
Device: &machine.Name,
@@ -147,7 +163,44 @@
return fmt.Errorf("while querying information about %q: %v", machine.Name, err)
}
for _, connection := range res.Payload.Results {
- glog.Info(spew.Sdump(connection))
+ ia := connection.InterfaceA
+ ib := connection.InterfaceB
+ if ia == nil || ib == nil {
+ continue
+ }
+
+ // Find which way this thing actually connects.
+ var thisSide, otherSide *models.PeerInterface
+ if ia.Device.Name == machine.Name {
+ thisSide = ia
+ otherSide = ib
+ } else if ib.Device.Name == machine.Name {
+ thisSide = ib
+ otherSide = ia
+ } else {
+ glog.Warning("Netbox connectivity for %q reported a link without it involced..?", machine.Name)
+ continue
+ }
+
+ thisPort, ok := machine.Ports[*thisSide.Name]
+ if !ok {
+ continue
+ }
+ sw, ok := g.Switches[otherSide.Device.Name]
+ if !ok {
+ glog.Warningf("Machine %q port %q is managed but connected to unknown device %q", machine.Name, thisPort.Name, otherSide.Device.Name)
+ continue
+ }
+ otherPort, ok := sw.Ports[*otherSide.Name]
+ if !ok {
+ glog.Warningf("Machine %q port %q is managed but connected to unmanaged port %q on %q", machine.Name, thisPort.Name, otherSide.Name, sw.Name)
+ continue
+ }
+
+ // Connect the two together!
+ thisPort.OtherEnd = otherPort
+ otherPort.OtherEnd = thisPort
+ glog.Infof("Connected: %s/%s <-> %s/%s", machine.Name, thisPort.Name, sw.Name, otherPort.Name)
}
}
return nil