diff --git a/client/cmd/testutil.go b/client/cmd/testutil.go index 7bce7f511..104aed5e9 100644 --- a/client/cmd/testutil.go +++ b/client/cmd/testutil.go @@ -2,6 +2,7 @@ package cmd import ( "context" + "github.com/netbirdio/netbird/management/server/activity" "net" "path/filepath" "testing" @@ -68,7 +69,12 @@ func startManagement(t *testing.T, config *mgmt.Config) (*grpc.Server, net.Liste } peersUpdateManager := mgmt.NewPeersUpdateManager() - accountManager, err := mgmt.BuildManager(store, peersUpdateManager, nil, "", "") + eventStore, err := activity.NewSQLiteStore(t.TempDir()) + if err != nil { + return nil, nil + } + accountManager, err := mgmt.BuildManager(store, peersUpdateManager, nil, "", "", + eventStore) if err != nil { t.Fatal(err) } diff --git a/client/internal/engine_test.go b/client/internal/engine_test.go index 895bfb3ac..03a4c3870 100644 --- a/client/internal/engine_test.go +++ b/client/internal/engine_test.go @@ -9,6 +9,7 @@ import ( nbstatus "github.com/netbirdio/netbird/client/status" nbdns "github.com/netbirdio/netbird/dns" "github.com/netbirdio/netbird/iface" + "github.com/netbirdio/netbird/management/server/activity" "github.com/netbirdio/netbird/route" "github.com/stretchr/testify/assert" "net" @@ -953,7 +954,12 @@ func startManagement(port int, dataDir string) (*grpc.Server, error) { log.Fatalf("failed creating a store: %s: %v", config.Datadir, err) } peersUpdateManager := server.NewPeersUpdateManager() - accountManager, err := server.BuildManager(store, peersUpdateManager, nil, "", "") + eventStore, err := activity.NewSQLiteStore(config.Datadir) + if err != nil { + return nil, nil + } + accountManager, err := server.BuildManager(store, peersUpdateManager, nil, "", "", + eventStore) if err != nil { return nil, err } diff --git a/management/client/client_test.go b/management/client/client_test.go index 129dbf1ca..494b1e198 100644 --- a/management/client/client_test.go +++ b/management/client/client_test.go @@ -2,6 +2,7 @@ package client import ( "context" + "github.com/netbirdio/netbird/management/server/activity" "net" "path/filepath" "sync" @@ -55,7 +56,12 @@ func startManagement(t *testing.T) (*grpc.Server, net.Listener) { } peersUpdateManager := mgmt.NewPeersUpdateManager() - accountManager, err := mgmt.BuildManager(store, peersUpdateManager, nil, "", "") + eventStore, err := activity.NewSQLiteStore(t.TempDir()) + if err != nil { + return nil, nil + } + accountManager, err := mgmt.BuildManager(store, peersUpdateManager, nil, "", "", + eventStore) if err != nil { t.Fatal(err) } diff --git a/management/server/account.go b/management/server/account.go index 80906561d..ad08f665a 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -73,7 +73,7 @@ type AccountManager interface { GetRule(accountID, ruleID, userID string) (*Rule, error) SaveRule(accountID, userID string, rule *Rule) error UpdateRule(accountID string, ruleID string, operations []RuleUpdateOperation) (*Rule, error) - DeleteRule(accountId, ruleID, userID string) error + DeleteRule(accountID, ruleID, userID string) error ListRules(accountID, userID string) ([]*Rule, error) GetRoute(accountID, routeID, userID string) (*route.Route, error) CreateRoute(accountID string, prefix, peer, description, netID string, masquerade bool, metric int, groups []string, enabled bool) (*route.Route, error) diff --git a/management/server/activity/sqlite.go b/management/server/activity/sqlite.go index 0eec94af0..91541db2d 100644 --- a/management/server/activity/sqlite.go +++ b/management/server/activity/sqlite.go @@ -4,12 +4,14 @@ import ( "database/sql" "encoding/json" "fmt" + // sqlite driver _ "github.com/mattn/go-sqlite3" "path/filepath" "time" ) const ( + //SQLiteEventSinkDB is the default name of the events database SQLiteEventSinkDB = "events.db" createTableQuery = "CREATE TABLE IF NOT EXISTS events " + "(id INTEGER PRIMARY KEY AUTOINCREMENT, " + diff --git a/management/server/http/groups_test.go b/management/server/http/groups_test.go index 4c6d5b0e0..25a66e471 100644 --- a/management/server/http/groups_test.go +++ b/management/server/http/groups_test.go @@ -29,7 +29,7 @@ var TestPeers = map[string]*server.Peer{ func initGroupTestData(user *server.User, groups ...*server.Group) *Groups { return &Groups{ accountManager: &mock_server.MockAccountManager{ - SaveGroupFunc: func(accountID string, group *server.Group) error { + SaveGroupFunc: func(accountID, userID string, group *server.Group) error { if !strings.HasPrefix(group.ID, "id-") { group.ID = "id-was-set" } diff --git a/management/server/http/rules_test.go b/management/server/http/rules_test.go index f5b7a8b98..9eade4c1f 100644 --- a/management/server/http/rules_test.go +++ b/management/server/http/rules_test.go @@ -22,7 +22,7 @@ import ( func initRulesTestData(rules ...*server.Rule) *Rules { return &Rules{ accountManager: &mock_server.MockAccountManager{ - SaveRuleFunc: func(_ string, rule *server.Rule) error { + SaveRuleFunc: func(_, _ string, rule *server.Rule) error { if !strings.HasPrefix(rule.ID, "id-") { rule.ID = "id-was-set" } diff --git a/management/server/http/setupkeys_test.go b/management/server/http/setupkeys_test.go index 2b26ebb5a..9e780b86f 100644 --- a/management/server/http/setupkeys_test.go +++ b/management/server/http/setupkeys_test.go @@ -47,7 +47,7 @@ func initSetupKeysTestMetaData(defaultKey *server.SetupKey, newKey *server.Setup }, user, nil }, CreateSetupKeyFunc: func(_ string, keyName string, typ server.SetupKeyType, _ time.Duration, _ []string, - _ int) (*server.SetupKey, error) { + _ int, _ string) (*server.SetupKey, error) { if keyName == newKey.Name || typ != newKey.Type { return newKey, nil } @@ -64,7 +64,7 @@ func initSetupKeysTestMetaData(defaultKey *server.SetupKey, newKey *server.Setup } }, - SaveSetupKeyFunc: func(accountID string, key *server.SetupKey) (*server.SetupKey, error) { + SaveSetupKeyFunc: func(accountID string, key *server.SetupKey, _ string) (*server.SetupKey, error) { if key.Id == updatedSetupKey.Id { return updatedSetupKey, nil } diff --git a/management/server/mock_server/account_mock.go b/management/server/mock_server/account_mock.go index b50576fb5..9e68774df 100644 --- a/management/server/mock_server/account_mock.go +++ b/management/server/mock_server/account_mock.go @@ -12,9 +12,10 @@ import ( ) type MockAccountManager struct { - GetOrCreateAccountByUserFunc func(userId, domain string) (*server.Account, error) - GetAccountByUserFunc func(userId string) (*server.Account, error) - CreateSetupKeyFunc func(accountId string, keyName string, keyType server.SetupKeyType, expiresIn time.Duration, autoGroups []string, usageLimit int) (*server.SetupKey, error) + GetOrCreateAccountByUserFunc func(userId, domain string) (*server.Account, error) + GetAccountByUserFunc func(userId string) (*server.Account, error) + CreateSetupKeyFunc func(accountId string, keyName string, keyType server.SetupKeyType, + expiresIn time.Duration, autoGroups []string, usageLimit int, userID string) (*server.SetupKey, error) GetSetupKeyFunc func(accountID, userID, keyID string) (*server.SetupKey, error) GetAccountByUserOrAccountIdFunc func(userId, accountId, domain string) (*server.Account, error) IsUserAdminFunc func(claims jwtclaims.AuthorizationClaims) (bool, error) @@ -22,13 +23,13 @@ type MockAccountManager struct { GetPeerFunc func(peerKey string) (*server.Peer, error) GetPeersFunc func(accountID, userID string) ([]*server.Peer, error) MarkPeerConnectedFunc func(peerKey string, connected bool) error - DeletePeerFunc func(accountId string, peerKey string) (*server.Peer, error) + DeletePeerFunc func(accountID, peerKey, userID string) (*server.Peer, error) GetPeerByIPFunc func(accountId string, peerIP string) (*server.Peer, error) GetNetworkMapFunc func(peerKey string) (*server.NetworkMap, error) GetPeerNetworkFunc func(peerKey string) (*server.Network, error) AddPeerFunc func(setupKey string, userId string, peer *server.Peer) (*server.Peer, error) GetGroupFunc func(accountID, groupID string) (*server.Group, error) - SaveGroupFunc func(accountID string, group *server.Group) error + SaveGroupFunc func(accountID, userID string, group *server.Group) error UpdateGroupFunc func(accountID string, groupID string, operations []server.GroupUpdateOperation) (*server.Group, error) DeleteGroupFunc func(accountID, groupID string) error ListGroupsFunc func(accountID string) ([]*server.Group, error) @@ -36,9 +37,9 @@ type MockAccountManager struct { GroupDeletePeerFunc func(accountID, groupID, peerKey string) error GroupListPeersFunc func(accountID, groupID string) ([]*server.Peer, error) GetRuleFunc func(accountID, ruleID, userID string) (*server.Rule, error) - SaveRuleFunc func(accountID string, rule *server.Rule) error + SaveRuleFunc func(accountID, userID string, rule *server.Rule) error UpdateRuleFunc func(accountID string, ruleID string, operations []server.RuleUpdateOperation) (*server.Rule, error) - DeleteRuleFunc func(accountID, ruleID string) error + DeleteRuleFunc func(accountID, ruleID, userID string) error ListRulesFunc func(accountID, userID string) ([]*server.Rule, error) GetUsersFromAccountFunc func(accountID, userID string) ([]*server.UserInfo, error) UpdatePeerMetaFunc func(peerKey string, meta server.PeerSystemMeta) error @@ -50,7 +51,7 @@ type MockAccountManager struct { UpdateRouteFunc func(accountID string, routeID string, operations []server.RouteUpdateOperation) (*route.Route, error) DeleteRouteFunc func(accountID, routeID string) error ListRoutesFunc func(accountID, userID string) ([]*route.Route, error) - SaveSetupKeyFunc func(accountID string, key *server.SetupKey) (*server.SetupKey, error) + SaveSetupKeyFunc func(accountID string, key *server.SetupKey, userID string) (*server.SetupKey, error) ListSetupKeysFunc func(accountID, userID string) ([]*server.SetupKey, error) SaveUserFunc func(accountID string, user *server.User) (*server.UserInfo, error) GetNameServerGroupFunc func(accountID, nsGroupID string) (*nbdns.NameServerGroup, error) @@ -74,9 +75,9 @@ func (am *MockAccountManager) GetUsersFromAccount(accountID string, userID strin } // DeletePeer mock implementation of DeletePeer from server.AccountManager interface -func (am *MockAccountManager) DeletePeer(accountId string, peerKey string) (*server.Peer, error) { +func (am *MockAccountManager) DeletePeer(accountID, peerKey, userID string) (*server.Peer, error) { if am.DeletePeerFunc != nil { - return am.DeletePeerFunc(accountId, peerKey) + return am.DeletePeerFunc(accountID, peerKey, userID) } return nil, status.Errorf(codes.Unimplemented, "method DeletePeer is not implemented") } @@ -110,9 +111,10 @@ func (am *MockAccountManager) CreateSetupKey( expiresIn time.Duration, autoGroups []string, usageLimit int, + userID string, ) (*server.SetupKey, error) { if am.CreateSetupKeyFunc != nil { - return am.CreateSetupKeyFunc(accountID, keyName, keyType, expiresIn, autoGroups, usageLimit) + return am.CreateSetupKeyFunc(accountID, keyName, keyType, expiresIn, autoGroups, usageLimit, userID) } return nil, status.Errorf(codes.Unimplemented, "method CreateSetupKey is not implemented") } @@ -199,9 +201,9 @@ func (am *MockAccountManager) GetGroup(accountID, groupID string) (*server.Group } // SaveGroup mock implementation of SaveGroup from server.AccountManager interface -func (am *MockAccountManager) SaveGroup(accountID string, group *server.Group) error { +func (am *MockAccountManager) SaveGroup(accountID, userID string, group *server.Group) error { if am.SaveGroupFunc != nil { - return am.SaveGroupFunc(accountID, group) + return am.SaveGroupFunc(accountID, userID, group) } return status.Errorf(codes.Unimplemented, "method SaveGroup is not implemented") } @@ -263,9 +265,9 @@ func (am *MockAccountManager) GetRule(accountID, ruleID, userID string) (*server } // SaveRule mock implementation of SaveRule from server.AccountManager interface -func (am *MockAccountManager) SaveRule(accountID string, rule *server.Rule) error { +func (am *MockAccountManager) SaveRule(accountID, userID string, rule *server.Rule) error { if am.SaveRuleFunc != nil { - return am.SaveRuleFunc(accountID, rule) + return am.SaveRuleFunc(accountID, userID, rule) } return status.Errorf(codes.Unimplemented, "method SaveRule is not implemented") } @@ -279,9 +281,9 @@ func (am *MockAccountManager) UpdateRule(accountID string, ruleID string, operat } // DeleteRule mock implementation of DeleteRule from server.AccountManager interface -func (am *MockAccountManager) DeleteRule(accountID, ruleID string) error { +func (am *MockAccountManager) DeleteRule(accountID, ruleID, userID string) error { if am.DeleteRuleFunc != nil { - return am.DeleteRuleFunc(accountID, ruleID) + return am.DeleteRuleFunc(accountID, ruleID, userID) } return status.Errorf(codes.Unimplemented, "method DeleteRule is not implemented") } @@ -375,9 +377,9 @@ func (am *MockAccountManager) ListRoutes(accountID, userID string) ([]*route.Rou } // SaveSetupKey mocks SaveSetupKey of the AccountManager interface -func (am *MockAccountManager) SaveSetupKey(accountID string, key *server.SetupKey) (*server.SetupKey, error) { +func (am *MockAccountManager) SaveSetupKey(accountID string, key *server.SetupKey, userID string) (*server.SetupKey, error) { if am.SaveSetupKeyFunc != nil { - return am.SaveSetupKeyFunc(accountID, key) + return am.SaveSetupKeyFunc(accountID, key, userID) } return nil, status.Errorf(codes.Unimplemented, "method SaveSetupKey is not implemented")