diff --git a/controllers/network.go b/controllers/network.go index 305ac566..3910d127 100644 --- a/controllers/network.go +++ b/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 + 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, "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()) - } - } + }() logger.Log(1, r.Header.Get("user"), "created network", network.NetID) w.WriteHeader(http.StatusOK) diff --git a/logic/peers.go b/logic/peers.go index c63ea286..beca1dff 100644 --- a/logic/peers.go +++ b/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 diff --git a/pro/controllers/failover.go b/pro/controllers/failover.go index 91fa1b6f..8a199c3b 100644 --- a/pro/controllers/failover.go +++ b/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 } diff --git a/pro/initialize.go b/pro/initialize.go index 5481e507..c13d53b2 100644 --- a/pro/initialize.go +++ b/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 diff --git a/pro/logic/failover.go b/pro/logic/failover.go index c3a94c20..2313e4b5 100644 --- a/pro/logic/failover.go +++ b/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 +}