Browse Source

Merge pull request #2813 from gravitl/NET-928

NET-928: make default host failover and remote access gw on joining new network
Abhishek K 1 year ago
parent
commit
a4288aaaca
7 changed files with 65 additions and 38 deletions
  1. 6 0
      auth/host_session.go
  2. 6 0
      controllers/hosts.go
  3. 23 18
      controllers/network.go
  4. 4 0
      logic/peers.go
  5. 1 20
      pro/controllers/failover.go
  6. 1 0
      pro/initialize.go
  7. 24 0
      pro/logic/failover.go

+ 6 - 0
auth/host_session.go

@@ -264,6 +264,12 @@ func CheckNetRegAndHostUpdate(networks []string, h *models.Host, relayNodeId uui
 				Host:   *h,
 				Node:   *newNode,
 			})
+			if h.IsDefault {
+				// make  host failover
+				logic.CreateFailOver(*newNode)
+				// make host remote access gateway
+				logic.CreateIngressGateway(network, newNode.ID.String(), models.IngressRequest{})
+			}
 		}
 	}
 	if servercfg.IsMessageQueueBackend() {

+ 6 - 0
controllers/hosts.go

@@ -354,6 +354,12 @@ func addHostToNetwork(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
+	if currHost.IsDefault {
+		// make  host failover
+		logic.CreateFailOver(*newNode)
+		// make host remote access gateway
+		logic.CreateIngressGateway(network, newNode.ID.String(), models.IngressRequest{})
+	}
 	go func() {
 		mq.HostUpdate(&models.HostUpdate{
 			Action: models.JoinHostToNetwork,

+ 23 - 18
controllers/network.go

@@ -288,25 +288,30 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
-
-	defaultHosts := logic.GetDefaultHosts()
-	for i := range defaultHosts {
-		currHost := &defaultHosts[i]
-		newNode, err := logic.UpdateHostNetwork(currHost, network.NetID, true)
-		if err != nil {
-			logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
-			logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
-			return
-		}
-		logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
-		if err = mq.HostUpdate(&models.HostUpdate{
-			Action: models.JoinHostToNetwork,
-			Host:   *currHost,
-			Node:   *newNode,
-		}); err != nil {
-			logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
+	go func() {
+		defaultHosts := logic.GetDefaultHosts()
+		for i := range defaultHosts {
+			currHost := &defaultHosts[i]
+			newNode, err := logic.UpdateHostNetwork(currHost, network.NetID, true)
+			if err != nil {
+				logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
+				logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
+				return
+			}
+			logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
+			if err = mq.HostUpdate(&models.HostUpdate{
+				Action: models.JoinHostToNetwork,
+				Host:   *currHost,
+				Node:   *newNode,
+			}); err != nil {
+				logger.Log(0, r.Header.Get("user"), "failed to add host to network:", currHost.ID.String(), network.NetID, err.Error())
+			}
+			// make  host failover
+			logic.CreateFailOver(*newNode)
+			// make host remote access gateway
+			logic.CreateIngressGateway(network.NetID, newNode.ID.String(), models.IngressRequest{})
 		}
-	}
+	}()
 
 	logger.Log(1, r.Header.Get("user"), "created network", network.NetID)
 	w.WriteHeader(http.StatusOK)

+ 4 - 0
logic/peers.go

@@ -28,6 +28,10 @@ var (
 	GetFailOverPeerIps = func(peer, node *models.Node) []net.IPNet {
 		return []net.IPNet{}
 	}
+
+	CreateFailOver = func(node models.Node) error {
+		return nil
+	}
 )
 
 // GetPeerUpdateForHost - gets the consolidated peer update for the host from all networks

+ 1 - 20
pro/controllers/failover.go

@@ -46,27 +46,8 @@ func createfailOver(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
-	if _, exists := proLogic.FailOverExists(node.Network); exists {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failover exists already in the network"), "badrequest"))
-		return
-	}
-	host, err := logic.GetHost(node.HostID.String())
+	err = proLogic.CreateFailOver(node)
 	if err != nil {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("error getting host"+err.Error()), "badrequest"))
-		return
-	}
-	if host.OS != models.OS_Types.Linux {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only linux nodes can act as failovers"), "badrequest"))
-		return
-	}
-	if node.IsRelayed {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot set relayed node as failover"), "badrequest"))
-		return
-	}
-	node.IsFailOver = true
-	err = logic.UpsertNode(&node)
-	if err != nil {
-		slog.Error("failed to upsert node", "node", node.ID.String(), "error", err)
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}

+ 1 - 0
pro/initialize.go

@@ -83,6 +83,7 @@ func InitPro() {
 	})
 	logic.ResetFailOver = proLogic.ResetFailOver
 	logic.ResetFailedOverPeer = proLogic.ResetFailedOverPeer
+	logic.CreateFailOver = proLogic.CreateFailOver
 	logic.GetFailOverPeerIps = proLogic.GetFailOverPeerIps
 	logic.DenyClientNodeAccess = proLogic.DenyClientNode
 	logic.IsClientNodeAllowed = proLogic.IsClientNodeAllowed

+ 24 - 0
pro/logic/failover.go

@@ -7,6 +7,7 @@ import (
 	"github.com/google/uuid"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
+	"golang.org/x/exp/slog"
 )
 
 func SetFailOverCtx(failOverNode, victimNode, peerNode models.Node) error {
@@ -123,3 +124,26 @@ func GetFailOverPeerIps(peer, node *models.Node) []net.IPNet {
 	}
 	return allowedips
 }
+
+func CreateFailOver(node models.Node) error {
+	if _, exists := FailOverExists(node.Network); exists {
+		return errors.New("failover already exists in the network")
+	}
+	host, err := logic.GetHost(node.HostID.String())
+	if err != nil {
+		return err
+	}
+	if host.OS != models.OS_Types.Linux {
+		return err
+	}
+	if node.IsRelayed {
+		return err
+	}
+	node.IsFailOver = true
+	err = logic.UpsertNode(&node)
+	if err != nil {
+		slog.Error("failed to upsert node", "node", node.ID.String(), "error", err)
+		return err
+	}
+	return nil
+}