Browse Source

add ability to reset failover

afeiszli 2 years ago
parent
commit
78bacce528
5 changed files with 53 additions and 1 deletions
  1. 14 0
      ee/initialize.go
  2. 29 0
      ee/logic/failover.go
  3. 6 0
      logic/gateway.go
  4. 3 0
      logic/server.go
  5. 1 1
      mq/handlers.go

+ 14 - 0
ee/initialize.go

@@ -30,6 +30,8 @@ func InitEE() {
 		AddLicenseHooks()
 	})
 	logic.EnterpriseFailoverFunc = eelogic.SetFailover
+	logic.EnterpriseResetFailoverFunc = eelogic.ResetFailover
+	resetFailover()
 }
 
 func setControllerLimits() {
@@ -40,6 +42,18 @@ func setControllerLimits() {
 	servercfg.Is_EE = true
 }
 
+func resetFailover() {
+	nets, err := logic.GetNetworks()
+	if err == nil {
+		for _, net := range nets {
+			err = logic.EnterpriseResetFailoverFunc.(func(string) error)(net.NetID)
+			if err != nil {
+				logger.Log(0, "failed to reset failover on network", net.NetID, ":", err.Error())
+			}
+		}
+	}
+}
+
 func retrieveEELogo() string {
 	return `              
  __   __     ______     ______   __    __     ______     __  __     ______     ______    

+ 29 - 0
ee/logic/failover.go

@@ -1,6 +1,7 @@
 package logic
 
 import (
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 )
@@ -14,6 +15,25 @@ func SetFailover(node *models.Node) error {
 	return nil
 }
 
+// ResetFailover - sets the failover node and wipes disconnected status
+func ResetFailover(network string) error {
+	nodes, err := logic.GetNetworkNodes(network)
+	if err != nil {
+		return err
+	}
+	for _, node := range nodes {
+		err = SetFailover(&node)
+		if err != nil {
+			logger.Log(2, "error setting failover for node", node.Name, ":", err.Error())
+		}
+		err = WipeFailover(node.ID)
+		if err != nil {
+			logger.Log(2, "error wiping failover for node", node.Name, ":", err.Error())
+		}
+	}
+	return nil
+}
+
 // determineFailoverCandidate - returns a list of nodes that
 // are suitable for relaying a given node
 func determineFailoverCandidate(nodeToBeRelayed *models.Node) *models.Node {
@@ -63,3 +83,12 @@ func setFailoverNode(failoverNode, node *models.Node) error {
 	}
 	return logic.UpdateNode(&nodeToUpdate, node)
 }
+
+func WipeFailover(nodeid string) error {
+	metrics, err := logic.GetMetrics(nodeid)
+	if err != nil {
+		return err
+	}
+	metrics.NeedsFailover = make(map[string]string)
+	return logic.UpdateMetrics(nodeid, metrics)
+}

+ 6 - 0
logic/gateway.go

@@ -260,6 +260,7 @@ func DeleteIngressGateway(networkName string, nodeid string) (models.Node, error
 	node.LastModified = time.Now().Unix()
 	node.IsIngressGateway = "no"
 	node.IngressGatewayRange = ""
+	node.Failover = ""
 
 	// default to removing postup and postdown
 	node.PostUp = ""
@@ -274,6 +275,11 @@ func DeleteIngressGateway(networkName string, nodeid string) (models.Node, error
 		}
 	}
 
+	err = EnterpriseResetFailoverFunc.(func(string) error)(node.Network)
+	if err != nil {
+		logger.Log(0, "failed to reset failover on network", node.Network, ":", err.Error())
+	}
+
 	data, err := json.Marshal(&node)
 	if err != nil {
 		return models.Node{}, err

+ 3 - 0
logic/server.go

@@ -24,6 +24,9 @@ var EnterpriseCheckFuncs []interface{}
 // EnterpriseFailoverFunc - interface to control failover funcs
 var EnterpriseFailoverFunc interface{}
 
+// EnterpriseResetFailoverFunc - interface to control reset failover funcs
+var EnterpriseResetFailoverFunc interface{}
+
 // == Join, Checkin, and Leave for Server ==
 
 // KUBERNETES_LISTEN_PORT - starting port for Kubernetes in order to use NodePort range

+ 1 - 1
mq/handlers.go

@@ -138,7 +138,7 @@ func UpdateMetrics(client mqtt.Client, msg mqtt.Message) {
 			if newMetrics.Connectivity != nil {
 				err := logic.EnterpriseFailoverFunc.(func(*models.Node) error)(&currentNode)
 				if err != nil {
-					logger.Log(0, "could failed to failover for node", currentNode.Name, "on network", currentNode.Network, "-", err.Error())
+					logger.Log(0, "failed to failover for node", currentNode.Name, "on network", currentNode.Network, "-", err.Error())
 				} else {
 					if err := NodeUpdate(&currentNode); err != nil {
 						logger.Log(1, "error publishing node update to node", currentNode.Name, err.Error())