| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | package logicimport (	"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 failOverfunc 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 networkfunc 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 peersfunc 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 peersfunc 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}
 |