netmaker/pro/logic/failover.go
Abhishek K b78cc0a8a1
NET-725: Failovers (#2685)
* api to  to get host relayed from client

* add auto relay to api host

* add peer nat type

* set pro field on signal

* rm net check on relay me handler

* return success response

* re-establish failover logic

* set failOver ctx

* failOver with peer pub key

* failovered peer updates

* failover handlers, reset failovered peer on deletion

* rm unused funcs

* initialize failover handler on EE

* ignore failover node on signal

* failover changes

* set host id on signal

* extend signal model to include node ids

* add backwards compatibility

* add failover as node api

* set json response on failover handers

* add failover field to api node

* fix signal data check

* initialize failover peer map

* reset failovered status when relayed or deleted

* add failover info to api node

* reset network failover

* only proceed furtuer if failover exists in the network

* set failOver node defaults

* cannot set failover node as relayed

* debug log

* debug log

* debug changes

* debug changes

* debug changes

* revert debug changes

* don't add peers to idmap when removed

* reset failed Over

* fix static checks

* rm debug log

* add check for linux host
2023-11-29 20:10:07 +04:00

99 lines
2.5 KiB
Go

package logic
import (
"errors"
"github.com/google/uuid"
"github.com/gravitl/netmaker/logic"
"github.com/gravitl/netmaker/models"
)
func SetFailOverCtx(failOverNode, victimNode, peerNode models.Node) error {
if peerNode.FailOverPeers == nil {
peerNode.FailOverPeers = make(map[string]struct{})
}
if victimNode.FailOverPeers == nil {
victimNode.FailOverPeers = make(map[string]struct{})
}
peerNode.FailOverPeers[victimNode.ID.String()] = struct{}{}
victimNode.FailOverPeers[peerNode.ID.String()] = struct{}{}
victimNode.FailedOverBy = failOverNode.ID
peerNode.FailedOverBy = failOverNode.ID
if err := logic.UpsertNode(&failOverNode); err != nil {
return err
}
if err := logic.UpsertNode(&victimNode); err != nil {
return err
}
if err := logic.UpsertNode(&peerNode); err != nil {
return err
}
return nil
}
// GetFailOverNode - gets the host acting as failOver
func GetFailOverNode(network string, allNodes []models.Node) (models.Node, error) {
nodes := logic.GetNetworkNodesMemory(allNodes, network)
for _, node := range nodes {
if node.IsFailOver {
return node, nil
}
}
return models.Node{}, errors.New("auto relay not found")
}
// FailOverExists - checks if failOver exists already in the network
func FailOverExists(network string) (failOverNode models.Node, exists bool) {
nodes, err := logic.GetNetworkNodes(network)
if err != nil {
return
}
for _, node := range nodes {
if node.IsFailOver {
exists = true
failOverNode = node
return
}
}
return
}
// ResetFailedOverPeer - removes failed over node from network peers
func ResetFailedOverPeer(failedOveredNode *models.Node) error {
nodes, err := logic.GetNetworkNodes(failedOveredNode.Network)
if err != nil {
return err
}
failedOveredNode.FailedOverBy = uuid.Nil
failedOveredNode.FailOverPeers = make(map[string]struct{})
err = logic.UpsertNode(failedOveredNode)
if err != nil {
return err
}
for _, node := range nodes {
if node.FailOverPeers == nil || node.ID == failedOveredNode.ID {
continue
}
delete(node.FailOverPeers, failedOveredNode.ID.String())
logic.UpsertNode(&node)
}
return nil
}
// ResetFailOver - reset failovered peers
func ResetFailOver(failOverNode *models.Node) error {
// Unset FailedOverPeers
nodes, err := logic.GetNetworkNodes(failOverNode.Network)
if err != nil {
return err
}
for _, node := range nodes {
if node.FailedOverBy == failOverNode.ID {
node.FailedOverBy = uuid.Nil
node.FailOverPeers = make(map[string]struct{})
logic.UpsertNode(&node)
}
}
return nil
}