Skip to content
10 changes: 8 additions & 2 deletions controllers/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,6 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
if !featureFlags.EnableDeviceApproval {
network.AutoJoin = "true"
}

if len(network.NetID) > 32 {
err := errors.New("network name shouldn't exceed 32 characters")
logger.Log(0, r.Header.Get("user"), "failed to create network: ",
Expand Down Expand Up @@ -656,7 +655,14 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
}
}
}

if network.AutoRemove == "true" {
if network.AutoRemoveThreshold == 0 {
network.AutoRemoveThreshold = 60
}
}
if network.AutoRemoveTags == nil {
network.AutoRemoveTags = []string{}
}
network, err = logic.CreateNetwork(network)
if err != nil {
logger.Log(0, r.Header.Get("user"), "failed to create network: ",
Expand Down
7 changes: 4 additions & 3 deletions controllers/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ package controller

import (
"context"
"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"
"os"
"testing"

"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"

"github.com/google/uuid"
"github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/logger"
Expand Down Expand Up @@ -36,7 +37,7 @@ func TestMain(m *testing.M) {
PlatformRoleID: models.SuperAdminRole,
})
peerUpdate := make(chan *models.Node)
go logic.ManageZombies(context.Background(), peerUpdate)
go logic.ManageZombies(context.Background())
go func() {
for update := range peerUpdate {
//do nothing
Expand Down
3 changes: 3 additions & 0 deletions controllers/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,9 @@ func reInit(curr, new models.ServerSettings, force bool) {
}
}
}
if new.CleanUpInterval != curr.CleanUpInterval {
logic.RestartHook("network-hook", time.Duration(new.CleanUpInterval)*time.Minute)
}
go mq.PublishPeerUpdate(false)
}

Expand Down
8 changes: 4 additions & 4 deletions functions/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ package functions
import (
"context"
"encoding/json"
"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"
"os"
"testing"

"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"

"github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/logic"
Expand Down Expand Up @@ -36,15 +37,14 @@ func TestMain(m *testing.M) {
PlatformRoleID: models.SuperAdminRole,
})
peerUpdate := make(chan *models.Node)
go logic.ManageZombies(context.Background(), peerUpdate)
go logic.ManageZombies(context.Background())
go func() {
for update := range peerUpdate {
//do nothing
logger.Log(3, "received node update", update.Action)
}
}()
os.Exit(m.Run())

}

func TestNetworkExists(t *testing.T) {
Expand Down
7 changes: 4 additions & 3 deletions logic/host_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ package logic
import (
"context"
"fmt"
"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"
"net"
"os"
"testing"

"github.com/gravitl/netmaker/db"
"github.com/gravitl/netmaker/schema"

"github.com/google/uuid"
"github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/models"
Expand All @@ -22,7 +23,7 @@ func TestMain(m *testing.M) {
database.InitializeDatabase()
defer database.CloseDB()
peerUpdate := make(chan *models.Node)
go ManageZombies(context.Background(), peerUpdate)
go ManageZombies(context.Background())
go func() {
for y := range peerUpdate {
fmt.Printf("Pointless %v\n", y)
Expand Down
61 changes: 60 additions & 1 deletion logic/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,9 @@ func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) e
} else {
currentNetwork.AutoJoin = "true"
}

currentNetwork.AutoRemove = newNetwork.AutoRemove
currentNetwork.AutoRemoveThreshold = newNetwork.AutoRemoveThreshold
currentNetwork.AutoRemoveTags = newNetwork.AutoRemoveTags
currentNetwork.DefaultACL = newNetwork.DefaultACL
currentNetwork.NameServers = newNetwork.NameServers
data, err := json.Marshal(currentNetwork)
Expand Down Expand Up @@ -778,6 +780,63 @@ func SortNetworks(unsortedNetworks []models.Network) {
})
}

var NetworkHook models.HookFunc = func(params ...interface{}) error {
networks, err := GetNetworks()
if err != nil {
return err
}
allNodes, err := GetAllNodes()
if err != nil {
return err
}
for _, network := range networks {
if network.AutoRemove == "false" || network.AutoRemoveThreshold == 0 {
continue
}
nodes := GetNetworkNodesMemory(allNodes, network.NetID)
for _, node := range nodes {
if !node.Connected {
continue
}
exists := false
for _, tagI := range network.AutoRemoveTags {
if tagI == "*" {
exists = true
break
}
if _, ok := node.Tags[models.TagID(tagI)]; ok {
exists = true
break
}
}
if !exists {
continue
}
if time.Since(node.LastCheckIn) > time.Duration(network.AutoRemoveThreshold)*time.Minute {
if err := DeleteNode(&node, true); err != nil {
continue
}
node.PendingDelete = true
node.Action = models.NODE_DELETE
DeleteNodesCh <- &node
host, err := GetHost(node.HostID.String())
if err == nil && len(host.Nodes) == 0 {
RemoveHostByID(host.ID.String())
}
}
}
}
return nil
}

func InitNetworkHooks() {
HookManagerCh <- models.HookDetails{
ID: "network-hook",
Hook: NetworkHook,
Interval: time.Duration(GetServerSettings().CleanUpInterval) * time.Minute,
}
}

// == Private ==

var addressLock = &sync.Mutex{}
5 changes: 3 additions & 2 deletions logic/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ var (
nodeNetworkCacheMutex = &sync.RWMutex{}
nodesCacheMap = make(map[string]models.Node)
nodesNetworkCacheMap = make(map[string]map[string]models.Node)
DeleteNodesCh = make(chan *models.Node, 100)
)

func getNodeFromCache(nodeID string) (node models.Node, ok bool) {
Expand Down Expand Up @@ -654,7 +655,7 @@ func GetNodesStatusAPI(nodes []models.Node) map[string]models.ApiNodeStatus {
}

// DeleteExpiredNodes - goroutine which deletes nodes which are expired
func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
func DeleteExpiredNodes(ctx context.Context) {
// Delete Expired Nodes Every Hour
ticker := time.NewTicker(time.Hour)
for {
Expand All @@ -671,7 +672,7 @@ func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
for _, node := range allnodes {
node := node
if time.Now().After(node.ExpirationDateTime) {
peerUpdate <- &node
DeleteNodesCh <- &node
slog.Info("deleting expired node", "nodeid", node.ID.String())
}
}
Expand Down
Loading