failover.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. peerNode.FailOverPeers[victimNode.ID.String()] = struct{}{}
  10. victimNode.FailOverPeers[peerNode.ID.String()] = struct{}{}
  11. victimNode.FailedOverBy = failOverNode.ID
  12. peerNode.FailedOverBy = failOverNode.ID
  13. if err := logic.UpsertNode(&failOverNode); err != nil {
  14. return err
  15. }
  16. if err := logic.UpsertNode(&victimNode); err != nil {
  17. return err
  18. }
  19. if err := logic.UpsertNode(&peerNode); err != nil {
  20. return err
  21. }
  22. return nil
  23. }
  24. // GetFailOverNode - gets the host acting as failOver
  25. func GetFailOverNode(network string, allNodes []models.Node) (models.Node, error) {
  26. nodes := logic.GetNetworkNodesMemory(allNodes, network)
  27. for _, node := range nodes {
  28. if node.IsFailOver {
  29. return node, nil
  30. }
  31. }
  32. return models.Node{}, errors.New("auto relay not found")
  33. }
  34. // FailOverExists - checks if failOver exists already in the network
  35. func FailOverExists(network string) (exists bool) {
  36. nodes, err := logic.GetNetworkNodes(network)
  37. if err != nil {
  38. return
  39. }
  40. for _, node := range nodes {
  41. if node.IsFailOver {
  42. exists = true
  43. return
  44. }
  45. }
  46. return
  47. }
  48. // ResetFailOveredPeers - reset failovered peers
  49. func ResetFailOveredPeers(failOverNode *models.Node) error {
  50. // Unset FailedOverPeers
  51. nodes, err := logic.GetNetworkNodes(failOverNode.Network)
  52. if err != nil {
  53. return err
  54. }
  55. for _, node := range nodes {
  56. if node.FailedOverBy == failOverNode.ID {
  57. node.FailedOverBy = uuid.Nil
  58. node.FailOverPeers = make(map[string]struct{})
  59. logic.UpsertNode(&node)
  60. }
  61. }
  62. return nil
  63. }