|
@@ -8,14 +8,14 @@ import (
|
|
|
controller "github.com/gravitl/netmaker/controllers"
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
|
"github.com/gravitl/netmaker/logic"
|
|
|
- "github.com/gravitl/netmaker/models"
|
|
|
"github.com/gravitl/netmaker/mq"
|
|
|
proLogic "github.com/gravitl/netmaker/pro/logic"
|
|
|
"golang.org/x/exp/slog"
|
|
|
)
|
|
|
|
|
|
type FailOverMeReq struct {
|
|
|
- PeerPubKey string `json:"peer_pub_key"`
|
|
|
+ MyNodeID string `json:"my_node_id"`
|
|
|
+ PeerNodeID string `json:"peer_node_id"`
|
|
|
}
|
|
|
|
|
|
// RelayHandlers - handle Pro Relays
|
|
@@ -36,11 +36,11 @@ func FailOverHandler(r *mux.Router) {
|
|
|
// 200: nodeResponse
|
|
|
func failOverME(w http.ResponseWriter, r *http.Request) {
|
|
|
var params = mux.Vars(r)
|
|
|
- hostid := params["hostid"]
|
|
|
+ nodeid := params["nodeid"]
|
|
|
// confirm host exists
|
|
|
- host, err := logic.GetHost(hostid)
|
|
|
+ node, err := logic.GetNodeByID(nodeid)
|
|
|
if err != nil {
|
|
|
- logger.Log(0, r.Header.Get("user"), "failed to get host:", err.Error())
|
|
|
+ logger.Log(0, r.Header.Get("user"), "failed to get node:", err.Error())
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
return
|
|
|
}
|
|
@@ -51,50 +51,45 @@ func failOverME(w http.ResponseWriter, r *http.Request) {
|
|
|
var failOverReq FailOverMeReq
|
|
|
err = json.NewDecoder(r.Body).Decode(&failOverReq)
|
|
|
if err != nil {
|
|
|
- logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
|
|
|
+ slog.Error("error decoding request body: ", "error", err.Error())
|
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
return
|
|
|
}
|
|
|
- var sendPeerUpdate bool
|
|
|
allNodes, err := logic.GetAllNodes()
|
|
|
if err != nil {
|
|
|
slog.Error("failed to get all nodes", "error", err)
|
|
|
}
|
|
|
- logic.GetHost()
|
|
|
- for _, nodeID := range host.Nodes {
|
|
|
- node, err := logic.GetNodeByID(nodeID)
|
|
|
- if err != nil {
|
|
|
- slog.Error("couldn't find node", "id", nodeID, "error", err)
|
|
|
- continue
|
|
|
- }
|
|
|
- if node.IsRelayed {
|
|
|
- continue
|
|
|
- }
|
|
|
- // get auto relay Host in this network
|
|
|
- failOverNode, err := proLogic.GetFailOverNode(node.Network, allNodes)
|
|
|
- if err != nil {
|
|
|
- slog.Error("auto relay not found", "network", node.Network)
|
|
|
- continue
|
|
|
- }
|
|
|
- peerHost, err := logic.GetHostByPubKey(failOverReq.PeerPubKey)
|
|
|
- if err != nil {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- err = proLogic.SetFailOverCtx(failOverNode, node, models.Node{})
|
|
|
- if err != nil {
|
|
|
- slog.Error("failed to create relay:", "id", node.ID.String(),
|
|
|
- "network", node.Network, "error", err)
|
|
|
- continue
|
|
|
- }
|
|
|
- slog.Info("[auto-relay] created relay on node", "node", node.ID.String(), "network", node.Network)
|
|
|
- sendPeerUpdate = true
|
|
|
+ peerNode, err := logic.GetNodeByID(failOverReq.PeerNodeID)
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("failed to get node", "error", err.Error())
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- if sendPeerUpdate {
|
|
|
- go mq.PublishPeerUpdate()
|
|
|
+ if peerNode.Network != node.Network {
|
|
|
+ slog.Error("node and peer aren't of same network", "error", err.Error())
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
+ return
|
|
|
}
|
|
|
-
|
|
|
+ if node.IsRelayed {
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ failOverNode, err := proLogic.GetFailOverNode(node.Network, allNodes)
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("auto relay not found", "network", node.Network)
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = proLogic.SetFailOverCtx(failOverNode, node, peerNode)
|
|
|
+ if err != nil {
|
|
|
+ slog.Error("failed to create relay:", "id", node.ID.String(),
|
|
|
+ "network", node.Network, "error", err)
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ slog.Info("[auto-relay] created relay on node", "node", node.ID.String(), "network", node.Network)
|
|
|
+ go mq.PublishPeerUpdate()
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
|
logic.ReturnSuccessResponse(w, r, "relayed successfully")
|
|
|
}
|