Skip to content

Commit 6aa4ba7

Browse files
authored
[management] incremental network map builder (#4753)
1 parent 2e16c99 commit 6aa4ba7

33 files changed

+7016
-76
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ require (
5656
github.com/hashicorp/go-multierror v1.1.1
5757
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2
5858
github.com/hashicorp/go-version v1.6.0
59+
github.com/jackc/pgx/v5 v5.5.5
5960
github.com/libdns/route53 v1.5.0
6061
github.com/libp2p/go-netroute v0.2.1
6162
github.com/mdlayher/socket v0.5.1
@@ -183,7 +184,6 @@ require (
183184
github.com/inconshreveable/mousetrap v1.1.0 // indirect
184185
github.com/jackc/pgpassfile v1.0.0 // indirect
185186
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
186-
github.com/jackc/pgx/v5 v5.5.5 // indirect
187187
github.com/jackc/puddle/v2 v2.2.1 // indirect
188188
github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect
189189
github.com/jinzhu/inflection v1.0.0 // indirect

management/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package main
22

33
import (
4-
"github.com/netbirdio/netbird/management/cmd"
4+
"log"
5+
"net/http"
6+
// nolint:gosec
7+
_ "net/http/pprof"
58
"os"
9+
10+
"github.com/netbirdio/netbird/management/cmd"
611
)
712

813
func main() {
14+
go func() {
15+
log.Println(http.ListenAndServe("localhost:6060", nil))
16+
}()
917
if err := cmd.Execute(); err != nil {
1018
os.Exit(1)
1119
}

management/server/account.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ const (
5353
peerSchedulerRetryInterval = 3 * time.Second
5454
emptyUserID = "empty user ID in claims"
5555
errorGettingDomainAccIDFmt = "error getting account ID by private domain: %v"
56+
57+
envNewNetworkMapBuilder = "NB_EXPERIMENT_NETWORK_MAP"
58+
envNewNetworkMapAccounts = "NB_EXPERIMENT_NETWORK_MAP_ACCOUNTS"
5659
)
5760

5861
type userLoggedInOnce bool
@@ -109,6 +112,11 @@ type DefaultAccountManager struct {
109112
loginFilter *loginFilter
110113

111114
disableDefaultPolicy bool
115+
116+
holder *types.Holder
117+
118+
expNewNetworkMap bool
119+
expNewNetworkMapAIDs map[string]struct{}
112120
}
113121

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

207+
newNetworkMapBuilder, err := strconv.ParseBool(os.Getenv(envNewNetworkMapBuilder))
208+
if err != nil {
209+
log.WithContext(ctx).Warnf("failed to parse %s, using default value false: %v", envNewNetworkMapBuilder, err)
210+
newNetworkMapBuilder = false
211+
}
212+
213+
ids := strings.Split(os.Getenv(envNewNetworkMapAccounts), ",")
214+
expIDs := make(map[string]struct{}, len(ids))
215+
for _, id := range ids {
216+
expIDs[id] = struct{}{}
217+
}
218+
199219
am := &DefaultAccountManager{
200220
Store: store,
201221
geo: geo,
@@ -217,6 +237,10 @@ func BuildManager(
217237
permissionsManager: permissionsManager,
218238
loginFilter: newLoginFilter(),
219239
disableDefaultPolicy: disableDefaultPolicy,
240+
holder: types.NewHolder(),
241+
242+
expNewNetworkMap: newNetworkMapBuilder,
243+
expNewNetworkMapAIDs: expIDs,
220244
}
221245

222246
am.startWarmup(ctx)
@@ -395,6 +419,9 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
395419
}
396420

397421
if updateAccountPeers || extraSettingsChanged || groupChangesAffectPeers {
422+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
423+
return nil, err
424+
}
398425
go am.UpdateAccountPeers(ctx, accountID)
399426
}
400427

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

14791506
if removedGroupAffectsPeers || newGroupsAffectsPeers {
1507+
if err := am.RecalculateNetworkMapCache(ctx, userAuth.AccountId); err != nil {
1508+
return err
1509+
}
1510+
14801511
log.WithContext(ctx).Tracef("user %s: JWT group membership changed, updating account peers", userAuth.UserId)
14811512
am.BufferUpdateAccountPeers(ctx, userAuth.AccountId)
14821513
}
@@ -2129,6 +2160,11 @@ func (am *DefaultAccountManager) UpdatePeerIP(ctx context.Context, accountID, us
21292160
}
21302161

21312162
if updateNetworkMap {
2163+
peer, err := am.Store.GetPeerByID(ctx, store.LockingStrengthNone, accountID, peerID)
2164+
if err != nil {
2165+
return err
2166+
}
2167+
am.updatePeerInNetworkMapCache(peer.AccountID, peer)
21322168
am.BufferUpdateAccountPeers(ctx, accountID)
21332169
}
21342170
return nil

management/server/account/manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,5 @@ type Manager interface {
128128
GetCurrentUserInfo(ctx context.Context, userAuth nbcontext.UserAuth) (*users.UserInfoWithPermissions, error)
129129
SetEphemeralManager(em ephemeral.Manager)
130130
AllowSync(string, uint64) bool
131+
RecalculateNetworkMapCache(ctx context.Context, accountId string) error
131132
}

management/server/account_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,7 +1154,16 @@ func TestAccountManager_AddPeerWithUserID(t *testing.T) {
11541154
assert.Equal(t, peer.IP.String(), fmt.Sprint(ev.Meta["ip"]))
11551155
}
11561156

1157+
func TestAccountManager_NetworkUpdates_SaveGroup_Experimental(t *testing.T) {
1158+
t.Setenv(envNewNetworkMapBuilder, "true")
1159+
testAccountManager_NetworkUpdates_SaveGroup(t)
1160+
}
1161+
11571162
func TestAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
1163+
testAccountManager_NetworkUpdates_SaveGroup(t)
1164+
}
1165+
1166+
func testAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
11581167
manager, account, peer1, peer2, peer3 := setupNetworkMapTest(t)
11591168

11601169
group := types.Group{
@@ -1205,7 +1214,16 @@ func TestAccountManager_NetworkUpdates_SaveGroup(t *testing.T) {
12051214
wg.Wait()
12061215
}
12071216

1217+
func TestAccountManager_NetworkUpdates_DeletePolicy_Experimental(t *testing.T) {
1218+
t.Setenv(envNewNetworkMapBuilder, "true")
1219+
testAccountManager_NetworkUpdates_DeletePolicy(t)
1220+
}
1221+
12081222
func TestAccountManager_NetworkUpdates_DeletePolicy(t *testing.T) {
1223+
testAccountManager_NetworkUpdates_DeletePolicy(t)
1224+
}
1225+
1226+
func testAccountManager_NetworkUpdates_DeletePolicy(t *testing.T) {
12091227
manager, account, peer1, _, _ := setupNetworkMapTest(t)
12101228

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

1260+
func TestAccountManager_NetworkUpdates_SavePolicy_Experimental(t *testing.T) {
1261+
t.Setenv(envNewNetworkMapBuilder, "true")
1262+
testAccountManager_NetworkUpdates_SavePolicy(t)
1263+
}
1264+
12421265
func TestAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
1266+
testAccountManager_NetworkUpdates_SavePolicy(t)
1267+
}
1268+
1269+
func testAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
12431270
manager, account, peer1, peer2, _ := setupNetworkMapTest(t)
12441271

12451272
group := types.Group{
@@ -1288,7 +1315,16 @@ func TestAccountManager_NetworkUpdates_SavePolicy(t *testing.T) {
12881315
wg.Wait()
12891316
}
12901317

1318+
func TestAccountManager_NetworkUpdates_DeletePeer_Experimental(t *testing.T) {
1319+
t.Setenv(envNewNetworkMapBuilder, "true")
1320+
testAccountManager_NetworkUpdates_DeletePeer(t)
1321+
}
1322+
12911323
func TestAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
1324+
testAccountManager_NetworkUpdates_DeletePeer(t)
1325+
}
1326+
1327+
func testAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
12921328
manager, account, peer1, _, peer3 := setupNetworkMapTest(t)
12931329

12941330
group := types.Group{
@@ -1341,7 +1377,16 @@ func TestAccountManager_NetworkUpdates_DeletePeer(t *testing.T) {
13411377
wg.Wait()
13421378
}
13431379

1380+
func TestAccountManager_NetworkUpdates_DeleteGroup_Experimental(t *testing.T) {
1381+
t.Setenv(envNewNetworkMapBuilder, "true")
1382+
testAccountManager_NetworkUpdates_DeleteGroup(t)
1383+
}
1384+
13441385
func TestAccountManager_NetworkUpdates_DeleteGroup(t *testing.T) {
1386+
testAccountManager_NetworkUpdates_DeleteGroup(t)
1387+
}
1388+
1389+
func testAccountManager_NetworkUpdates_DeleteGroup(t *testing.T) {
13451390
manager, account, peer1, peer2, peer3 := setupNetworkMapTest(t)
13461391

13471392
updMsg := manager.peersUpdateManager.CreateChannel(context.Background(), peer1.ID)
@@ -1377,6 +1422,14 @@ func TestAccountManager_NetworkUpdates_DeleteGroup(t *testing.T) {
13771422
return
13781423
}
13791424

1425+
for drained := false; !drained; {
1426+
select {
1427+
case <-updMsg:
1428+
default:
1429+
drained = true
1430+
}
1431+
}
1432+
13801433
wg := sync.WaitGroup{}
13811434
wg.Add(1)
13821435
go func() {
@@ -1736,7 +1789,9 @@ func TestAccount_Copy(t *testing.T) {
17361789
Address: "172.12.6.1/24",
17371790
},
17381791
},
1792+
NetworkMapCache: &types.NetworkMapBuilder{},
17391793
}
1794+
account.InitOnce()
17401795
err := hasNilField(account)
17411796
if err != nil {
17421797
t.Fatal(err)

management/server/dns.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ func (am *DefaultAccountManager) SaveDNSSettings(ctx context.Context, accountID
117117
}
118118

119119
if updateAccountPeers {
120+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
121+
return err
122+
}
120123
am.UpdateAccountPeers(ctx, accountID)
121124
}
122125

management/server/group.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ func (am *DefaultAccountManager) CreateGroup(ctx context.Context, accountID, use
114114
}
115115

116116
if updateAccountPeers {
117+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
118+
return err
119+
}
117120
am.UpdateAccountPeers(ctx, accountID)
118121
}
119122

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

184187
if updateAccountPeers {
188+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
189+
return err
190+
}
185191
am.UpdateAccountPeers(ctx, accountID)
186192
}
187193

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

252258
if updateAccountPeers {
259+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
260+
return err
261+
}
253262
am.UpdateAccountPeers(ctx, accountID)
254263
}
255264

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

320329
if updateAccountPeers {
330+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
331+
return err
332+
}
321333
am.UpdateAccountPeers(ctx, accountID)
322334
}
323335

@@ -481,6 +493,9 @@ func (am *DefaultAccountManager) GroupAddPeer(ctx context.Context, accountID, gr
481493
}
482494

483495
if updateAccountPeers {
496+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
497+
return err
498+
}
484499
am.UpdateAccountPeers(ctx, accountID)
485500
}
486501

@@ -519,6 +534,9 @@ func (am *DefaultAccountManager) GroupAddResource(ctx context.Context, accountID
519534
}
520535

521536
if updateAccountPeers {
537+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
538+
return err
539+
}
522540
am.UpdateAccountPeers(ctx, accountID)
523541
}
524542

@@ -547,6 +565,9 @@ func (am *DefaultAccountManager) GroupDeletePeer(ctx context.Context, accountID,
547565
}
548566

549567
if updateAccountPeers {
568+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
569+
return err
570+
}
550571
am.UpdateAccountPeers(ctx, accountID)
551572
}
552573

@@ -585,6 +606,9 @@ func (am *DefaultAccountManager) GroupDeleteResource(ctx context.Context, accoun
585606
}
586607

587608
if updateAccountPeers {
609+
if err := am.RecalculateNetworkMapCache(ctx, accountID); err != nil {
610+
return err
611+
}
588612
am.UpdateAccountPeers(ctx, accountID)
589613
}
590614

0 commit comments

Comments
 (0)