status.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package logic
  2. import (
  3. "time"
  4. "github.com/gravitl/netmaker/logic"
  5. "github.com/gravitl/netmaker/models"
  6. )
  7. func getNodeStatusOld(node *models.Node) {
  8. // On CE check only last check-in time
  9. if node.IsStatic {
  10. if !node.StaticNode.Enabled {
  11. node.Status = models.OfflineSt
  12. return
  13. }
  14. node.Status = models.OnlineSt
  15. return
  16. }
  17. if time.Since(node.LastCheckIn) > time.Minute*10 {
  18. node.Status = models.OfflineSt
  19. return
  20. }
  21. node.Status = models.OnlineSt
  22. }
  23. func GetNodeStatus(node *models.Node, defaultEnabledPolicy bool) {
  24. if time.Since(node.LastCheckIn) > models.LastCheckInThreshold {
  25. node.Status = models.OfflineSt
  26. return
  27. }
  28. if node.IsStatic {
  29. if !node.StaticNode.Enabled {
  30. node.Status = models.OfflineSt
  31. return
  32. }
  33. // check extclient connection from metrics
  34. ingressMetrics, err := GetMetrics(node.StaticNode.IngressGatewayID)
  35. if err != nil || ingressMetrics == nil || ingressMetrics.Connectivity == nil {
  36. node.Status = models.UnKnown
  37. return
  38. }
  39. if metric, ok := ingressMetrics.Connectivity[node.StaticNode.ClientID]; ok {
  40. if metric.Connected {
  41. node.Status = models.OnlineSt
  42. return
  43. } else {
  44. node.Status = models.OfflineSt
  45. return
  46. }
  47. }
  48. node.Status = models.UnKnown
  49. return
  50. }
  51. host, err := logic.GetHost(node.HostID.String())
  52. if err != nil {
  53. node.Status = models.UnKnown
  54. return
  55. }
  56. vlt, err := logic.VersionLessThan(host.Version, "v0.30.0")
  57. if err != nil {
  58. node.Status = models.UnKnown
  59. return
  60. }
  61. if vlt {
  62. getNodeStatusOld(node)
  63. return
  64. }
  65. metrics, err := logic.GetMetrics(node.ID.String())
  66. if err != nil {
  67. return
  68. }
  69. if metrics == nil || metrics.Connectivity == nil {
  70. if time.Since(node.LastCheckIn) < models.LastCheckInThreshold {
  71. node.Status = models.OnlineSt
  72. return
  73. }
  74. }
  75. // if node.IsFailOver {
  76. // if time.Since(node.LastCheckIn) < models.LastCheckInThreshold {
  77. // node.Status = models.OnlineSt
  78. // return
  79. // }
  80. // }
  81. // If all Peers are able to reach me and and the peer is not able to reached by any peer then return online
  82. /* 1. FailOver Exists
  83. a. check connectivity to failover Node - if no connection return warning
  84. b. if getting failedover and still no connection to any of the peers - then show error
  85. c. if getting failedOver and has connections to some peers - show warning
  86. 2. FailOver Doesn't Exist
  87. a. check connectivity to pu
  88. */
  89. // failoverNode, exists := FailOverExists(node.Network)
  90. // if exists && failoverNode.FailedOverBy != uuid.Nil {
  91. // // check connectivity to failover Node
  92. // if metric, ok := metrics.Connectivity[failoverNode.ID.String()]; ok {
  93. // if time.Since(failoverNode.LastCheckIn) < models.LastCheckInThreshold {
  94. // if metric.Connected {
  95. // node.Status = models.OnlineSt
  96. // return
  97. // } else {
  98. // checkPeerConnectivity(node, metrics)
  99. // return
  100. // }
  101. // }
  102. // } else {
  103. // node.Status = models.OnlineSt
  104. // return
  105. // }
  106. // }
  107. checkPeerConnectivity(node, metrics, defaultEnabledPolicy)
  108. }
  109. func checkPeerStatus(node *models.Node, defaultAclPolicy bool) {
  110. peerNotConnectedCnt := 0
  111. metrics, err := logic.GetMetrics(node.ID.String())
  112. if err != nil {
  113. return
  114. }
  115. if metrics == nil || metrics.Connectivity == nil {
  116. if time.Since(node.LastCheckIn) < models.LastCheckInThreshold {
  117. node.Status = models.OnlineSt
  118. return
  119. }
  120. }
  121. for peerID, metric := range metrics.Connectivity {
  122. peer, err := logic.GetNodeByID(peerID)
  123. if err != nil {
  124. continue
  125. }
  126. if !defaultAclPolicy && !logic.IsNodeAllowedToCommunicate(*node, peer, false) {
  127. continue
  128. }
  129. if time.Since(peer.LastCheckIn) > models.LastCheckInThreshold {
  130. continue
  131. }
  132. if metric.Connected {
  133. continue
  134. }
  135. if peer.Status == models.ErrorSt {
  136. continue
  137. }
  138. peerNotConnectedCnt++
  139. }
  140. if peerNotConnectedCnt == 0 {
  141. node.Status = models.OnlineSt
  142. return
  143. }
  144. if peerNotConnectedCnt == len(metrics.Connectivity) {
  145. node.Status = models.ErrorSt
  146. return
  147. }
  148. node.Status = models.WarningSt
  149. }
  150. func checkPeerConnectivity(node *models.Node, metrics *models.Metrics, defaultAclPolicy bool) {
  151. peerNotConnectedCnt := 0
  152. for peerID, metric := range metrics.Connectivity {
  153. peer, err := logic.GetNodeByID(peerID)
  154. if err != nil {
  155. continue
  156. }
  157. if !defaultAclPolicy && !logic.IsNodeAllowedToCommunicate(*node, peer, false) {
  158. continue
  159. }
  160. if time.Since(peer.LastCheckIn) > models.LastCheckInThreshold {
  161. continue
  162. }
  163. if metric.Connected {
  164. continue
  165. }
  166. // check if peer is in error state
  167. checkPeerStatus(&peer, defaultAclPolicy)
  168. if peer.Status == models.ErrorSt {
  169. continue
  170. }
  171. peerNotConnectedCnt++
  172. }
  173. if peerNotConnectedCnt == 0 {
  174. node.Status = models.OnlineSt
  175. return
  176. }
  177. if peerNotConnectedCnt == len(metrics.Connectivity) {
  178. node.Status = models.ErrorSt
  179. return
  180. }
  181. node.Status = models.WarningSt
  182. }