deduplicate interfaces by mac during update and merge
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
106
nodes.go
106
nodes.go
@@ -114,36 +114,8 @@ func (n *Nodes) Update(mac net.HardwareAddr, ips []net.IP, ifaceName, nodeName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
node := n.nodes[targetID]
|
node := n.nodes[targetID]
|
||||||
var added []string
|
|
||||||
|
|
||||||
ifaceKey := macKey
|
added := n.updateNodeInterface(node, targetID, mac, ips, ifaceName)
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
if nodeName != "" && node.Name == "" {
|
if nodeName != "" && node.Name == "" {
|
||||||
node.Name = nodeName
|
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) {
|
func (n *Nodes) Merge(macs []net.HardwareAddr, source string) {
|
||||||
n.mu.Lock()
|
n.mu.Lock()
|
||||||
defer n.mu.Unlock()
|
defer n.mu.Unlock()
|
||||||
@@ -209,22 +237,12 @@ func (n *Nodes) mergeNodes(keepID, mergeID int) {
|
|||||||
keep.Name = merge.Name
|
keep.Name = merge.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
for macKey, iface := range merge.Interfaces {
|
for _, iface := range merge.Interfaces {
|
||||||
if existing, exists := keep.Interfaces[macKey]; exists {
|
var ips []net.IP
|
||||||
for ipKey, ip := range iface.IPs {
|
for _, ip := range iface.IPs {
|
||||||
existing.IPs[ipKey] = ip
|
ips = append(ips, 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
n.updateNodeInterface(keep, keepID, iface.MAC, ips, iface.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(n.nodes, mergeID)
|
delete(n.nodes, mergeID)
|
||||||
|
|||||||
Reference in New Issue
Block a user