Skip to content

Commit a4e8647

Browse files
authored
[management] Enable flow groups (#4230)
Adds the ability to limit traffic events logging to specific peer groups
1 parent 160b811 commit a4e8647

File tree

20 files changed

+89
-34
lines changed

20 files changed

+89
-34
lines changed

client/cmd/testutil_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"go.opentelemetry.io/otel"
1212

1313
"github.com/netbirdio/netbird/management/server/activity"
14+
"github.com/netbirdio/netbird/management/server/groups"
1415
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
1516
"github.com/netbirdio/netbird/management/server/permissions"
1617
"github.com/netbirdio/netbird/management/server/settings"
@@ -97,6 +98,7 @@ func startManagement(t *testing.T, config *types.Config, testFile string) (*grpc
9798

9899
settingsMockManager := settings.NewMockManager(ctrl)
99100
permissionsManagerMock := permissions.NewMockManager(ctrl)
101+
groupsManager := groups.NewManagerMock()
100102

101103
settingsMockManager.EXPECT().
102104
GetSettings(gomock.Any(), gomock.Any(), gomock.Any()).
@@ -108,7 +110,7 @@ func startManagement(t *testing.T, config *types.Config, testFile string) (*grpc
108110
t.Fatal(err)
109111
}
110112

111-
secretsManager := mgmt.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager)
113+
secretsManager := mgmt.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager, groupsManager)
112114
mgmtServer, err := mgmt.NewServer(context.Background(), config, accountManager, settingsMockManager, peersUpdateManager, secretsManager, nil, nil, nil, &mgmt.MockIntegratedValidator{})
113115
if err != nil {
114116
t.Fatal(err)

client/internal/engine_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"golang.zx2c4.com/wireguard/tun/netstack"
2828

2929
"github.com/netbirdio/management-integrations/integrations"
30+
"github.com/netbirdio/netbird/management/server/groups"
3031

3132
"github.com/netbirdio/netbird/client/iface"
3233
"github.com/netbirdio/netbird/client/iface/bind"
@@ -1564,13 +1565,14 @@ func startManagement(t *testing.T, dataDir, testFile string) (*grpc.Server, stri
15641565
AnyTimes()
15651566

15661567
permissionsManager := permissions.NewManager(store)
1568+
groupsManager := groups.NewManagerMock()
15671569

15681570
accountManager, err := server.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "netbird.selfhosted", eventStore, nil, false, ia, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManager, false)
15691571
if err != nil {
15701572
return nil, "", err
15711573
}
15721574

1573-
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager)
1575+
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager, groupsManager)
15741576
mgmtServer, err := server.NewServer(context.Background(), config, accountManager, settingsMockManager, peersUpdateManager, secretsManager, nil, nil, nil, &server.MockIntegratedValidator{})
15751577
if err != nil {
15761578
return nil, "", err

client/server/server_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"go.opentelemetry.io/otel"
1515

1616
"github.com/netbirdio/management-integrations/integrations"
17+
"github.com/netbirdio/netbird/management/server/groups"
1718

1819
log "github.com/sirupsen/logrus"
1920
"github.com/stretchr/testify/assert"
@@ -302,13 +303,14 @@ func startManagement(t *testing.T, signalAddr string, counter *int) (*grpc.Serve
302303
t.Cleanup(ctrl.Finish)
303304
settingsMockManager := settings.NewMockManager(ctrl)
304305
permissionsManagerMock := permissions.NewMockManager(ctrl)
306+
groupsManager := groups.NewManagerMock()
305307

306308
accountManager, err := server.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "netbird.selfhosted", eventStore, nil, false, ia, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManagerMock, false)
307309
if err != nil {
308310
return nil, "", err
309311
}
310312

311-
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager)
313+
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager, groupsManager)
312314
mgmtServer, err := server.NewServer(context.Background(), config, accountManager, settingsMockManager, peersUpdateManager, secretsManager, nil, nil, nil, &server.MockIntegratedValidator{})
313315
if err != nil {
314316
return nil, "", err

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ require (
6363
github.com/miekg/dns v1.1.59
6464
github.com/mitchellh/hashstructure/v2 v2.0.2
6565
github.com/nadoo/ipset v0.5.0
66-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250805121557-5f225a973d1f
66+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250812185008-dfc66fa49a2e
6767
github.com/netbirdio/signal-dispatcher/dispatcher v0.0.0-20250805121659-6b4ac470ca45
6868
github.com/okta/okta-sdk-golang/v2 v2.18.0
6969
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/v3 v3.0.0-20240315174635-e72a50fcb64e h1:PURA50S8u4mF6RrkYYCAvvPCixhqqEiEy3Ej6avh04c=
505505
github.com/netbirdio/ice/v3 v3.0.0-20240315174635-e72a50fcb64e/go.mod h1:YMLU7qbKfVjmEv7EoZPIVEI+kNYxWCdPK3VS0BU+U4Q=
506-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250805121557-5f225a973d1f h1:YmqNWdRbeVn1lSpkLzIiFHX2cndRuaVYyynx2ibrOtg=
507-
github.com/netbirdio/management-integrations/integrations v0.0.0-20250805121557-5f225a973d1f/go.mod h1:Gi9raplYzCCyh07Olw/DVfCJTFgpr1WCXJ/Q+8TSA9Q=
506+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250812185008-dfc66fa49a2e h1:S85laGfx1UP+nmRF9smP6/TY965kLWz41PbBK1TX8g0=
507+
github.com/netbirdio/management-integrations/integrations v0.0.0-20250812185008-dfc66fa49a2e/go.mod h1:Jjve0+eUjOLKL3PJtAhjfM2iJ0SxWio5elHqlV1ymP8=
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/cmd/management.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/realip"
3535

3636
"github.com/netbirdio/management-integrations/integrations"
37+
"github.com/netbirdio/netbird/management/server/groups"
3738

3839
"github.com/netbirdio/netbird/management/server/peers"
3940
"github.com/netbirdio/netbird/management/server/types"
@@ -45,7 +46,6 @@ import (
4546
"github.com/netbirdio/netbird/management/server/auth"
4647
nbContext "github.com/netbirdio/netbird/management/server/context"
4748
"github.com/netbirdio/netbird/management/server/geolocation"
48-
"github.com/netbirdio/netbird/management/server/groups"
4949
nbhttp "github.com/netbirdio/netbird/management/server/http"
5050
"github.com/netbirdio/netbird/management/server/idp"
5151
"github.com/netbirdio/netbird/management/server/metrics"
@@ -220,7 +220,8 @@ var (
220220
return fmt.Errorf("build default manager: %v", err)
221221
}
222222

223-
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsManager)
223+
groupsManager := groups.NewManager(store, permissionsManager, accountManager)
224+
secretsManager := server.NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsManager, groupsManager)
224225

225226
trustedPeers := config.ReverseProxy.TrustedPeers
226227
defaultTrustedPeers := []netip.Prefix{netip.MustParsePrefix("0.0.0.0/0"), netip.MustParsePrefix("::/0")}
@@ -277,7 +278,6 @@ var (
277278
config.GetAuthAudiences(),
278279
config.HttpConfig.IdpSignKeyRefreshEnabled)
279280

280-
groupsManager := groups.NewManager(store, permissionsManager, accountManager)
281281
resourcesManager := resources.NewManager(store, permissionsManager, groupsManager, accountManager)
282282
routersManager := routers.NewManager(store, permissionsManager, accountManager)
283283
networksManager := networks.NewManager(store, permissionsManager, resourcesManager, routersManager, accountManager)

management/server/groups/manager.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type Manager interface {
2121
AddResourceToGroup(ctx context.Context, accountID, userID, groupID string, resourceID *types.Resource) error
2222
AddResourceToGroupInTransaction(ctx context.Context, transaction store.Store, accountID, userID, groupID string, resourceID *types.Resource) (func(), error)
2323
RemoveResourceFromGroupInTransaction(ctx context.Context, transaction store.Store, accountID, userID, groupID, resourceID string) (func(), error)
24+
GetPeerGroupIDs(ctx context.Context, accountID, peerID string) ([]string, error)
2425
}
2526

2627
type managerImpl struct {
@@ -142,6 +143,10 @@ func (m *managerImpl) GetResourceGroupsInTransaction(ctx context.Context, transa
142143
return transaction.GetResourceGroups(ctx, lockingStrength, accountID, resourceID)
143144
}
144145

146+
func (m *managerImpl) GetPeerGroupIDs(ctx context.Context, accountID, peerID string) ([]string, error) {
147+
return m.store.GetPeerGroupIDs(ctx, store.LockingStrengthShare, accountID, peerID)
148+
}
149+
145150
func ToGroupsInfoMap(groups []*types.Group, idCount int) map[string][]api.GroupMinimum {
146151
groupsInfoMap := make(map[string][]api.GroupMinimum, idCount)
147152
groupsChecked := make(map[string]struct{}, len(groups)) // not sure why this is needed (left over from old implementation)
@@ -202,6 +207,10 @@ func (m *mockManager) RemoveResourceFromGroupInTransaction(ctx context.Context,
202207
}, nil
203208
}
204209

210+
func (m *mockManager) GetPeerGroupIDs(ctx context.Context, accountID, peerID string) ([]string, error) {
211+
return []string{}, nil
212+
}
213+
205214
func NewManagerMock() Manager {
206215
return &mockManager{}
207216
}

management/server/grpcserver.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ func toPeerConfig(peer *nbpeer.Peer, network *types.Network, dnsName string, set
662662
}
663663
}
664664

665-
func toSyncResponse(ctx context.Context, config *types.Config, peer *nbpeer.Peer, turnCredentials *Token, relayCredentials *Token, networkMap *types.NetworkMap, dnsName string, checks []*posture.Checks, dnsCache *DNSConfigCache, settings *types.Settings, extraSettings *types.ExtraSettings) *proto.SyncResponse {
665+
func toSyncResponse(ctx context.Context, config *types.Config, peer *nbpeer.Peer, turnCredentials *Token, relayCredentials *Token, networkMap *types.NetworkMap, dnsName string, checks []*posture.Checks, dnsCache *DNSConfigCache, settings *types.Settings, extraSettings *types.ExtraSettings, peerGroups []string) *proto.SyncResponse {
666666
response := &proto.SyncResponse{
667667
PeerConfig: toPeerConfig(peer, networkMap.Network, dnsName, settings),
668668
NetworkMap: &proto.NetworkMap{
@@ -674,7 +674,7 @@ func toSyncResponse(ctx context.Context, config *types.Config, peer *nbpeer.Peer
674674
}
675675

676676
nbConfig := toNetbirdConfig(config, turnCredentials, relayCredentials, extraSettings)
677-
extendedConfig := integrationsConfig.ExtendNetBirdConfig(peer.ID, nbConfig, extraSettings)
677+
extendedConfig := integrationsConfig.ExtendNetBirdConfig(peer.ID, peerGroups, nbConfig, extraSettings)
678678
response.NetbirdConfig = extendedConfig
679679

680680
response.NetworkMap.PeerConfig = response.PeerConfig
@@ -750,7 +750,12 @@ func (s *GRPCServer) sendInitialSync(ctx context.Context, peerKey wgtypes.Key, p
750750
return status.Errorf(codes.Internal, "error handling request")
751751
}
752752

753-
plainResp := toSyncResponse(ctx, s.config, peer, turnToken, relayToken, networkMap, s.accountManager.GetDNSDomain(settings), postureChecks, nil, settings, settings.Extra)
753+
peerGroups, err := getPeerGroupIDs(ctx, s.accountManager.GetStore(), peer.AccountID, peer.ID)
754+
if err != nil {
755+
return status.Errorf(codes.Internal, "failed to get peer groups %s", err)
756+
}
757+
758+
plainResp := toSyncResponse(ctx, s.config, peer, turnToken, relayToken, networkMap, s.accountManager.GetDNSDomain(settings), postureChecks, nil, settings, settings.Extra, peerGroups)
754759

755760
encryptedResp, err := encryption.EncryptMessage(peerKey, s.wgKey, plainResp)
756761
if err != nil {

management/server/http/handlers/accounts/accounts_handler.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ func (h *handler) updateAccount(w http.ResponseWriter, r *http.Request) {
199199
settings.Extra = &types.ExtraSettings{
200200
PeerApprovalEnabled: req.Settings.Extra.PeerApprovalEnabled,
201201
FlowEnabled: req.Settings.Extra.NetworkTrafficLogsEnabled,
202+
FlowGroups: req.Settings.Extra.NetworkTrafficLogsGroups,
202203
FlowPacketCounterEnabled: req.Settings.Extra.NetworkTrafficPacketCounterEnabled,
203204
}
204205
}
@@ -327,6 +328,7 @@ func toAccountResponse(accountID string, settings *types.Settings, meta *types.A
327328
apiSettings.Extra = &api.AccountExtraSettings{
328329
PeerApprovalEnabled: settings.Extra.PeerApprovalEnabled,
329330
NetworkTrafficLogsEnabled: settings.Extra.FlowEnabled,
331+
NetworkTrafficLogsGroups: settings.Extra.FlowGroups,
330332
NetworkTrafficPacketCounterEnabled: settings.Extra.FlowPacketCounterEnabled,
331333
}
332334
}

management/server/management_proto_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/netbirdio/netbird/encryption"
2424
"github.com/netbirdio/netbird/formatter/hook"
2525
"github.com/netbirdio/netbird/management/server/activity"
26+
"github.com/netbirdio/netbird/management/server/groups"
2627
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
2728
"github.com/netbirdio/netbird/management/server/permissions"
2829
"github.com/netbirdio/netbird/management/server/settings"
@@ -446,6 +447,7 @@ func startManagementForTest(t *testing.T, testFile string, config *types.Config)
446447
Return(&types.ExtraSettings{}, nil).
447448
AnyTimes()
448449
permissionsManager := permissions.NewManager(store)
450+
groupsManager := groups.NewManagerMock()
449451

450452
accountManager, err := BuildManager(ctx, store, peersUpdateManager, nil, "", "netbird.selfhosted",
451453
eventStore, nil, false, MockIntegratedValidator{}, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManager, false)
@@ -455,7 +457,7 @@ func startManagementForTest(t *testing.T, testFile string, config *types.Config)
455457
return nil, nil, "", cleanup, err
456458
}
457459

458-
secretsManager := NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager)
460+
secretsManager := NewTimeBasedAuthSecretsManager(peersUpdateManager, config.TURNConfig, config.Relay, settingsMockManager, groupsManager)
459461

460462
ephemeralMgr := NewEphemeralManager(store, accountManager)
461463
mgmtServer, err := NewServer(context.Background(), config, accountManager, settingsMockManager, peersUpdateManager, secretsManager, nil, ephemeralMgr, nil, MockIntegratedValidator{})

0 commit comments

Comments
 (0)