Skip to content

Commit 5113c70

Browse files
authored
[management] Extends integration and peers manager (#4450)
1 parent ad8fcda commit 5113c70

File tree

12 files changed

+167
-8
lines changed

12 files changed

+167
-8
lines changed

client/cmd/testutil_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@ func startManagement(t *testing.T, config *config.Config, testFile string) (*grp
9393

9494
permissionsManagerMock := permissions.NewMockManager(ctrl)
9595
peersmanager := peers.NewManager(store, permissionsManagerMock)
96+
settingsManagerMock := settings.NewMockManager(ctrl)
9697

97-
iv, _ := integrations.NewIntegratedValidator(context.Background(), peersmanager, eventStore)
98+
iv, _ := integrations.NewIntegratedValidator(context.Background(), peersmanager, settingsManagerMock, eventStore)
9899

99100
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
100101
require.NoError(t, err)

client/internal/engine_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1557,7 +1557,8 @@ func startManagement(t *testing.T, dataDir, testFile string) (*grpc.Server, stri
15571557

15581558
permissionsManager := permissions.NewManager(store)
15591559
peersManager := peers.NewManager(store, permissionsManager)
1560-
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, eventStore)
1560+
1561+
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, nil, eventStore)
15611562

15621563
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
15631564
require.NoError(t, err)

client/server/server_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,9 @@ func startManagement(t *testing.T, signalAddr string, counter *int) (*grpc.Serve
299299

300300
permissionsManagerMock := permissions.NewMockManager(ctrl)
301301
peersManager := peers.NewManager(store, permissionsManagerMock)
302+
settingsManagerMock := settings.NewMockManager(ctrl)
302303

303-
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, eventStore)
304+
ia, _ := integrations.NewIntegratedValidator(context.Background(), peersManager, settingsManagerMock, eventStore)
304305

305306
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
306307
require.NoError(t, err)

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ require (
6262
github.com/miekg/dns v1.1.59
6363
github.com/mitchellh/hashstructure/v2 v2.0.2
6464
github.com/nadoo/ipset v0.5.0
65-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250826184705-1866b8dd841f
65+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250906095204-f87a07690ba0
6666
github.com/netbirdio/signal-dispatcher/dispatcher v0.0.0-20250805121659-6b4ac470ca45
6767
github.com/okta/okta-sdk-golang/v2 v2.18.0
6868
github.com/oschwald/maxminddb-golang v1.12.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,8 @@ github.com/netbirdio/go-netroute v0.0.0-20240611143515-f59b0e1d3944 h1:TDtJKmM6S
503503
github.com/netbirdio/go-netroute v0.0.0-20240611143515-f59b0e1d3944/go.mod h1:sHA6TRxjQ6RLbnI+3R4DZo2Eseg/iKiPRfNmcuNySVQ=
504504
github.com/netbirdio/ice/v4 v4.0.0-20250827161942-426799a23107 h1:ZJwhKexMlK15B/Ld+1T8VYE2Mt1lk1kf2DlXr46EHcw=
505505
github.com/netbirdio/ice/v4 v4.0.0-20250827161942-426799a23107/go.mod h1:ZSIbPdBn5hePO8CpF1PekH2SfpTxg1PDhEwtbqZS7R8=
506-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250826184705-1866b8dd841f h1:r1gnjw0TfkaDLSCmAE3g5N5ulcd5WpFHaGrqQomCXP4=
507-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250826184705-1866b8dd841f/go.mod h1:v0nUbbHbuQnqR7yKIYnKzsLBCswLtp2JctmKYmGgVhc=
506+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250906095204-f87a07690ba0 h1:9BUqQHPVOGr0edk8EifUBUfTr2Ob0ypAPxtasUApBxQ=
507+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250906095204-f87a07690ba0/go.mod h1:v0nUbbHbuQnqR7yKIYnKzsLBCswLtp2JctmKYmGgVhc=
508508
github.com/netbirdio/service v0.0.0-20240911161631-f62744f42502 h1:3tHlFmhTdX9axERMVN63dqyFqnvuD+EMJHzM7mNGON8=
509509
github.com/netbirdio/service v0.0.0-20240911161631-f62744f42502/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
510510
github.com/netbirdio/signal-dispatcher/dispatcher v0.0.0-20250805121659-6b4ac470ca45 h1:ujgviVYmx243Ksy7NdSwrdGPSRNE3pb8kEDSpH0QuAQ=

management/internals/server/controllers.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ func (s *BaseServer) PeersUpdateManager() *server.PeersUpdateManager {
2020

2121
func (s *BaseServer) IntegratedValidator() integrated_validator.IntegratedValidator {
2222
return Create(s, func() integrated_validator.IntegratedValidator {
23-
integratedPeerValidator, err := integrations.NewIntegratedValidator(context.Background(), s.PeersManager(), s.EventStore())
23+
integratedPeerValidator, err := integrations.NewIntegratedValidator(
24+
context.Background(),
25+
s.PeersManager(),
26+
s.SettingsManager(),
27+
s.EventStore())
2428
if err != nil {
2529
log.Errorf("failed to create integrated peer validator: %v", err)
2630
}

management/server/peers/manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Manager interface {
1818
GetPeer(ctx context.Context, accountID, userID, peerID string) (*peer.Peer, error)
1919
GetPeerAccountID(ctx context.Context, peerID string) (string, error)
2020
GetAllPeers(ctx context.Context, accountID, userID string) ([]*peer.Peer, error)
21+
GetPeersByGroupIDs(ctx context.Context, accountID string, groupsIDs []string) ([]*peer.Peer, error)
2122
}
2223

2324
type managerImpl struct {
@@ -61,3 +62,7 @@ func (m *managerImpl) GetAllPeers(ctx context.Context, accountID, userID string)
6162
func (m *managerImpl) GetPeerAccountID(ctx context.Context, peerID string) (string, error) {
6263
return m.store.GetAccountIDByPeerID(ctx, store.LockingStrengthNone, peerID)
6364
}
65+
66+
func (m *managerImpl) GetPeersByGroupIDs(ctx context.Context, accountID string, groupsIDs []string) ([]*peer.Peer, error) {
67+
return m.store.GetPeersByGroupIDs(ctx, accountID, groupsIDs)
68+
}

management/server/peers/manager_mock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

management/server/store/sql_store.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,3 +2847,22 @@ func (s *SqlStore) UpdateAccountNetwork(ctx context.Context, accountID string, i
28472847
}
28482848
return nil
28492849
}
2850+
2851+
func (s *SqlStore) GetPeersByGroupIDs(ctx context.Context, accountID string, groupIDs []string) ([]*nbpeer.Peer, error) {
2852+
if len(groupIDs) == 0 {
2853+
return []*nbpeer.Peer{}, nil
2854+
}
2855+
2856+
var peers []*nbpeer.Peer
2857+
peerIDsSubquery := s.db.Model(&types.GroupPeer{}).
2858+
Select("DISTINCT peer_id").
2859+
Where("account_id = ? AND group_id IN ?", accountID, groupIDs)
2860+
2861+
result := s.db.Where("id IN (?)", peerIDsSubquery).Find(&peers)
2862+
if result.Error != nil {
2863+
log.WithContext(ctx).Errorf("failed to get peers by group IDs: %s", result.Error)
2864+
return nil, status.Errorf(status.Internal, "failed to get peers by group IDs")
2865+
}
2866+
2867+
return peers, nil
2868+
}

management/server/store/sql_store_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3607,3 +3607,113 @@ func intToIPv4(n uint32) net.IP {
36073607
binary.BigEndian.PutUint32(ip, n)
36083608
return ip
36093609
}
3610+
3611+
func TestSqlStore_GetPeersByGroupIDs(t *testing.T) {
3612+
accountID := "bf1c8084-ba50-4ce7-9439-34653001fc3b"
3613+
3614+
group1ID := "test-group-1"
3615+
group2ID := "test-group-2"
3616+
emptyGroupID := "empty-group"
3617+
3618+
peer1 := "cfefqs706sqkneg59g4g"
3619+
peer2 := "cfeg6sf06sqkneg59g50"
3620+
3621+
tests := []struct {
3622+
name string
3623+
groupIDs []string
3624+
expectedPeers []string
3625+
expectedCount int
3626+
}{
3627+
{
3628+
name: "retrieve peers from single group with multiple peers",
3629+
groupIDs: []string{group1ID},
3630+
expectedPeers: []string{peer1, peer2},
3631+
expectedCount: 2,
3632+
},
3633+
{
3634+
name: "retrieve peers from single group with one peer",
3635+
groupIDs: []string{group2ID},
3636+
expectedPeers: []string{peer1},
3637+
expectedCount: 1,
3638+
},
3639+
{
3640+
name: "retrieve peers from multiple groups (with overlap)",
3641+
groupIDs: []string{group1ID, group2ID},
3642+
expectedPeers: []string{peer1, peer2}, // should deduplicate
3643+
expectedCount: 2,
3644+
},
3645+
{
3646+
name: "retrieve peers from existing 'All' group",
3647+
groupIDs: []string{"cfefqs706sqkneg59g3g"}, // All group from test data
3648+
expectedPeers: []string{peer1, peer2},
3649+
expectedCount: 2,
3650+
},
3651+
{
3652+
name: "retrieve peers from empty group",
3653+
groupIDs: []string{emptyGroupID},
3654+
expectedPeers: []string{},
3655+
expectedCount: 0,
3656+
},
3657+
{
3658+
name: "retrieve peers from non-existing group",
3659+
groupIDs: []string{"non-existing-group"},
3660+
expectedPeers: []string{},
3661+
expectedCount: 0,
3662+
},
3663+
{
3664+
name: "empty group IDs list",
3665+
groupIDs: []string{},
3666+
expectedPeers: []string{},
3667+
expectedCount: 0,
3668+
},
3669+
{
3670+
name: "mix of existing and non-existing groups",
3671+
groupIDs: []string{group1ID, "non-existing-group"},
3672+
expectedPeers: []string{peer1, peer2},
3673+
expectedCount: 2,
3674+
},
3675+
}
3676+
3677+
for _, tt := range tests {
3678+
t.Run(tt.name, func(t *testing.T) {
3679+
store, cleanup, err := NewTestStoreFromSQL(context.Background(), "../testdata/store_policy_migrate.sql", t.TempDir())
3680+
t.Cleanup(cleanup)
3681+
require.NoError(t, err)
3682+
3683+
ctx := context.Background()
3684+
3685+
groups := []*types.Group{
3686+
{
3687+
ID: group1ID,
3688+
AccountID: accountID,
3689+
},
3690+
{
3691+
ID: group2ID,
3692+
AccountID: accountID,
3693+
},
3694+
}
3695+
require.NoError(t, store.CreateGroups(ctx, accountID, groups))
3696+
3697+
require.NoError(t, store.AddPeerToGroup(ctx, accountID, peer1, group1ID))
3698+
require.NoError(t, store.AddPeerToGroup(ctx, accountID, peer2, group1ID))
3699+
require.NoError(t, store.AddPeerToGroup(ctx, accountID, peer1, group2ID))
3700+
3701+
peers, err := store.GetPeersByGroupIDs(ctx, accountID, tt.groupIDs)
3702+
require.NoError(t, err)
3703+
require.Len(t, peers, tt.expectedCount)
3704+
3705+
if tt.expectedCount > 0 {
3706+
actualPeerIDs := make([]string, len(peers))
3707+
for i, peer := range peers {
3708+
actualPeerIDs[i] = peer.ID
3709+
}
3710+
assert.ElementsMatch(t, tt.expectedPeers, actualPeerIDs)
3711+
3712+
// Verify all returned peers belong to the correct account
3713+
for _, peer := range peers {
3714+
assert.Equal(t, accountID, peer.AccountID)
3715+
}
3716+
}
3717+
})
3718+
}
3719+
}

0 commit comments

Comments
 (0)