diff --git a/link.go b/link.go index bab3393..5951506 100644 --- a/link.go +++ b/link.go @@ -1,6 +1,9 @@ package tendrils -import "fmt" +import ( + "encoding/json" + "fmt" +) type Link struct { TypeID string `json:"typeid"` @@ -10,6 +13,24 @@ type Link struct { InterfaceB string `json:"interface_b,omitempty"` } +func (l *Link) MarshalJSON() ([]byte, error) { + type linkJSON struct { + TypeID string `json:"typeid"` + NodeA interface{} `json:"node_a"` + InterfaceA string `json:"interface_a,omitempty"` + NodeB interface{} `json:"node_b"` + InterfaceB string `json:"interface_b,omitempty"` + } + + return json.Marshal(linkJSON{ + TypeID: l.TypeID, + NodeA: l.NodeA.WithInterface(l.InterfaceA), + InterfaceA: l.InterfaceA, + NodeB: l.NodeB.WithInterface(l.InterfaceB), + InterfaceB: l.InterfaceB, + }) +} + func (l *Link) String() string { nameA := l.NodeA.DisplayName() if nameA == "" { diff --git a/nodes.go b/nodes.go index 3f55556..b22c633 100644 --- a/nodes.go +++ b/nodes.go @@ -308,6 +308,10 @@ func (n *Nodes) updateNodeInterface(node *Node, nodeID int, mac net.HardwareAddr } iface.IPs.Add(ip) n.ipIndex[ipKey] = nodeID + + if ipOnlyIface, exists := node.Interfaces[ipKey]; exists && ipOnlyIface != iface { + delete(node.Interfaces, ipKey) + } } return added diff --git a/types.go b/types.go index a0d6723..5763e47 100644 --- a/types.go +++ b/types.go @@ -130,6 +130,25 @@ type Node struct { pollTrigger chan struct{} } +func (n *Node) WithInterface(ifaceKey string) *Node { + if ifaceKey == "" { + return n + } + iface, exists := n.Interfaces[ifaceKey] + if !exists { + return n + } + return &Node{ + TypeID: n.TypeID, + Names: n.Names, + Interfaces: InterfaceMap{ifaceKey: iface}, + MACTableSize: n.MACTableSize, + PoEBudget: n.PoEBudget, + IsDanteClockMaster: n.IsDanteClockMaster, + DanteTxChannels: n.DanteTxChannels, + } +} + func (i *Interface) String() string { var parts []string parts = append(parts, string(i.MAC))