status.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. allowed, _ := logic.IsNodeAllowedToCommunicate(*node, peer, false)
  127. if !defaultAclPolicy && !allowed {
  128. continue
  129. }
  130. if time.Since(peer.LastCheckIn) > models.LastCheckInThreshold {
  131. continue
  132. }
  133. if metric.Connected {
  134. continue
  135. }
  136. if peer.Status == models.ErrorSt {
  137. continue
  138. }
  139. peerNotConnectedCnt++
  140. }
  141. if peerNotConnectedCnt == 0 {
  142. node.Status = models.OnlineSt
  143. return
  144. }
  145. if peerNotConnectedCnt == len(metrics.Connectivity) {
  146. node.Status = models.ErrorSt
  147. return
  148. }
  149. node.Status = models.WarningSt
  150. }
  151. func checkPeerConnectivity(node *models.Node, metrics *models.Metrics, defaultAclPolicy bool) {
  152. peerNotConnectedCnt := 0
  153. for peerID, metric := range metrics.Connectivity {
  154. peer, err := logic.GetNodeByID(peerID)
  155. if err != nil {
  156. continue
  157. }
  158. allowed, _ := logic.IsNodeAllowedToCommunicate(*node, peer, false)
  159. if !defaultAclPolicy && !allowed {
  160. continue
  161. }
  162. if time.Since(peer.LastCheckIn) > models.LastCheckInThreshold {
  163. continue
  164. }
  165. if metric.Connected {
  166. continue
  167. }
  168. // check if peer is in error state
  169. checkPeerStatus(&peer, defaultAclPolicy)
  170. if peer.Status == models.ErrorSt {
  171. continue
  172. }
  173. peerNotConnectedCnt++
  174. }
  175. if peerNotConnectedCnt == 0 {
  176. node.Status = models.OnlineSt
  177. return
  178. }
  179. if peerNotConnectedCnt == len(metrics.Connectivity) {
  180. node.Status = models.ErrorSt
  181. return
  182. }
  183. node.Status = models.WarningSt
  184. }