|
@@ -6,6 +6,7 @@ import (
|
|
|
"fmt"
|
|
|
"net"
|
|
|
"sort"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
|
|
|
validator "github.com/go-playground/validator/v10"
|
|
@@ -17,11 +18,51 @@ import (
|
|
|
"github.com/gravitl/netmaker/logic/pro"
|
|
|
"github.com/gravitl/netmaker/logic/pro/proacls"
|
|
|
"github.com/gravitl/netmaker/models"
|
|
|
- "github.com/gravitl/netmaker/netclient/ncutils"
|
|
|
"github.com/gravitl/netmaker/servercfg"
|
|
|
"github.com/gravitl/netmaker/validation"
|
|
|
)
|
|
|
|
|
|
+var (
|
|
|
+ NodeCacheMutex = &sync.RWMutex{}
|
|
|
+ NodesCacheMap = make(map[string]models.Node)
|
|
|
+)
|
|
|
+
|
|
|
+func GetNodeFromCache(nodeID string) (node models.Node, ok bool) {
|
|
|
+ NodeCacheMutex.RLock()
|
|
|
+ node, ok = NodesCacheMap[nodeID]
|
|
|
+ NodeCacheMutex.RUnlock()
|
|
|
+ return
|
|
|
+}
|
|
|
+func GetNodesFromCache() (nMap map[string]models.Node) {
|
|
|
+ NodeCacheMutex.RLock()
|
|
|
+ nMap = NodesCacheMap
|
|
|
+ NodeCacheMutex.RUnlock()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func DeleteNodeFromCache(nodeID string) {
|
|
|
+ NodeCacheMutex.Lock()
|
|
|
+ delete(NodesCacheMap, nodeID)
|
|
|
+ NodeCacheMutex.Unlock()
|
|
|
+}
|
|
|
+
|
|
|
+func StoreNodeInCache(node models.Node) {
|
|
|
+ NodeCacheMutex.Lock()
|
|
|
+ NodesCacheMap[node.ID.String()] = node
|
|
|
+ NodeCacheMutex.Unlock()
|
|
|
+}
|
|
|
+
|
|
|
+func LoadNodesIntoCache(nMap map[string]models.Node) {
|
|
|
+ NodeCacheMutex.Lock()
|
|
|
+ NodesCacheMap = nMap
|
|
|
+ NodeCacheMutex.Unlock()
|
|
|
+}
|
|
|
+func ClearNodeCache() {
|
|
|
+ NodeCacheMutex.Lock()
|
|
|
+ NodesCacheMap = make(map[string]models.Node)
|
|
|
+ NodeCacheMutex.Unlock()
|
|
|
+}
|
|
|
+
|
|
|
const (
|
|
|
// RELAY_NODE_ERR - error to return if relay node is unfound
|
|
|
RELAY_NODE_ERR = "could not find relay for node"
|
|
@@ -72,7 +113,12 @@ func UpdateNodeCheckin(node *models.Node) error {
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- return database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ err = database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ StoreNodeInCache(*node)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
// UpsertNode - updates node in the DB
|
|
@@ -82,7 +128,12 @@ func UpsertNode(newNode *models.Node) error {
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- return database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ StoreNodeInCache(*newNode)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
// UpdateNode - takes a node and updates another node with it's values
|
|
@@ -114,7 +165,12 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
|
|
|
if data, err := json.Marshal(newNode); err != nil {
|
|
|
return err
|
|
|
} else {
|
|
|
- return database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ StoreNodeInCache(*newNode)
|
|
|
+ return nil
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -172,6 +228,7 @@ func deleteNodeByID(node *models.Node) error {
|
|
|
return err
|
|
|
}
|
|
|
}
|
|
|
+ DeleteNodeFromCache(node.ID.String())
|
|
|
if servercfg.IsDNSMode() {
|
|
|
SetDNS()
|
|
|
}
|
|
@@ -237,7 +294,15 @@ func IsFailoverPresent(network string) bool {
|
|
|
// GetAllNodes - returns all nodes in the DB
|
|
|
func GetAllNodes() ([]models.Node, error) {
|
|
|
var nodes []models.Node
|
|
|
-
|
|
|
+ nodesMap := GetNodesFromCache()
|
|
|
+ if len(nodesMap) != 0 {
|
|
|
+ for _, node := range nodesMap {
|
|
|
+ nodes = append(nodes, node)
|
|
|
+ }
|
|
|
+ return nodes, nil
|
|
|
+ }
|
|
|
+ nodesMap = make(map[string]models.Node)
|
|
|
+ defer LoadNodesIntoCache(nodesMap)
|
|
|
collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
|
|
|
if err != nil {
|
|
|
if database.IsEmptyRecord(err) {
|
|
@@ -255,6 +320,7 @@ func GetAllNodes() ([]models.Node, error) {
|
|
|
}
|
|
|
// add node to our array
|
|
|
nodes = append(nodes, node)
|
|
|
+ nodesMap[node.ID.String()] = node
|
|
|
}
|
|
|
|
|
|
return nodes, nil
|
|
@@ -309,46 +375,10 @@ func GetRecordKey(id string, network string) (string, error) {
|
|
|
return id + "###" + network, nil
|
|
|
}
|
|
|
|
|
|
-// GetNodesByAddress - gets a node by mac address
|
|
|
-func GetNodesByAddress(network string, addresses []string) ([]models.Node, error) {
|
|
|
- var nodes []models.Node
|
|
|
- allnodes, err := GetAllNodes()
|
|
|
- if err != nil {
|
|
|
- return []models.Node{}, err
|
|
|
- }
|
|
|
- for _, node := range allnodes {
|
|
|
- if node.Network == network && ncutils.StringSliceContains(addresses, node.Address.String()) {
|
|
|
- nodes = append(nodes, node)
|
|
|
- }
|
|
|
- }
|
|
|
- return nodes, nil
|
|
|
-}
|
|
|
-
|
|
|
-// GetDeletedNodeByMacAddress - get a deleted node
|
|
|
-func GetDeletedNodeByMacAddress(network string, macaddress string) (models.Node, error) {
|
|
|
-
|
|
|
- var node models.Node
|
|
|
-
|
|
|
- key, err := GetRecordKey(macaddress, network)
|
|
|
- if err != nil {
|
|
|
- return node, err
|
|
|
- }
|
|
|
-
|
|
|
- record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, key)
|
|
|
- if err != nil {
|
|
|
- return models.Node{}, err
|
|
|
- }
|
|
|
-
|
|
|
- if err = json.Unmarshal([]byte(record), &node); err != nil {
|
|
|
- return models.Node{}, err
|
|
|
- }
|
|
|
-
|
|
|
- SetNodeDefaults(&node)
|
|
|
-
|
|
|
- return node, nil
|
|
|
-}
|
|
|
-
|
|
|
func GetNodeByID(uuid string) (models.Node, error) {
|
|
|
+ if node, ok := GetNodeFromCache(uuid); ok {
|
|
|
+ return node, nil
|
|
|
+ }
|
|
|
var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
|
|
|
if err != nil {
|
|
|
return models.Node{}, err
|
|
@@ -357,6 +387,7 @@ func GetNodeByID(uuid string) (models.Node, error) {
|
|
|
if err = json.Unmarshal([]byte(record), &node); err != nil {
|
|
|
return models.Node{}, err
|
|
|
}
|
|
|
+ StoreNodeInCache(node)
|
|
|
return node, nil
|
|
|
}
|
|
|
|
|
@@ -506,7 +537,7 @@ func createNode(node *models.Node) error {
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
+ StoreNodeInCache(*node)
|
|
|
_, err = nodeacls.CreateNodeACL(nodeacls.NetworkID(node.Network), nodeacls.NodeID(node.ID.String()), defaultACLVal)
|
|
|
if err != nil {
|
|
|
logger.Log(1, "failed to create node ACL for node,", node.ID.String(), "err:", err.Error())
|