Parcourir la source

reset failovered status when relayed or deleted

Abhishek Kondur il y a 1 an
Parent
commit
fe2c5c5832
7 fichiers modifiés avec 47 ajouts et 6 suppressions
  1. 3 0
      logic/nodes.go
  2. 6 2
      logic/peers.go
  3. 1 1
      pro/controllers/failover.go
  4. 10 0
      pro/controllers/relay.go
  5. 2 1
      pro/initialize.go
  6. 24 2
      pro/logic/failover.go
  7. 1 0
      pro/logic/relays.go

+ 3 - 0
logic/nodes.go

@@ -205,6 +205,9 @@ func DeleteNode(node *models.Node, purge bool) error {
 			UpsertNode(&relayNode)
 		}
 	}
+	if node.FailedOverBy != uuid.Nil {
+		ResetFailedOverPeer(node)
+	}
 	if node.IsRelay {
 		// unset all the relayed nodes
 		SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)

+ 6 - 2
logic/peers.go

@@ -16,8 +16,12 @@ import (
 )
 
 var (
-	// ResetFailOveredPeers - function to reset failOvered peers on this node
-	ResetFailOveredPeers = func(failOverNode *models.Node) error {
+	// ResetFailOver - function to reset failOvered peers on this node
+	ResetFailOver = func(failOverNode *models.Node) error {
+		return nil
+	}
+	// ResetFailedOverPeer - removes failed over node from network peers
+	ResetFailedOverPeer = func(failedOverNode *models.Node) error {
 		return nil
 	}
 )

+ 1 - 1
pro/controllers/failover.go

@@ -90,7 +90,7 @@ func deletefailOver(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	go func() {
-		proLogic.ResetFailOveredPeers(&node)
+		proLogic.ResetFailOver(&node)
 		mq.PublishPeerUpdate()
 	}()
 	w.Header().Set("Content-Type", "application/json")

+ 10 - 0
pro/controllers/relay.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"net/http"
 
+	"github.com/google/uuid"
 	proLogic "github.com/gravitl/netmaker/pro/logic"
 
 	"github.com/gorilla/mux"
@@ -53,6 +54,15 @@ func createRelay(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
+	for _, relayedNodeID := range relayNode.RelayedNodes {
+		relayedNode, err := logic.GetNodeByID(relayedNodeID)
+		if err == nil {
+			if relayedNode.FailedOverBy != uuid.Nil {
+				go logic.ResetFailedOverPeer(&relayedNode)
+			}
+
+		}
+	}
 	go mq.PublishPeerUpdate()
 	logger.Log(1, r.Header.Get("user"), "created relay on node", relayRequest.NodeID, "on network", relayRequest.NetID)
 	apiNode := relayNode.ConvertToAPINode()

+ 2 - 1
pro/initialize.go

@@ -43,7 +43,8 @@ func InitPro() {
 			AddRacHooks()
 		}
 	})
-	logic.ResetFailOveredPeers = proLogic.ResetFailOveredPeers
+	logic.ResetFailOver = proLogic.ResetFailOver
+	logic.ResetFailedOverPeer = proLogic.ResetFailedOverPeer
 	logic.DenyClientNodeAccess = proLogic.DenyClientNode
 	logic.IsClientNodeAllowed = proLogic.IsClientNodeAllowed
 	logic.AllowClientNodeAccess = proLogic.RemoveDeniedNodeFromClient

+ 24 - 2
pro/logic/failover.go

@@ -57,8 +57,30 @@ func FailOverExists(network string) (exists bool) {
 	return
 }
 
-// ResetFailOveredPeers - reset failovered peers
-func ResetFailOveredPeers(failOverNode *models.Node) error {
+// ResetFailedOverPeer - removes failed over node from network peers
+func ResetFailedOverPeer(failedOveredNode *models.Node) error {
+	nodes, err := logic.GetNetworkNodes(failedOveredNode.Network)
+	if err != nil {
+		return err
+	}
+	failedOveredNode.FailedOverBy = uuid.Nil
+	failedOveredNode.FailOverPeers = make(map[string]struct{})
+	err = logic.UpsertNode(failedOveredNode)
+	if err != nil {
+		return err
+	}
+	for _, node := range nodes {
+		if node.FailOverPeers == nil || node.ID == failedOveredNode.ID {
+			continue
+		}
+		delete(node.FailOverPeers, failedOveredNode.ID.String())
+		logic.UpsertNode(&node)
+	}
+	return nil
+}
+
+// ResetFailOver - reset failovered peers
+func ResetFailOver(failOverNode *models.Node) error {
 	// Unset FailedOverPeers
 	nodes, err := logic.GetNetworkNodes(failOverNode.Network)
 	if err != nil {

+ 1 - 0
pro/logic/relays.go

@@ -155,6 +155,7 @@ func UpdateRelayed(currentNode, newNode *models.Node) {
 	if len(updatenodes) > 0 {
 		for _, relayedNode := range updatenodes {
 			node := relayedNode
+			ResetFailedOverPeer(&node)
 			go func() {
 				if err := mq.NodeUpdate(&node); err != nil {
 					slog.Error("error publishing node update to node", "node", node.ID, "error", err)