|
@@ -15,13 +15,52 @@ import (
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/logic/acls/nodeacls"
|
|
"github.com/gravitl/netmaker/logic/acls/nodeacls"
|
|
"github.com/gravitl/netmaker/models"
|
|
"github.com/gravitl/netmaker/models"
|
|
|
|
+ "github.com/gravitl/netmaker/servercfg"
|
|
"github.com/gravitl/netmaker/validation"
|
|
"github.com/gravitl/netmaker/validation"
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+var (
|
|
|
|
+ networkCacheMutex = &sync.RWMutex{}
|
|
|
|
+ networkCacheMap = make(map[string]models.Network)
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func getNetworksFromCache() (networks []models.Network) {
|
|
|
|
+ networkCacheMutex.RLock()
|
|
|
|
+ for _, network := range networkCacheMap {
|
|
|
|
+ networks = append(networks, network)
|
|
|
|
+ }
|
|
|
|
+ networkCacheMutex.RUnlock()
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func deleteNetworkFromCache(key string) {
|
|
|
|
+ networkCacheMutex.Lock()
|
|
|
|
+ delete(networkCacheMap, key)
|
|
|
|
+ networkCacheMutex.Unlock()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func getNetworkFromCache(key string) (network models.Network, ok bool) {
|
|
|
|
+ networkCacheMutex.RLock()
|
|
|
|
+ network, ok = networkCacheMap[key]
|
|
|
|
+ networkCacheMutex.RUnlock()
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func storeNetworkInCache(key string, network models.Network) {
|
|
|
|
+ networkCacheMutex.Lock()
|
|
|
|
+ networkCacheMap[key] = network
|
|
|
|
+ networkCacheMutex.Unlock()
|
|
|
|
+}
|
|
|
|
+
|
|
// GetNetworks - returns all networks from database
|
|
// GetNetworks - returns all networks from database
|
|
func GetNetworks() ([]models.Network, error) {
|
|
func GetNetworks() ([]models.Network, error) {
|
|
var networks []models.Network
|
|
var networks []models.Network
|
|
-
|
|
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ networks := getNetworksFromCache()
|
|
|
|
+ if len(networks) != 0 {
|
|
|
|
+ return networks, nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
collection, err := database.FetchRecords(database.NETWORKS_TABLE_NAME)
|
|
collection, err := database.FetchRecords(database.NETWORKS_TABLE_NAME)
|
|
if err != nil {
|
|
if err != nil {
|
|
return networks, err
|
|
return networks, err
|
|
@@ -34,6 +73,9 @@ func GetNetworks() ([]models.Network, error) {
|
|
}
|
|
}
|
|
// add network our array
|
|
// add network our array
|
|
networks = append(networks, network)
|
|
networks = append(networks, network)
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ storeNetworkInCache(network.NetID, network)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return networks, err
|
|
return networks, err
|
|
@@ -49,7 +91,14 @@ func DeleteNetwork(network string) error {
|
|
nodeCount, err := GetNetworkNonServerNodeCount(network)
|
|
nodeCount, err := GetNetworkNonServerNodeCount(network)
|
|
if nodeCount == 0 || database.IsEmptyRecord(err) {
|
|
if nodeCount == 0 || database.IsEmptyRecord(err) {
|
|
// delete server nodes first then db records
|
|
// delete server nodes first then db records
|
|
- return database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
|
|
|
|
|
|
+ err = database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ deleteNetworkFromCache(network)
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
}
|
|
}
|
|
return errors.New("node check failed. All nodes must be deleted before deleting network")
|
|
return errors.New("node check failed. All nodes must be deleted before deleting network")
|
|
}
|
|
}
|
|
@@ -93,6 +142,9 @@ func CreateNetwork(network models.Network) (models.Network, error) {
|
|
if err = database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME); err != nil {
|
|
if err = database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME); err != nil {
|
|
return models.Network{}, err
|
|
return models.Network{}, err
|
|
}
|
|
}
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ storeNetworkInCache(network.NetID, network)
|
|
|
|
+ }
|
|
|
|
|
|
return network, nil
|
|
return network, nil
|
|
}
|
|
}
|
|
@@ -128,6 +180,11 @@ func intersect(n1, n2 *net.IPNet) bool {
|
|
func GetParentNetwork(networkname string) (models.Network, error) {
|
|
func GetParentNetwork(networkname string) (models.Network, error) {
|
|
|
|
|
|
var network models.Network
|
|
var network models.Network
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ if network, ok := getNetworkFromCache(networkname); ok {
|
|
|
|
+ return network, nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
if err != nil {
|
|
if err != nil {
|
|
return network, err
|
|
return network, err
|
|
@@ -142,6 +199,11 @@ func GetParentNetwork(networkname string) (models.Network, error) {
|
|
func GetNetworkSettings(networkname string) (models.Network, error) {
|
|
func GetNetworkSettings(networkname string) (models.Network, error) {
|
|
|
|
|
|
var network models.Network
|
|
var network models.Network
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ if network, ok := getNetworkFromCache(networkname); ok {
|
|
|
|
+ return network, nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
if err != nil {
|
|
if err != nil {
|
|
return network, err
|
|
return network, err
|
|
@@ -320,6 +382,12 @@ func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (
|
|
}
|
|
}
|
|
newNetwork.SetNetworkLastModified()
|
|
newNetwork.SetNetworkLastModified()
|
|
err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME)
|
|
err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME)
|
|
|
|
+ if err == nil {
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ storeNetworkInCache(newNetwork.NetID, *newNetwork)
|
|
|
|
+ deleteNetworkFromCache(currentNetwork.NetID)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return hasrangeupdate4, hasrangeupdate6, hasholepunchupdate, err
|
|
return hasrangeupdate4, hasrangeupdate6, hasholepunchupdate, err
|
|
}
|
|
}
|
|
// copy values
|
|
// copy values
|
|
@@ -330,6 +398,11 @@ func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (
|
|
func GetNetwork(networkname string) (models.Network, error) {
|
|
func GetNetwork(networkname string) (models.Network, error) {
|
|
|
|
|
|
var network models.Network
|
|
var network models.Network
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ if network, ok := getNetworkFromCache(networkname); ok {
|
|
|
|
+ return network, nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
|
|
if err != nil {
|
|
if err != nil {
|
|
return network, err
|
|
return network, err
|
|
@@ -394,6 +467,9 @@ func SaveNetwork(network *models.Network) error {
|
|
if err := database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME); err != nil {
|
|
if err := database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ storeNetworkInCache(network.NetID, *network)
|
|
|
|
+ }
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
@@ -402,6 +478,11 @@ func NetworkExists(name string) (bool, error) {
|
|
|
|
|
|
var network string
|
|
var network string
|
|
var err error
|
|
var err error
|
|
|
|
+ if servercfg.CacheEnabled() {
|
|
|
|
+ if _, ok := getNetworkFromCache(name); ok {
|
|
|
|
+ return ok, nil
|
|
|
|
+ }
|
|
|
|
+ }
|
|
if network, err = database.FetchRecord(database.NETWORKS_TABLE_NAME, name); err != nil {
|
|
if network, err = database.FetchRecord(database.NETWORKS_TABLE_NAME, name); err != nil {
|
|
return false, err
|
|
return false, err
|
|
}
|
|
}
|