Forráskód Böngészése

misc changes for failover

Max Ma 1 éve
szülő
commit
cee92f90e2
2 módosított fájl, 29 hozzáadás és 27 törlés
  1. 10 26
      pro/controllers/failover.go
  2. 19 1
      pro/logic/failover.go

+ 10 - 26
pro/controllers/failover.go

@@ -159,24 +159,24 @@ func failOverME(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("peer not found"), "badrequest"))
 		return
 	}
-	if node.IsIngressGateway {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is acting as remote access gw"), "badrequest"))
+	if node.IsFailOver {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is acting as failover"), "badrequest"))
 		return
 	}
-	if node.IsRelayed || node.IsFailOver {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is relayed or acting as failover"), "badrequest"))
+	if node.IsRelayed && node.RelayedBy == peerNode.ID.String() {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is relayed by peer node"), "badrequest"))
 		return
 	}
-	if node.IsRelay {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node acting as relay cannot be failedOver"), "badrequest"))
+	if node.IsRelay && peerNode.RelayedBy == node.ID.String() {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node acting as relay for the peer node"), "badrequest"))
 		return
 	}
-	if node.IsInternetGateway {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node acting as internet gw cannot be failedOver"), "badrequest"))
+	if node.IsInternetGateway && peerNode.InternetGwID == node.ID.String() {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node acting as internet gw for the peer node"), "badrequest"))
 		return
 	}
-	if node.InternetGwID != "" {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node using a internet gw cannot be failedOver"), "badrequest"))
+	if node.InternetGwID != "" && node.InternetGwID == peerNode.ID.String() {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node using a internet gw by the peer node"), "badrequest"))
 		return
 	}
 
@@ -187,22 +187,6 @@ func failOverME(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create failover: %v", err), "internal"))
 		return
 	}
-	//relayed is not a single peer in host's peer list,  it's in the relay peer info. So there is no failover me triggered for relayed.
-	//if peerNode is relay, setup the failover flag for each relayed
-	if peerNode.IsRelay {
-		for _, id := range peerNode.RelayedNodes {
-			rNode, err := logic.GetNodeByID(id)
-			if err != nil {
-				slog.Error("failed to load relayed by id", "Eror", id)
-				continue
-			}
-			err = proLogic.SetFailOverCtx(failOverNode, node, rNode)
-			if err != nil {
-				slog.Error("failed to create failover", "id", node.ID.String(),
-					"network", node.Network, "on relayed", id, "error", err)
-			}
-		}
-	}
 	slog.Info("[auto-relay] created relay on node", "node", node.ID.String(), "network", node.Network)
 	sendPeerUpdate = true
 

+ 19 - 1
pro/logic/failover.go

@@ -123,7 +123,25 @@ func GetFailOverPeerIps(peer, node *models.Node) []net.IPNet {
 			if failOverpeer.IsEgressGateway {
 				allowedips = append(allowedips, logic.GetEgressIPs(&failOverpeer)...)
 			}
-
+			if failOverpeer.IsRelay {
+				for _, id := range failOverpeer.RelayedNodes {
+					rNode, _ := logic.GetNodeByID(id)
+					if rNode.Address.IP != nil {
+						allowed := net.IPNet{
+							IP:   rNode.Address.IP,
+							Mask: net.CIDRMask(32, 32),
+						}
+						allowedips = append(allowedips, allowed)
+					}
+					if rNode.Address6.IP != nil {
+						allowed := net.IPNet{
+							IP:   rNode.Address6.IP,
+							Mask: net.CIDRMask(128, 128),
+						}
+						allowedips = append(allowedips, allowed)
+					}
+				}
+			}
 		}
 	}
 	return allowedips