failover.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package logic
  2. import (
  3. "errors"
  4. "github.com/google/uuid"
  5. "github.com/gravitl/netmaker/logic"
  6. "github.com/gravitl/netmaker/models"
  7. )
  8. func SetFailOverCtx(failOverNode, victimNode, peerNode models.Node) error {
  9. if peerNode.FailOverPeers == nil {
  10. peerNode.FailOverPeers = make(map[string]struct{})
  11. }
  12. if victimNode.FailOverPeers == nil {
  13. victimNode.FailOverPeers = make(map[string]struct{})
  14. }
  15. peerNode.FailOverPeers[victimNode.ID.String()] = struct{}{}
  16. victimNode.FailOverPeers[peerNode.ID.String()] = struct{}{}
  17. victimNode.FailedOverBy = failOverNode.ID
  18. peerNode.FailedOverBy = failOverNode.ID
  19. if err := logic.UpsertNode(&failOverNode); err != nil {
  20. return err
  21. }
  22. if err := logic.UpsertNode(&victimNode); err != nil {
  23. return err
  24. }
  25. if err := logic.UpsertNode(&peerNode); err != nil {
  26. return err
  27. }
  28. return nil
  29. }
  30. // GetFailOverNode - gets the host acting as failOver
  31. func GetFailOverNode(network string, allNodes []models.Node) (models.Node, error) {
  32. nodes := logic.GetNetworkNodesMemory(allNodes, network)
  33. for _, node := range nodes {
  34. if node.IsFailOver {
  35. return node, nil
  36. }
  37. }
  38. return models.Node{}, errors.New("auto relay not found")
  39. }
  40. // FailOverExists - checks if failOver exists already in the network
  41. func FailOverExists(network string) (failOverNode models.Node, exists bool) {
  42. nodes, err := logic.GetNetworkNodes(network)
  43. if err != nil {
  44. return
  45. }
  46. for _, node := range nodes {
  47. if node.IsFailOver {
  48. exists = true
  49. failOverNode = node
  50. return
  51. }
  52. }
  53. return
  54. }
  55. // ResetFailedOverPeer - removes failed over node from network peers
  56. func ResetFailedOverPeer(failedOveredNode *models.Node) error {
  57. nodes, err := logic.GetNetworkNodes(failedOveredNode.Network)
  58. if err != nil {
  59. return err
  60. }
  61. failedOveredNode.FailedOverBy = uuid.Nil
  62. failedOveredNode.FailOverPeers = make(map[string]struct{})
  63. err = logic.UpsertNode(failedOveredNode)
  64. if err != nil {
  65. return err
  66. }
  67. for _, node := range nodes {
  68. if node.FailOverPeers == nil || node.ID == failedOveredNode.ID {
  69. continue
  70. }
  71. delete(node.FailOverPeers, failedOveredNode.ID.String())
  72. logic.UpsertNode(&node)
  73. }
  74. return nil
  75. }
  76. // ResetFailOver - reset failovered peers
  77. func ResetFailOver(failOverNode *models.Node) error {
  78. // Unset FailedOverPeers
  79. nodes, err := logic.GetNetworkNodes(failOverNode.Network)
  80. if err != nil {
  81. return err
  82. }
  83. for _, node := range nodes {
  84. if node.FailedOverBy == failOverNode.ID {
  85. node.FailedOverBy = uuid.Nil
  86. node.FailOverPeers = make(map[string]struct{})
  87. logic.UpsertNode(&node)
  88. }
  89. }
  90. return nil
  91. }