Browse Source

initial PoC completed

0xdcarns 2 years ago
parent
commit
b95f3eb846
6 changed files with 30 additions and 24 deletions
  1. 7 2
      controllers/node.go
  2. 1 8
      ee/logic/failover.go
  3. 5 4
      logic/gateway.go
  4. 11 8
      logic/peers.go
  5. 6 0
      mq/handlers.go
  6. 0 2
      mq/publishers.go

+ 7 - 2
controllers/node.go

@@ -754,10 +754,15 @@ func deleteEgressGateway(w http.ResponseWriter, r *http.Request) {
 func createIngressGateway(w http.ResponseWriter, r *http.Request) {
 	var params = mux.Vars(r)
 	w.Header().Set("Content-Type", "application/json")
-	failover := r.Header.Get("failover") == "yes"
 	nodeid := params["nodeid"]
 	netid := params["network"]
-	node, err := logic.CreateIngressGateway(netid, nodeid, failover)
+	type failoverData struct {
+		Failover bool `json:"failover"`
+	}
+	var failoverReqBody failoverData
+	json.NewDecoder(r.Body).Decode(&failoverReqBody)
+
+	node, err := logic.CreateIngressGateway(netid, nodeid, failoverReqBody.Failover)
 	if err != nil {
 		logger.Log(0, r.Header.Get("user"),
 			fmt.Sprintf("failed to create ingress gateway on node [%s] on network [%s]: %v",

+ 1 - 8
ee/logic/failover.go

@@ -63,19 +63,12 @@ func determineFailoverCandidate(nodeToBeRelayed *models.Node) *models.Node {
 		}
 	}
 
-	if fastestCandidate == nil {
-		leader, err := logic.GetNetworkServerLeader(nodeToBeRelayed.Network)
-		if err != nil {
-			return nil
-		}
-		return &leader
-	}
-
 	return fastestCandidate
 }
 
 // setFailoverNode - changes node's failover node
 func setFailoverNode(failoverNode, node *models.Node) error {
+
 	node.FailoverNode = failoverNode.ID
 	nodeToUpdate, err := logic.GetNodeByID(node.ID)
 	if err != nil {

+ 5 - 4
logic/gateway.go

@@ -10,6 +10,7 @@ import (
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/servercfg"
 )
 
 // CreateEgressGateway - creates an egress gateway
@@ -224,9 +225,9 @@ func CreateIngressGateway(netid string, nodeid string, failover bool) (models.No
 	node.PostUp = postUpCmd
 	node.PostDown = postDownCmd
 	node.UDPHolePunch = "no"
-	// if failover && servercfg.Is_EE {
-	// 	node.Failover = "yes"
-	// }
+	if failover && servercfg.Is_EE {
+		node.Failover = "yes"
+	}
 	data, err := json.Marshal(&node)
 	if err != nil {
 		return models.Node{}, err
@@ -260,7 +261,7 @@ func DeleteIngressGateway(networkName string, nodeid string) (models.Node, error
 	node.LastModified = time.Now().Unix()
 	node.IsIngressGateway = "no"
 	node.IngressGatewayRange = ""
-	node.Failover = ""
+	node.Failover = "no"
 
 	// default to removing postup and postdown
 	node.PostUp = ""

+ 11 - 8
logic/peers.go

@@ -37,6 +37,9 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 	if servercfg.Is_EE {
 		metrics, _ = GetMetrics(node.ID)
 	}
+	if metrics == nil {
+		metrics = &models.Metrics{}
+	}
 	if metrics.FailoverPeers == nil {
 		metrics.FailoverPeers = make(map[string]string)
 	}
@@ -94,6 +97,7 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 		}
 		if len(metrics.FailoverPeers[peer.ID]) > 0 {
 			logger.Log(0, "peer", peer.Name, peer.PrimaryAddress(), "was found to be in failover peers list for node", node.Name, node.PrimaryAddress())
+			continue
 		}
 		pubkey, err := wgtypes.ParseKey(peer.PublicKey)
 		if err != nil {
@@ -147,7 +151,7 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 				return models.PeerUpdate{}, err
 			}
 		}
-		// set_allowedips
+
 		allowedips := GetAllowedIPs(node, &peer, metrics)
 		var keepalive time.Duration
 		if node.PersistentKeepalive != 0 {
@@ -258,7 +262,6 @@ func getExtPeers(node *models.Node) ([]wgtypes.PeerConfig, []models.IDandAddr, e
 // GetAllowedIPs - calculates the wireguard allowedip field for a peer of a node based on the peer and node settings
 func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet {
 	var allowedips []net.IPNet
-
 	allowedips = getNodeAllowedIPs(peer, node)
 
 	// handle ingress gateway peers
@@ -272,16 +275,16 @@ func GetAllowedIPs(node, peer *models.Node, metrics *models.Metrics) []net.IPNet
 		}
 		// if node is a failover node, add allowed ips from nodes it is handling
 		if peer.Failover == "yes" && metrics.FailoverPeers != nil {
-			// travers through nodes that need handling
-			for k, v := range metrics.FailoverPeers {
+			// traverse through nodes that need handling
+			logger.Log(3, "peer", peer.Name, "was found to be failover for", node.Name, "checking failover peers...")
+			for k := range metrics.FailoverPeers {
 				// if FailoverNode is me for this node, add allowedips
-				if v == peer.ID {
+				if metrics.FailoverPeers[k] == peer.ID {
 					// get original node so we can traverse the allowed ips
 					nodeToFailover, err := GetNodeByID(k)
 					if err == nil {
-						// get all allowedips and append
-						// allowedips = append(allowedips, getNodeAllowedIPs(&nodeToFailover, peer)...)
-						logger.Log(0, "failing over node", nodeToFailover.Name, nodeToFailover.PrimaryAddress())
+						allowedips = append(allowedips, getNodeAllowedIPs(&nodeToFailover, peer)...)
+						logger.Log(0, "failing over node", nodeToFailover.Name, nodeToFailover.PrimaryAddress(), "to failover node", peer.Name)
 					}
 				}
 			}

+ 6 - 0
mq/handlers.go

@@ -266,6 +266,12 @@ func updateNodeMetrics(currentNode *models.Node, newMetrics *models.Metrics) {
 		}
 	}
 
+	for k, v := range oldMetrics.FailoverPeers {
+		if len(v) > 0 && len(newMetrics.FailoverPeers[k]) == 0 {
+			newMetrics.FailoverPeers[k] = v
+		}
+	}
+
 	for k := range oldMetrics.Connectivity { // cleanup any left over data, self healing
 		delete(newMetrics.Connectivity, k)
 	}

+ 0 - 2
mq/publishers.go

@@ -217,9 +217,7 @@ func collectServerMetrics(networks []models.Network) {
 									logger.Log(2, "failed to push server metrics to exporter: ", err.Error())
 								}
 							}
-
 						}
-
 					}
 				}
 			}