Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
2fb971e
nmap builder
crn4 Aug 5, 2025
f4b2bed
changes to other code - nmap in separate file
crn4 Aug 25, 2025
abd7a84
implement nmap builder to the code
crn4 Sep 3, 2025
fd7b3ae
conflicts resolution after main merge
crn4 Sep 3, 2025
bc6c5ec
tests and linter fix
crn4 Sep 3, 2025
333908d
minor fix
crn4 Sep 3, 2025
050c051
tests fix
crn4 Sep 3, 2025
0ae2241
removed test files
crn4 Sep 3, 2025
ca85aa9
implement new map builder full rebuilder for other parts
crn4 Sep 5, 2025
08fba98
test fixes
crn4 Sep 5, 2025
06eae13
Merge branch 'main' into refactor/nmap
crn4 Sep 12, 2025
6082c7c
buildPeerACLView optimized
crn4 Sep 15, 2025
5a9aa55
buildPeerRoutesView optimized
crn4 Sep 16, 2025
8f0e570
onpeeradded optimization part 1
crn4 Sep 16, 2025
1d62098
on peer added refactored
crn4 Sep 16, 2025
90557da
on peer deleted cleanup
crn4 Sep 16, 2025
806be13
fixed bug with duplicated firewall rules
crn4 Oct 2, 2025
9a56883
cache read without account get from db
crn4 Oct 2, 2025
148b8b0
cache and peeracls to unexported
crn4 Oct 2, 2025
2ac0da6
conflicts resolution
crn4 Oct 2, 2025
f20a1b3
get rid of get account calls for update peers
crn4 Oct 2, 2025
841bc75
minor fixes
crn4 Oct 2, 2025
fd9e21a
get rid of direct get account calls
crn4 Oct 2, 2025
5d1c613
added env for account ids enabling new network map builder
crn4 Oct 6, 2025
e926ca3
Merge branch 'main' into refactor/nmap
crn4 Oct 6, 2025
ffed4b3
minor fixes after tests
crn4 Oct 7, 2025
fbc0234
Merge branch 'main' into refactor/nmap
crn4 Oct 7, 2025
53e24ae
panic fix
crn4 Oct 7, 2025
274711a
pprof
crn4 Oct 7, 2025
9eda1ad
minor changes after conflicts resolution
crn4 Oct 30, 2025
5098410
remove unused network map field from update
pascal-fischer Oct 8, 2025
0fdf813
fix expandPortsAndRanges
pascal-fischer Oct 9, 2025
43b2d59
minor changes after conflicts
crn4 Oct 30, 2025
a00e765
simple balancing
crn4 Oct 17, 2025
e0fed79
sync limit fix
crn4 Oct 17, 2025
f193f0f
build cache only once
crn4 Oct 29, 2025
8875168
minor change
crn4 Oct 29, 2025
84decc3
sync once pointer
crn4 Oct 29, 2025
1002d45
minor change
crn4 Oct 29, 2025
60e3bf4
fixed panic
crn4 Oct 29, 2025
479c75f
load or store for account
crn4 Oct 29, 2025
81429f1
sprintf to strings builder
crn4 Oct 29, 2025
780890f
getValidatedPeerWithMap get account from cache for exp
crn4 Oct 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion management/main.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package main

import (
"github.com/netbirdio/netbird/management/cmd"
"log"
"net/http"
_ "net/http/pprof"

Check failure on line 6 in management/main.go

View workflow job for this annotation

GitHub Actions / Darwin

G108: Profiling endpoint is automatically exposed on /debug/pprof (gosec)

Check failure on line 6 in management/main.go

View workflow job for this annotation

GitHub Actions / Linux

G108: Profiling endpoint is automatically exposed on /debug/pprof (gosec)

Check failure on line 6 in management/main.go

View workflow job for this annotation

GitHub Actions / Windows

G108: Profiling endpoint is automatically exposed on /debug/pprof (gosec)
"os"

"github.com/netbirdio/netbird/management/cmd"
)

func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
if err := cmd.Execute(); err != nil {
os.Exit(1)
}
Expand Down
36 changes: 36 additions & 0 deletions management/server/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ const (
peerSchedulerRetryInterval = 3 * time.Second
emptyUserID = "empty user ID in claims"
errorGettingDomainAccIDFmt = "error getting account ID by private domain: %v"

envNewNetworkMapBuilder = "NB_EXPERIMENT_NETWORK_MAP"
envNewNetworkMapAccounts = "NB_EXPERIMENT_NETWORK_MAP_ACCOUNTS"
)

type userLoggedInOnce bool
Expand Down Expand Up @@ -109,6 +112,11 @@ type DefaultAccountManager struct {
loginFilter *loginFilter

disableDefaultPolicy bool

holder *types.Holder

expNewNetworkMap bool
expNewNetworkMapAIDs map[string]struct{}
}

func isUniqueConstraintError(err error) bool {
Expand Down Expand Up @@ -196,6 +204,18 @@ func BuildManager(
log.WithContext(ctx).Debugf("took %v to instantiate account manager", time.Since(start))
}()

newNetworkMapBuilder, err := strconv.ParseBool(os.Getenv(envNewNetworkMapBuilder))
if err != nil {
log.WithContext(ctx).Warnf("failed to parse %s, using default value false: %v", envNewNetworkMapBuilder, err)
newNetworkMapBuilder = false
}

ids := strings.Split(os.Getenv(envNewNetworkMapAccounts), ",")
expIDs := make(map[string]struct{}, len(ids))
for _, id := range ids {
expIDs[id] = struct{}{}
}

am := &DefaultAccountManager{
Store: store,
geo: geo,
Expand All @@ -217,6 +237,10 @@ func BuildManager(
permissionsManager: permissionsManager,
loginFilter: newLoginFilter(),
disableDefaultPolicy: disableDefaultPolicy,
holder: types.NewHolder(),

expNewNetworkMap: newNetworkMapBuilder,
expNewNetworkMapAIDs: expIDs,
}

am.startWarmup(ctx)
Expand Down Expand Up @@ -395,6 +419,9 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
}

if updateAccountPeers || extraSettingsChanged || groupChangesAffectPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return nil, err
}
go am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -1477,6 +1504,10 @@ func (am *DefaultAccountManager) SyncUserJWTGroups(ctx context.Context, userAuth
}

if removedGroupAffectsPeers || newGroupsAffectsPeers {
if err := am.RecalculateNetworkMapCache(ctx, userAuth.AccountId); err != nil {
return err
}

log.WithContext(ctx).Tracef("user %s: JWT group membership changed, updating account peers", userAuth.UserId)
am.BufferUpdateAccountPeers(ctx, userAuth.AccountId)
}
Expand Down Expand Up @@ -2129,6 +2160,11 @@ func (am *DefaultAccountManager) UpdatePeerIP(ctx context.Context, accountID, us
}

if updateNetworkMap {
peer, err := am.Store.GetPeerByID(ctx, store.LockingStrengthNone, accountID, peerID)
if err != nil {
return err
}
am.updatePeerInNetworkMapCache(peer.AccountID, peer)
am.BufferUpdateAccountPeers(ctx, accountID)
}
return nil
Expand Down
1 change: 1 addition & 0 deletions management/server/account/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,5 @@ type Manager interface {
GetCurrentUserInfo(ctx context.Context, userAuth nbcontext.UserAuth) (*users.UserInfoWithPermissions, error)
SetEphemeralManager(em ephemeral.Manager)
AllowSync(string, uint64) bool
RecalculateNetworkMapCache(ctx context.Context, accountId string) error
}
46 changes: 46 additions & 0 deletions management/server/account_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1154,7 +1154,16 @@ func TestAccountManager_AddPeerWithUserID(t *testing.T) {
assert.Equal(t, peer.IP.String(), fmt.Sprint(ev.Meta["ip"]))
}

func TestAccountManager_NetworkUpdates_SaveGroup_Experimental(t *testing.T) {
t.Setenv(envNewNetworkMapBuilder, "true")
testAccountManager_NetworkUpdates_SaveGroup(t)
}

func TestAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
testAccountManager_NetworkUpdates_SaveGroup(t)
}

func testAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
manager, account, peer1, peer2, peer3 := setupNetworkMapTest(t)

group := types.Group{
Expand Down Expand Up @@ -1205,7 +1214,16 @@ func TestAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
wg.Wait()
}

func TestAccountManager_NetworkUpdates_DeletePolicy_Experimental(t *testing.T) {
t.Setenv(envNewNetworkMapBuilder, "true")
testAccountManager_NetworkUpdates_DeletePolicy(t)
}

func TestAccountManager_NetworkUpdates_DeletePolicy(t *testing.T) {
testAccountManager_NetworkUpdates_DeletePolicy(t)
}

func testAccountManager_NetworkUpdates_DeletePolicy(t *testing.T) {
manager, account, peer1, _, _ := setupNetworkMapTest(t)

updMsg := manager.peersUpdateManager.CreateChannel(context.Background(), peer1.ID)
Expand Down Expand Up @@ -1239,7 +1257,16 @@ func TestAccountManager_NetworkUpdates_DeletePolicy(t *testing.T) {
wg.Wait()
}

func TestAccountManager_NetworkUpdates_SavePolicy_Experimental(t *testing.T) {
t.Setenv(envNewNetworkMapBuilder, "true")
testAccountManager_NetworkUpdates_SavePolicy(t)
}

func TestAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
testAccountManager_NetworkUpdates_SavePolicy(t)
}

func testAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
manager, account, peer1, peer2, _ := setupNetworkMapTest(t)

group := types.Group{
Expand Down Expand Up @@ -1288,7 +1315,16 @@ func TestAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
wg.Wait()
}

func TestAccountManager_NetworkUpdates_DeletePeer_Experimental(t *testing.T) {
t.Setenv(envNewNetworkMapBuilder, "true")
testAccountManager_NetworkUpdates_DeletePeer(t)
}

func TestAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
testAccountManager_NetworkUpdates_DeletePeer(t)
}

func testAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
manager, account, peer1, _, peer3 := setupNetworkMapTest(t)

group := types.Group{
Expand Down Expand Up @@ -1341,7 +1377,16 @@ func TestAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
wg.Wait()
}

func TestAccountManager_NetworkUpdates_DeleteGroup_Experimental(t *testing.T) {
t.Setenv(envNewNetworkMapBuilder, "true")
testAccountManager_NetworkUpdates_DeleteGroup(t)
}

func TestAccountManager_NetworkUpdates_DeleteGroup(t *testing.T) {
testAccountManager_NetworkUpdates_DeleteGroup(t)
}

func testAccountManager_NetworkUpdates_DeleteGroup(t *testing.T) {
manager, account, peer1, peer2, peer3 := setupNetworkMapTest(t)

updMsg := manager.peersUpdateManager.CreateChannel(context.Background(), peer1.ID)
Expand Down Expand Up @@ -1736,6 +1781,7 @@ func TestAccount_Copy(t *testing.T) {
Address: "172.12.6.1/24",
},
},
NetworkMapCache: &types.NetworkMapBuilder{},
}
err := hasNilField(account)
if err != nil {
Expand Down
3 changes: 3 additions & 0 deletions management/server/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ func (am *DefaultAccountManager) SaveDNSSettings(ctx context.Context, accountID
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down
24 changes: 24 additions & 0 deletions management/server/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ func (am *DefaultAccountManager) CreateGroup(ctx context.Context, accountID, use
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -182,6 +185,9 @@ func (am *DefaultAccountManager) UpdateGroup(ctx context.Context, accountID, use
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -250,6 +256,9 @@ func (am *DefaultAccountManager) CreateGroups(ctx context.Context, accountID, us
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -318,6 +327,9 @@ func (am *DefaultAccountManager) UpdateGroups(ctx context.Context, accountID, us
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -471,6 +483,9 @@ func (am *DefaultAccountManager) GroupAddPeer(ctx context.Context, accountID, gr
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -509,6 +524,9 @@ func (am *DefaultAccountManager) GroupAddResource(ctx context.Context, accountID
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -537,6 +555,9 @@ func (am *DefaultAccountManager) GroupDeletePeer(ctx context.Context, accountID,
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down Expand Up @@ -575,6 +596,9 @@ func (am *DefaultAccountManager) GroupDeleteResource(ctx context.Context, accoun
}

if updateAccountPeers {
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
return err
}
am.UpdateAccountPeers(ctx, accountID)
}

Expand Down
Loading
Loading