From 079b2aef5906513a9d85ab9877a4128b5fb8ce40 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Thu, 21 Nov 2024 15:55:49 +0400 Subject: [PATCH] handle static node status --- logic/status.go | 12 +++++++++++- models/api_node.go | 2 ++ models/node.go | 1 + pro/initialize.go | 1 + pro/logic/status.go | 30 +++++++++++++++++++++++++++++- 5 files changed, 44 insertions(+), 2 deletions(-) diff --git a/logic/status.go b/logic/status.go index 7321213af..546f8e3f5 100644 --- a/logic/status.go +++ b/logic/status.go @@ -6,8 +6,18 @@ import ( "github.com/gravitl/netmaker/models" ) -func GetNodeStatus(node *models.Node) { +var GetNodeStatus = getNodeStatus + +func getNodeStatus(node *models.Node) { // On CE check only last check-in time + if node.IsStatic { + if !node.StaticNode.Enabled { + node.Status = models.OfflineSt + return + } + node.Status = models.OnlineSt + return + } if time.Since(node.LastCheckIn) > time.Minute*10 { node.Status = models.OfflineSt return diff --git a/models/api_node.go b/models/api_node.go index 30e08c639..c5ef2f834 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -52,6 +52,7 @@ type ApiNode struct { IsStatic bool `json:"is_static"` IsUserNode bool `json:"is_user_node"` StaticNode ExtClient `json:"static_node"` + Status NodeStatus `json:"status"` } // ApiNode.ConvertToServerNode - converts an api node to a server node @@ -192,6 +193,7 @@ func (nm *Node) ConvertToAPINode() *ApiNode { apiNode.IsStatic = nm.IsStatic apiNode.IsUserNode = nm.IsUserNode apiNode.StaticNode = nm.StaticNode + apiNode.Status = nm.Status return &apiNode } diff --git a/models/node.go b/models/node.go index 1062713d5..1462c8ad2 100644 --- a/models/node.go +++ b/models/node.go @@ -18,6 +18,7 @@ const ( OfflineSt NodeStatus = "offline" WarningSt NodeStatus = "warning" ErrorSt NodeStatus = "error" + UnKnown NodeStatus = "unknown" ) // LastCheckInThreshold - if node's checkin more than this threshold,then node is declared as offline diff --git a/pro/initialize.go b/pro/initialize.go index f6ae65670..55b9c868c 100644 --- a/pro/initialize.go +++ b/pro/initialize.go @@ -140,6 +140,7 @@ func InitPro() { logic.IntialiseGroups = proLogic.UserGroupsInit logic.AddGlobalNetRolesToAdmins = proLogic.AddGlobalNetRolesToAdmins logic.GetUserGroupsInNetwork = proLogic.GetUserGroupsInNetwork + logic.GetNodeStatus = proLogic.GetNodeStatus } func retrieveProLogo() string { diff --git a/pro/logic/status.go b/pro/logic/status.go index dfc0d0ae9..889264ca5 100644 --- a/pro/logic/status.go +++ b/pro/logic/status.go @@ -8,15 +8,43 @@ import ( ) func GetNodeStatus(node *models.Node) { - // On CE check only last check-in time if time.Since(node.LastCheckIn) > models.LastCheckInThreshold { node.Status = models.OfflineSt return } + if node.IsStatic { + if !node.StaticNode.Enabled { + node.Status = models.OfflineSt + return + } + // check extclient connection from metrics + ingressMetrics, err := GetMetrics(node.StaticNode.IngressGatewayID) + if err != nil || ingressMetrics == nil || ingressMetrics.Connectivity == nil { + node.Status = models.UnKnown + return + } + if metric, ok := ingressMetrics.Connectivity[node.StaticNode.ClientID]; ok { + if metric.Connected { + node.Status = models.OnlineSt + return + } else { + node.Status = models.OfflineSt + return + } + } + node.Status = models.UnKnown + return + } metrics, err := logic.GetMetrics(node.ID.String()) if err != nil { return } + if metrics == nil || metrics.Connectivity == nil { + if time.Since(node.LastCheckIn) < models.LastCheckInThreshold { + node.Status = models.OnlineSt + return + } + } peerNotConnectedCnt := 0 for peerID, metric := range metrics.Connectivity { peer, err := logic.GetNodeByID(peerID)