From b95f3eb84679934370108f9a02f0ebbbea3d1ef2 Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Wed, 28 Sep 2022 14:59:21 -0400 Subject: [PATCH] initial PoC completed --- controllers/node.go | 9 +++++++-- ee/logic/failover.go | 9 +-------- logic/gateway.go | 9 +++++---- logic/peers.go | 19 +++++++++++-------- mq/handlers.go | 6 ++++++ mq/publishers.go | 2 -- 6 files changed, 30 insertions(+), 24 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index c79d400f..14416df4 100644 --- a/controllers/node.go +++ b/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", diff --git a/ee/logic/failover.go b/ee/logic/failover.go index 8b0de150..de24d227 100644 --- a/ee/logic/failover.go +++ b/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 { diff --git a/logic/gateway.go b/logic/gateway.go index d5ef8877..537eaa19 100644 --- a/logic/gateway.go +++ b/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 = "" diff --git a/logic/peers.go b/logic/peers.go index 7025c2e3..9d117040 100644 --- a/logic/peers.go +++ b/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) } } } diff --git a/mq/handlers.go b/mq/handlers.go index 31998ff4..65071fee 100644 --- a/mq/handlers.go +++ b/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) } diff --git a/mq/publishers.go b/mq/publishers.go index 8b2f3205..549e7d28 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -217,9 +217,7 @@ func collectServerMetrics(networks []models.Network) { logger.Log(2, "failed to push server metrics to exporter: ", err.Error()) } } - } - } } }