deduplicate interfaces by mac during update and merge

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-18 14:12:14 -08:00
parent 5e1ba33cb4
commit 6d50ee30aa

106
nodes.go
View File

@@ -114,36 +114,8 @@ func (n *Nodes) Update(mac net.HardwareAddr, ips []net.IP, ifaceName, nodeName,
}
node := n.nodes[targetID]
var added []string
ifaceKey := macKey
if ifaceName != "" {
ifaceKey = ifaceName
}
iface, exists := node.Interfaces[ifaceKey]
if !exists {
iface = &Interface{
Name: ifaceName,
MAC: mac,
IPs: map[string]net.IP{},
}
node.Interfaces[ifaceKey] = iface
added = append(added, "iface="+ifaceKey)
}
if _, exists := n.macIndex[macKey]; !exists {
n.macIndex[macKey] = targetID
}
for _, ip := range ips {
ipKey := ip.String()
if _, exists := iface.IPs[ipKey]; !exists {
added = append(added, "ip="+ipKey)
}
iface.IPs[ipKey] = ip
n.ipIndex[ipKey] = targetID
}
added := n.updateNodeInterface(node, targetID, mac, ips, ifaceName)
if nodeName != "" && node.Name == "" {
node.Name = nodeName
@@ -163,6 +135,62 @@ func (n *Nodes) Update(mac net.HardwareAddr, ips []net.IP, ifaceName, nodeName,
}
}
func (n *Nodes) updateNodeInterface(node *Node, nodeID int, mac net.HardwareAddr, ips []net.IP, ifaceName string) []string {
macKey := mac.String()
var added []string
ifaceKey := macKey
if ifaceName != "" {
ifaceKey = ifaceName
}
iface, exists := node.Interfaces[ifaceKey]
if !exists {
if ifaceName != "" {
if oldIface, oldExists := node.Interfaces[macKey]; oldExists && oldIface.MAC.String() == macKey {
iface = oldIface
iface.Name = ifaceName
delete(node.Interfaces, macKey)
node.Interfaces[ifaceKey] = iface
added = append(added, "iface="+ifaceKey)
exists = true
}
} else {
for _, existing := range node.Interfaces {
if existing.MAC.String() == macKey {
iface = existing
exists = true
break
}
}
}
}
if !exists {
iface = &Interface{
Name: ifaceName,
MAC: mac,
IPs: map[string]net.IP{},
}
node.Interfaces[ifaceKey] = iface
added = append(added, "iface="+ifaceKey)
}
if _, exists := n.macIndex[macKey]; !exists {
n.macIndex[macKey] = nodeID
}
for _, ip := range ips {
ipKey := ip.String()
if _, exists := iface.IPs[ipKey]; !exists {
added = append(added, "ip="+ipKey)
}
iface.IPs[ipKey] = ip
n.ipIndex[ipKey] = nodeID
}
return added
}
func (n *Nodes) Merge(macs []net.HardwareAddr, source string) {
n.mu.Lock()
defer n.mu.Unlock()
@@ -209,22 +237,12 @@ func (n *Nodes) mergeNodes(keepID, mergeID int) {
keep.Name = merge.Name
}
for macKey, iface := range merge.Interfaces {
if existing, exists := keep.Interfaces[macKey]; exists {
for ipKey, ip := range iface.IPs {
existing.IPs[ipKey] = ip
n.ipIndex[ipKey] = keepID
}
if existing.Name == "" && iface.Name != "" {
existing.Name = iface.Name
}
} else {
keep.Interfaces[macKey] = iface
n.macIndex[macKey] = keepID
for ipKey := range iface.IPs {
n.ipIndex[ipKey] = keepID
}
for _, iface := range merge.Interfaces {
var ips []net.IP
for _, ip := range iface.IPs {
ips = append(ips, ip)
}
n.updateNodeInterface(keep, keepID, iface.MAC, ips, iface.Name)
}
delete(n.nodes, mergeID)