status.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package logic
  2. import (
  3. "time"
  4. "github.com/gravitl/netmaker/logic"
  5. "github.com/gravitl/netmaker/models"
  6. )
  7. func GetNodeStatus(node *models.Node) {
  8. if time.Since(node.LastCheckIn) > models.LastCheckInThreshold {
  9. node.Status = models.OfflineSt
  10. return
  11. }
  12. if node.IsStatic {
  13. if !node.StaticNode.Enabled {
  14. node.Status = models.OfflineSt
  15. return
  16. }
  17. // check extclient connection from metrics
  18. ingressMetrics, err := GetMetrics(node.StaticNode.IngressGatewayID)
  19. if err != nil || ingressMetrics == nil || ingressMetrics.Connectivity == nil {
  20. node.Status = models.UnKnown
  21. return
  22. }
  23. if metric, ok := ingressMetrics.Connectivity[node.StaticNode.ClientID]; ok {
  24. if metric.Connected {
  25. node.Status = models.OnlineSt
  26. return
  27. } else {
  28. node.Status = models.OfflineSt
  29. return
  30. }
  31. }
  32. node.Status = models.UnKnown
  33. return
  34. }
  35. metrics, err := logic.GetMetrics(node.ID.String())
  36. if err != nil {
  37. return
  38. }
  39. if metrics == nil || metrics.Connectivity == nil {
  40. if time.Since(node.LastCheckIn) < models.LastCheckInThreshold {
  41. node.Status = models.OnlineSt
  42. return
  43. }
  44. }
  45. peerNotConnectedCnt := 0
  46. for peerID, metric := range metrics.Connectivity {
  47. peer, err := logic.GetNodeByID(peerID)
  48. if err != nil {
  49. continue
  50. }
  51. if time.Since(peer.LastCheckIn) > models.LastCheckInThreshold {
  52. continue
  53. }
  54. if metric.Connected {
  55. continue
  56. }
  57. peerNotConnectedCnt++
  58. }
  59. if peerNotConnectedCnt == 0 {
  60. node.Status = models.OnlineSt
  61. return
  62. }
  63. if peerNotConnectedCnt == len(metrics.Connectivity) {
  64. node.Status = models.ErrorSt
  65. return
  66. }
  67. node.Status = models.WarningSt
  68. }