From 461c6800997d3cdcc4f45e72f013dc1526b3b27c Mon Sep 17 00:00:00 2001 From: Abhishek K Date: Sun, 27 Jul 2025 08:29:37 +0530 Subject: [PATCH] NM-15: sync device interfaces on checkin (#3548) * sync devices interface on checkin * deep compare ifaces on checkin --- logic/hosts.go | 5 +++++ logic/util.go | 20 ++++++++++++++++++++ mq/handlers.go | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/logic/hosts.go b/logic/hosts.go index 737e4db1..04fcd405 100644 --- a/logic/hosts.go +++ b/logic/hosts.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "os" + "reflect" "sort" "sync" @@ -307,6 +308,10 @@ func UpdateHostFromClient(newHost, currHost *models.Host) (sendPeerUpdate bool) sendPeerUpdate = true isEndpointChanged = true } + if !reflect.DeepEqual(currHost.Interfaces, newHost.Interfaces) { + currHost.Interfaces = newHost.Interfaces + sendPeerUpdate = true + } if isEndpointChanged { for _, nodeID := range currHost.Nodes { diff --git a/logic/util.go b/logic/util.go index 811edddc..5824177e 100644 --- a/logic/util.go +++ b/logic/util.go @@ -20,6 +20,7 @@ import ( "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/models" ) // IsBase64 - checks if a string is in base64 format @@ -253,3 +254,22 @@ func GetClientIP(r *http.Request) string { } return ip } + +// CompareIfaceSlices compares two slices of Iface for deep equality (order-sensitive) +func CompareIfaceSlices(a, b []models.Iface) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if !compareIface(a[i], b[i]) { + return false + } + } + return true +} +func compareIface(a, b models.Iface) bool { + return a.Name == b.Name && + a.Address.IP.Equal(b.Address.IP) && + a.Address.Mask.String() == b.Address.Mask.String() && + a.AddressString == b.AddressString +} diff --git a/mq/handlers.go b/mq/handlers.go index ee6f7bec..73427a20 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -274,7 +274,7 @@ func HandleHostCheckin(h, currentHost *models.Host) bool { return false } } - ifaceDelta := len(h.Interfaces) != len(currentHost.Interfaces) || + ifaceDelta := len(h.Interfaces) != len(currentHost.Interfaces) || !logic.CompareIfaceSlices(h.Interfaces, currentHost.Interfaces) || !h.EndpointIP.Equal(currentHost.EndpointIP) || (len(h.NatType) > 0 && h.NatType != currentHost.NatType) || h.DefaultInterface != currentHost.DefaultInterface ||