diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index 9b0c771d185..09855077aac 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -820,7 +820,7 @@ func getDashboardShouldReturn200WithConfig(t *testing.T, sc *scenarioContext, pr features := featuremgmt.WithFeatures() var err error if dashboardStore == nil { - sql, cfg := db.InitTestDBWithCfg(t) + sql, cfg := db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) dashboardStore, err = database.ProvideDashboardStore(sql, cfg, features, tagimpl.ProvideService(sql), quotaService) require.NoError(t, err) diff --git a/pkg/api/folder_bench_test.go b/pkg/api/folder_bench_test.go index 9a31a50fc23..223973eb85a 100644 --- a/pkg/api/folder_bench_test.go +++ b/pkg/api/folder_bench_test.go @@ -451,7 +451,7 @@ func setupServer(b testing.TB, sc benchScenario, features featuremgmt.FeatureTog quotaSrv := quotatest.New(false, nil) - dashStore, err := database.ProvideDashboardStore(sc.db.DB(), sc.cfg, features, tagimpl.ProvideService(sc.db.DB()), quotaSrv) + dashStore, err := database.ProvideDashboardStore(sc.db, sc.cfg, features, tagimpl.ProvideService(sc.db.DB()), quotaSrv) require.NoError(b, err) folderStore := folderimpl.ProvideDashboardFolderStore(sc.db.DB()) diff --git a/pkg/infra/db/dbrepl.go b/pkg/infra/db/dbrepl.go index 4b3bac0bb1d..d5c1e0a51ed 100644 --- a/pkg/infra/db/dbrepl.go +++ b/pkg/infra/db/dbrepl.go @@ -1,9 +1,14 @@ package db -import "github.com/grafana/grafana/pkg/services/sqlstore" +import ( + "github.com/grafana/grafana/pkg/services/sqlstore" +) type ReplDB interface { // DB is the primary database connection. DB() *sqlstore.SQLStore + + // ReadReplica is the read-only database connection. If no read replica is configured, the implementation must return the primary DB. + // TODO: ReadReplica will take a list of replicas and load-balance across them in a future milestone. ReadReplica() *sqlstore.SQLStore } diff --git a/pkg/services/annotations/accesscontrol/accesscontrol_test.go b/pkg/services/annotations/accesscontrol/accesscontrol_test.go index ad845b89967..eb5f373791c 100644 --- a/pkg/services/annotations/accesscontrol/accesscontrol_test.go +++ b/pkg/services/annotations/accesscontrol/accesscontrol_test.go @@ -27,7 +27,7 @@ func TestIntegrationAuthorize(t *testing.T) { t.Skip("skipping integration test") } - sql, cfg := db.InitTestDBWithCfg(t) + sql, cfg := db.InitTestReplDBWithCfg(t) dash1 := testutil.CreateDashboard(t, sql, cfg, featuremgmt.WithFeatures(), dashboards.SaveDashboardCommand{ UserID: 1, diff --git a/pkg/services/annotations/annotationsimpl/annotations_test.go b/pkg/services/annotations/annotationsimpl/annotations_test.go index d98af424ad5..57c5e2135fb 100644 --- a/pkg/services/annotations/annotationsimpl/annotations_test.go +++ b/pkg/services/annotations/annotationsimpl/annotations_test.go @@ -41,7 +41,7 @@ func TestIntegrationAnnotationListingWithRBAC(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sql := db.InitTestDB(t) + sql := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.AnnotationMaximumTagsLength = 60 @@ -210,7 +210,7 @@ func TestIntegrationAnnotationListingWithInheritedRBAC(t *testing.T) { annotationsTexts := make([]string, 0, folder.MaxNestedFolderDepth+1) setupFolderStructure := func() db.DB { - sql, cfg := db.InitTestDBWithCfg(t) + sql, cfg := db.InitTestReplDBWithCfg(t) // enable nested folders so that the folder table is populated for all the tests features := featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders) diff --git a/pkg/services/annotations/annotationsimpl/loki/historian_store_test.go b/pkg/services/annotations/annotationsimpl/loki/historian_store_test.go index ff08aaee047..c8e56683eb4 100644 --- a/pkg/services/annotations/annotationsimpl/loki/historian_store_test.go +++ b/pkg/services/annotations/annotationsimpl/loki/historian_store_test.go @@ -11,6 +11,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/require" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/db" @@ -29,8 +30,6 @@ import ( historymodel "github.com/grafana/grafana/pkg/services/ngalert/state/historian/model" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/tests/testsuite" - - "github.com/stretchr/testify/require" ) func TestMain(m *testing.M) { @@ -42,7 +41,7 @@ func TestIntegrationAlertStateHistoryStore(t *testing.T) { t.Skip("skipping integration test") } - sql, cfg := db.InitTestDBWithCfg(t) + sql, cfg := db.InitTestReplDBWithCfg(t) dashboard1 := testutil.CreateDashboard(t, sql, cfg, featuremgmt.WithFeatures(), dashboards.SaveDashboardCommand{ UserID: 1, diff --git a/pkg/services/annotations/annotationsimpl/xorm_store_test.go b/pkg/services/annotations/annotationsimpl/xorm_store_test.go index ae06428f835..6a5f11089e4 100644 --- a/pkg/services/annotations/annotationsimpl/xorm_store_test.go +++ b/pkg/services/annotations/annotationsimpl/xorm_store_test.go @@ -29,7 +29,7 @@ func TestIntegrationAnnotations(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sql := db.InitTestDB(t) + sql := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.AnnotationMaximumTagsLength = 60 diff --git a/pkg/services/annotations/testutil/testutil.go b/pkg/services/annotations/testutil/testutil.go index 3d71f85e40f..6113e8f2367 100644 --- a/pkg/services/annotations/testutil/testutil.go +++ b/pkg/services/annotations/testutil/testutil.go @@ -5,6 +5,8 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/dashboards" @@ -15,7 +17,6 @@ import ( "github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" - "github.com/stretchr/testify/require" ) func SetupRBACRole(t *testing.T, db db.DB, user *user.SignedInUser) *accesscontrol.Role { @@ -78,14 +79,14 @@ func SetupRBACPermission(t *testing.T, db db.DB, role *accesscontrol.Role, user require.NoError(t, err) } -func CreateDashboard(t *testing.T, db db.DB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, cmd dashboards.SaveDashboardCommand) *dashboards.Dashboard { +func CreateDashboard(t *testing.T, db db.ReplDB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, cmd dashboards.SaveDashboardCommand) *dashboards.Dashboard { t.Helper() dashboardStore, err := dashboardstore.ProvideDashboardStore( db, cfg, features, - tagimpl.ProvideService(db), + tagimpl.ProvideService(db.DB()), quotatest.New(false, nil), ) require.NoError(t, err) diff --git a/pkg/services/dashboards/database/database.go b/pkg/services/dashboards/database/database.go index bad463c509d..87d37ab0e68 100644 --- a/pkg/services/dashboards/database/database.go +++ b/pkg/services/dashboards/database/database.go @@ -28,7 +28,7 @@ import ( ) type dashboardStore struct { - store db.DB + store db.ReplDB cfg *setting.Cfg log log.Logger features featuremgmt.FeatureToggles @@ -45,7 +45,7 @@ type dashboardTag struct { // DashboardStore implements the Store interface var _ dashboards.Store = (*dashboardStore)(nil) -func ProvideDashboardStore(sqlStore db.DB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tagService tag.Service, quotaService quota.Service) (dashboards.Store, error) { +func ProvideDashboardStore(sqlStore db.ReplDB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tagService tag.Service, quotaService quota.Service) (dashboards.Store, error) { s := &dashboardStore{store: sqlStore, cfg: cfg, log: log.New("dashboard-store"), features: features, tagService: tagService} defaultLimits, err := readQuotaConfig(cfg) @@ -70,7 +70,7 @@ func (d *dashboardStore) emitEntityEvent() bool { func (d *dashboardStore) ValidateDashboardBeforeSave(ctx context.Context, dashboard *dashboards.Dashboard, overwrite bool) (bool, error) { isParentFolderChanged := false - err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { var err error isParentFolderChanged, err = getExistingDashboardByIDOrUIDForUpdate(sess, dashboard, overwrite) if err != nil { @@ -94,7 +94,7 @@ func (d *dashboardStore) ValidateDashboardBeforeSave(ctx context.Context, dashbo func (d *dashboardStore) GetProvisionedDataByDashboardID(ctx context.Context, dashboardID int64) (*dashboards.DashboardProvisioning, error) { var data dashboards.DashboardProvisioning - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { _, err := sess.Where("dashboard_id = ?", dashboardID).Get(&data) return err }) @@ -107,7 +107,7 @@ func (d *dashboardStore) GetProvisionedDataByDashboardID(ctx context.Context, da func (d *dashboardStore) GetProvisionedDataByDashboardUID(ctx context.Context, orgID int64, dashboardUID string) (*dashboards.DashboardProvisioning, error) { var provisionedDashboard dashboards.DashboardProvisioning - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { var dashboard dashboards.Dashboard exists, err := sess.Where("org_id = ? AND uid = ?", orgID, dashboardUID).Get(&dashboard) if err != nil { @@ -130,7 +130,7 @@ func (d *dashboardStore) GetProvisionedDataByDashboardUID(ctx context.Context, o func (d *dashboardStore) GetProvisionedDashboardData(ctx context.Context, name string) ([]*dashboards.DashboardProvisioning, error) { var result []*dashboards.DashboardProvisioning - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { return sess.Where("name = ?", name).Find(&result) }) return result, err @@ -139,7 +139,7 @@ func (d *dashboardStore) GetProvisionedDashboardData(ctx context.Context, name s func (d *dashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd dashboards.SaveDashboardCommand, provisioning *dashboards.DashboardProvisioning) (*dashboards.Dashboard, error) { var result *dashboards.Dashboard var err error - err = d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + err = d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { result, err = saveDashboard(sess, &cmd, d.emitEntityEvent()) if err != nil { return err @@ -157,7 +157,7 @@ func (d *dashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd dashb func (d *dashboardStore) SaveDashboard(ctx context.Context, cmd dashboards.SaveDashboardCommand) (*dashboards.Dashboard, error) { var result *dashboards.Dashboard var err error - err = d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + err = d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { result, err = saveDashboard(sess, &cmd, d.emitEntityEvent()) if err != nil { return err @@ -173,14 +173,14 @@ func (d *dashboardStore) SaveDashboard(ctx context.Context, cmd dashboards.SaveD // UnprovisionDashboard removes row in dashboard_provisioning for the dashboard making it seem as if manually created. // The dashboard will still have `created_by = -1` to see it was not created by any particular user. func (d *dashboardStore) UnprovisionDashboard(ctx context.Context, id int64) error { - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { _, err := sess.Where("dashboard_id = ?", id).Delete(&dashboards.DashboardProvisioning{}) return err }) } func (d *dashboardStore) DeleteOrphanedProvisionedDashboards(ctx context.Context, cmd *dashboards.DeleteOrphanedProvisionedDashboardsCommand) error { - return d.store.WithDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { var result []*dashboards.DashboardProvisioning convertedReaderNames := make([]any, len(cmd.ReaderNames)) @@ -211,8 +211,8 @@ func (d *dashboardStore) Count(ctx context.Context, scopeParams *quota.ScopePara } r := result{} - if err := d.store.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { - rawSQL := fmt.Sprintf("SELECT COUNT(*) AS count FROM dashboard WHERE is_folder=%s", d.store.GetDialect().BooleanStr(false)) + if err := d.store.ReadReplica().WithDbSession(ctx, func(sess *sqlstore.DBSession) error { + rawSQL := fmt.Sprintf("SELECT COUNT(*) AS count FROM dashboard WHERE is_folder=%s", d.store.ReadReplica().GetDialect().BooleanStr(false)) if _, err := sess.SQL(rawSQL).Get(&r); err != nil { return err } @@ -228,8 +228,8 @@ func (d *dashboardStore) Count(ctx context.Context, scopeParams *quota.ScopePara } if scopeParams != nil && scopeParams.OrgID != 0 { - if err := d.store.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { - rawSQL := fmt.Sprintf("SELECT COUNT(*) AS count FROM dashboard WHERE org_id=? AND is_folder=%s", d.store.GetDialect().BooleanStr(false)) + if err := d.store.ReadReplica().WithDbSession(ctx, func(sess *sqlstore.DBSession) error { + rawSQL := fmt.Sprintf("SELECT COUNT(*) AS count FROM dashboard WHERE org_id=? AND is_folder=%s", d.store.ReadReplica().GetDialect().BooleanStr(false)) if _, err := sess.SQL(rawSQL, scopeParams.OrgID).Get(&r); err != nil { return err } @@ -501,8 +501,8 @@ func saveProvisionedData(sess *db.Session, provisioning *dashboards.DashboardPro func (d *dashboardStore) GetDashboardsByPluginID(ctx context.Context, query *dashboards.GetDashboardsByPluginIDQuery) ([]*dashboards.Dashboard, error) { var dashboards = make([]*dashboards.Dashboard, 0) - err := d.store.WithDbSession(ctx, func(dbSession *db.Session) error { - whereExpr := "org_id=? AND plugin_id=? AND is_folder=" + d.store.GetDialect().BooleanStr(false) + err := d.store.DB().WithDbSession(ctx, func(dbSession *db.Session) error { + whereExpr := "org_id=? AND plugin_id=? AND is_folder=" + d.store.DB().GetDialect().BooleanStr(false) err := dbSession.Where(whereExpr, query.OrgID, query.PluginID).Find(&dashboards) return err @@ -518,7 +518,7 @@ func (d *dashboardStore) GetSoftDeletedDashboard(ctx context.Context, orgID int6 } var queryResult *dashboards.Dashboard - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { dashboard := dashboards.Dashboard{OrgID: orgID, UID: uid} has, err := sess.Where("deleted IS NOT NULL").Get(&dashboard) @@ -536,7 +536,7 @@ func (d *dashboardStore) GetSoftDeletedDashboard(ctx context.Context, orgID int6 } func (d *dashboardStore) RestoreDashboard(ctx context.Context, orgID int64, dashboardUID string, folder *folder.Folder) error { - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { if folder == nil || folder.UID == "" { _, err := sess.Exec("UPDATE dashboard SET deleted=NULL, folder_id=0, folder_uid=NULL WHERE org_id=? AND uid=?", orgID, dashboardUID) return err @@ -548,7 +548,7 @@ func (d *dashboardStore) RestoreDashboard(ctx context.Context, orgID int64, dash } func (d *dashboardStore) SoftDeleteDashboard(ctx context.Context, orgID int64, dashboardUID string) error { - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { _, err := sess.Exec("UPDATE dashboard SET deleted=? WHERE org_id=? AND uid=?", time.Now(), orgID, dashboardUID) return err }) @@ -559,7 +559,7 @@ func (d *dashboardStore) SoftDeleteDashboardsInFolders(ctx context.Context, orgI return nil } - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { s := strings.Builder{} s.WriteString("UPDATE dashboard SET deleted=? WHERE ") s.WriteString(fmt.Sprintf("folder_uid IN (%s)", strings.Repeat("?,", len(folderUids)-1)+"?")) @@ -571,7 +571,7 @@ func (d *dashboardStore) SoftDeleteDashboardsInFolders(ctx context.Context, orgI for _, folderUID := range folderUids { args = append(args, folderUID) } - args = append(args, orgID, d.store.GetDialect().BooleanStr(false)) + args = append(args, orgID, d.store.DB().GetDialect().BooleanStr(false)) _, err := sess.Exec(args...) return err @@ -579,7 +579,7 @@ func (d *dashboardStore) SoftDeleteDashboardsInFolders(ctx context.Context, orgI } func (d *dashboardStore) DeleteDashboard(ctx context.Context, cmd *dashboards.DeleteDashboardCommand) error { - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { return d.deleteDashboard(cmd, sess, d.emitEntityEvent()) }) } @@ -615,14 +615,14 @@ func (d *dashboardStore) deleteDashboard(cmd *dashboards.DeleteDashboardCommand, if dashboard.IsFolder { if !d.features.IsEnabledGlobally(featuremgmt.FlagDashboardRestore) { - sqlStatements = append(sqlStatements, statement{SQL: "DELETE FROM dashboard WHERE org_id = ? AND folder_uid = ? AND is_folder = ? AND deleted IS NULL", args: []any{dashboard.OrgID, dashboard.UID, d.store.GetDialect().BooleanStr(false)}}) + sqlStatements = append(sqlStatements, statement{SQL: "DELETE FROM dashboard WHERE org_id = ? AND folder_uid = ? AND is_folder = ? AND deleted IS NULL", args: []any{dashboard.OrgID, dashboard.UID, d.store.DB().GetDialect().BooleanStr(false)}}) if err := d.deleteChildrenDashboardAssociations(sess, &dashboard); err != nil { return err } } else { // soft delete all dashboards in the folder - sqlStatements = append(sqlStatements, statement{SQL: "UPDATE dashboard SET deleted = ? WHERE org_id = ? AND folder_uid = ? AND is_folder = ? ", args: []any{time.Now(), dashboard.OrgID, dashboard.UID, d.store.GetDialect().BooleanStr(false)}}) + sqlStatements = append(sqlStatements, statement{SQL: "UPDATE dashboard SET deleted = ? WHERE org_id = ? AND folder_uid = ? AND is_folder = ? ", args: []any{time.Now(), dashboard.OrgID, dashboard.UID, d.store.DB().GetDialect().BooleanStr(false)}}) } // remove all access control permission with folder scope @@ -736,7 +736,7 @@ func createEntityEvent(dashboard *dashboards.Dashboard, eventType store.EntityEv func (d *dashboardStore) GetDashboard(ctx context.Context, query *dashboards.GetDashboardQuery) (*dashboards.Dashboard, error) { var queryResult *dashboards.Dashboard - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc() // nolint:staticcheck if query.ID == 0 && len(query.UID) == 0 && (query.Title == nil || (query.FolderID == nil && query.FolderUID == nil)) { @@ -778,7 +778,7 @@ func (d *dashboardStore) GetDashboard(ctx context.Context, query *dashboards.Get func (d *dashboardStore) GetDashboardUIDByID(ctx context.Context, query *dashboards.GetDashboardRefByIDQuery) (*dashboards.DashboardRef, error) { us := &dashboards.DashboardRef{} - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { var rawSQL = `SELECT uid, slug from dashboard WHERE Id=?` exists, err := sess.SQL(rawSQL, query.ID).Get(us) if err != nil { @@ -796,7 +796,7 @@ func (d *dashboardStore) GetDashboardUIDByID(ctx context.Context, query *dashboa func (d *dashboardStore) GetDashboards(ctx context.Context, query *dashboards.GetDashboardsQuery) ([]*dashboards.Dashboard, error) { var dashboards = make([]*dashboards.Dashboard, 0) - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { if len(query.DashboardIDs) == 0 && len(query.DashboardUIDs) == 0 { return star.ErrCommandValidationFailed } @@ -823,7 +823,7 @@ func (d *dashboardStore) GetDashboards(ctx context.Context, query *dashboards.Ge } func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.FindPersistedDashboardsQuery) ([]dashboards.DashboardSearchProjection, error) { - recursiveQueriesAreSupported, err := d.store.RecursiveQueriesAreSupported() + recursiveQueriesAreSupported, err := d.store.DB().RecursiveQueriesAreSupported() if err != nil { return nil, err } @@ -856,11 +856,11 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F } if len(query.Title) > 0 { - filters = append(filters, searchstore.TitleFilter{Dialect: d.store.GetDialect(), Title: query.Title}) + filters = append(filters, searchstore.TitleFilter{Dialect: d.store.DB().GetDialect(), Title: query.Title}) } if len(query.Type) > 0 { - filters = append(filters, searchstore.TypeFilter{Dialect: d.store.GetDialect(), Type: query.Type}) + filters = append(filters, searchstore.TypeFilter{Dialect: d.store.DB().GetDialect(), Type: query.Type}) } metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc() // nolint:staticcheck @@ -870,7 +870,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F if len(query.FolderUIDs) > 0 { filters = append(filters, searchstore.FolderUIDFilter{ - Dialect: d.store.GetDialect(), + Dialect: d.store.DB().GetDialect(), OrgID: orgID, UIDs: query.FolderUIDs, NestedFoldersEnabled: d.features.IsEnabled(ctx, featuremgmt.FlagNestedFolders), @@ -887,7 +887,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F filters = append(filters, searchstore.DeletedFilter{Deleted: query.IsDeleted}) var res []dashboards.DashboardSearchProjection - sb := &searchstore.Builder{Dialect: d.store.GetDialect(), Filters: filters, Features: d.features} + sb := &searchstore.Builder{Dialect: d.store.DB().GetDialect(), Filters: filters, Features: d.features} limit := query.Limit if limit < 1 { @@ -901,7 +901,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F sql, params := sb.ToSQL(limit, page) - err = d.store.WithDbSession(ctx, func(sess *db.Session) error { + err = d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { return sess.SQL(sql, params...).Find(&res) }) @@ -914,7 +914,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F func (d *dashboardStore) GetDashboardTags(ctx context.Context, query *dashboards.GetDashboardTagsQuery) ([]*dashboards.DashboardTagCloudItem, error) { queryResult := make([]*dashboards.DashboardTagCloudItem, 0) - err := d.store.WithDbSession(ctx, func(dbSession *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(dbSession *db.Session) error { sql := `SELECT COUNT(*) as count, term @@ -942,7 +942,7 @@ func (d *dashboardStore) CountDashboardsInFolders( return 0, nil } var count int64 - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.ReadReplica().WithDbSession(ctx, func(sess *db.Session) error { metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc() s := strings.Builder{} args := make([]any, 0, 3) @@ -956,7 +956,7 @@ func (d *dashboardStore) CountDashboardsInFolders( } } s.WriteString(" AND org_id = ? AND is_folder = ? AND deleted IS NULL") - args = append(args, req.OrgID, d.store.GetDialect().BooleanStr(false)) + args = append(args, req.OrgID, d.store.ReadReplica().GetDialect().BooleanStr(false)) sql := s.String() _, err := sess.SQL(sql, args...).Get(&count) return err @@ -966,7 +966,7 @@ func (d *dashboardStore) CountDashboardsInFolders( func (d *dashboardStore) DeleteDashboardsInFolders( ctx context.Context, req *dashboards.DeleteDashboardsInFolderRequest) error { - return d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error { + return d.store.DB().WithTransactionalDbSession(ctx, func(sess *db.Session) error { // TODO delete all dashboards in the folder in a bulk query for _, folderUID := range req.FolderUIDs { dashboard := dashboards.Dashboard{OrgID: req.OrgID} @@ -993,7 +993,7 @@ func (d *dashboardStore) DeleteDashboardsInFolders( func (d *dashboardStore) GetAllDashboards(ctx context.Context) ([]*dashboards.Dashboard, error) { var dashboards = make([]*dashboards.Dashboard, 0) - err := d.store.WithDbSession(ctx, func(session *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(session *db.Session) error { err := session.Find(&dashboards) return err }) @@ -1005,7 +1005,7 @@ func (d *dashboardStore) GetAllDashboards(ctx context.Context) ([]*dashboards.Da func (d *dashboardStore) GetSoftDeletedExpiredDashboards(ctx context.Context, duration time.Duration) ([]*dashboards.Dashboard, error) { var dashboards = make([]*dashboards.Dashboard, 0) - err := d.store.WithDbSession(ctx, func(sess *db.Session) error { + err := d.store.DB().WithDbSession(ctx, func(sess *db.Session) error { err := sess.Where("deleted IS NOT NULL AND deleted < ?", time.Now().Add(-duration)).Find(&dashboards) return err }) diff --git a/pkg/services/dashboards/database/database_folder_test.go b/pkg/services/dashboards/database/database_folder_test.go index 1f4101b190e..46496da30f0 100644 --- a/pkg/services/dashboards/database/database_folder_test.go +++ b/pkg/services/dashboards/database/database_folder_test.go @@ -39,17 +39,17 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Skip("skipping integration test") } t.Run("Testing DB", func(t *testing.T) { - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var flder, dashInRoot, childDash *dashboards.Dashboard var currentUser *user.SignedInUser var dashboardStore dashboards.Store setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) var err error - dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) flder = insertTestDashboard(t, dashboardStore, "1 test dash folder", 1, 0, "", true, "prod", "webapp") dashInRoot = insertTestDashboard(t, dashboardStore, "test dash 67", 1, 0, "", false, "prod", "webapp") @@ -68,7 +68,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Run("and user can read folders and dashboards", func(t *testing.T) { currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: []string{dashboards.ScopeDashboardsAll}, dashboards.ActionFoldersRead: []string{dashboards.ScopeFoldersAll}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should return all dashboards and folders", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -86,7 +86,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Run("and user can only read dashboards", func(t *testing.T) { currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: []string{dashboards.ScopeDashboardsAll}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should not return folder", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -104,7 +104,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Run("and permissions are set for dashboard child and folder has all permissions removed", func(t *testing.T) { currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: {dashboards.ScopeDashboardsProvider.GetResourceScopeUID(dashInRoot.UID)}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should not return folder or child", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -119,7 +119,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Run("when the user is given permission to child", func(t *testing.T) { currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: {dashboards.ScopeDashboardsAll}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should be able to search for child dashboard but not folder", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -138,17 +138,17 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { }) t.Run("Given two dashboard folders with one dashboard each and one dashboard in the root folder", func(t *testing.T) { - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var folder1, folder2, dashInRoot, childDash1, childDash2 *dashboards.Dashboard var rootFolderId int64 = 0 var currentUser *user.SignedInUser setup2 := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) var err error - dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) folder1 = insertTestDashboard(t, dashboardStore, "1 test dash folder", 1, 0, "", true, "prod") folder2 = insertTestDashboard(t, dashboardStore, "2 test dash folder", 1, 0, "", true, "prod") @@ -166,7 +166,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { setup2() t.Run("and one folder is expanded, the other collapsed", func(t *testing.T) { currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: {dashboards.ScopeDashboardsAll}, dashboards.ActionFoldersRead: []string{dashboards.ScopeFoldersAll}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should return dashboards in root and expanded folder", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -191,7 +191,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { t.Run("and a dashboard is moved from folder without acl to the folder with an acl", func(t *testing.T) { moveDashboard(t, dashboardStore, 1, childDash2.Data, folder1.ID, folder1.UID) currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: {dashboards.ScopeFoldersProvider.GetResourceScopeUID(folder2.UID), dashboards.ScopeDashboardsProvider.GetResourceScopeUID(dashInRoot.UID)}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should not return folder with acl or its children", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -210,7 +210,7 @@ func TestIntegrationDashboardFolderDataAccess(t *testing.T) { setup2() moveDashboard(t, dashboardStore, 1, childDash1.Data, folder2.ID, childDash2.FolderUID) currentUser.Permissions = map[int64]map[string][]string{1: {dashboards.ActionDashboardsRead: {dashboards.ScopeDashboardsProvider.GetResourceScopeUID(dashInRoot.UID), dashboards.ScopeFoldersProvider.GetResourceScopeUID(folder2.UID)}, dashboards.ActionFoldersRead: {dashboards.ScopeFoldersProvider.GetResourceScopeUID(folder2.UID)}}} - actest.AddUserPermissionToDB(t, sqlStore, currentUser) + actest.AddUserPermissionToDB(t, sqlStore.DB(), currentUser) t.Run("should return folder without acl and its children", func(t *testing.T) { query := &dashboards.FindPersistedDashboardsQuery{ @@ -240,7 +240,7 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { // the maximux nested folder hierarchy starting from parent down to subfolders nestedFolders := make([]*folder.Folder, 0, folder.MaxNestedFolderDepth+1) - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg const ( dashInRootTitle = "dashboard in root" @@ -250,7 +250,7 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { var viewer *user.SignedInUser setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) cfg.AutoAssignOrg = true cfg.AutoAssignOrgId = 1 cfg.AutoAssignOrgRole = string(org.RoleViewer) @@ -262,13 +262,13 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { features := featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders) var err error - dashboardWriteStore, err := ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardWriteStore, err := ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - orgService, err := orgimpl.ProvideService(sqlStore, cfg, quotaService) + orgService, err := orgimpl.ProvideService(sqlStore.DB(), cfg, quotaService) require.NoError(t, err) usrSvc, err := userimpl.ProvideService( - sqlStore, orgService, cfg, nil, nil, tracer, + sqlStore.DB(), orgService, cfg, nil, nil, tracer, quotaService, supportbundlestest.NewFakeBundleService(), ) require.NoError(t, err) @@ -305,7 +305,7 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { guardian.New = origNewGuardian }) - folderSvc := folderimpl.ProvideService(mock.New(), bus.ProvideBus(tracer), dashboardWriteStore, folderimpl.ProvideDashboardFolderStore(sqlStore), sqlStore, features, supportbundlestest.NewFakeBundleService(), nil) + folderSvc := folderimpl.ProvideService(mock.New(), bus.ProvideBus(tracer), dashboardWriteStore, folderimpl.ProvideDashboardFolderStore(sqlStore.DB()), sqlStore.DB(), features, supportbundlestest.NewFakeBundleService(), nil) parentUID := "" for i := 0; ; i++ { @@ -407,11 +407,11 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - dashboardReadStore, err := ProvideDashboardStore(sqlStore, cfg, tc.features, tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardReadStore, err := ProvideDashboardStore(sqlStore, cfg, tc.features, tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) viewer.Permissions = map[int64]map[string][]string{viewer.OrgID: tc.permissions} - actest.AddUserPermissionToDB(t, sqlStore, viewer) + actest.AddUserPermissionToDB(t, sqlStore.DB(), viewer) query := &dashboards.FindPersistedDashboardsQuery{ SignedInUser: viewer, diff --git a/pkg/services/dashboards/database/database_provisioning_test.go b/pkg/services/dashboards/database/database_provisioning_test.go index 798368370e9..12cbe8aa4ea 100644 --- a/pkg/services/dashboards/database/database_provisioning_test.go +++ b/pkg/services/dashboards/database/database_provisioning_test.go @@ -18,7 +18,7 @@ func TestIntegrationDashboardProvisioningTest(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) dashboardStore, err := ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) diff --git a/pkg/services/dashboards/database/database_test.go b/pkg/services/dashboards/database/database_test.go index e7050847483..7cdf213fdb6 100644 --- a/pkg/services/dashboards/database/database_test.go +++ b/pkg/services/dashboards/database/database_test.go @@ -44,16 +44,16 @@ func TestIntegrationDashboardDataAccess(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var savedFolder, savedDash, savedDash2 *dashboards.Dashboard var dashboardStore dashboards.Store setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) var err error - dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) // insertTestDashboard creates the following hierarchy: // 1 test dash folder @@ -539,16 +539,16 @@ func TestIntegrationGetSoftDeletedDashboard(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore *sqlstore.SQLStore + var sqlStore db.ReplDB var cfg *setting.Cfg var savedFolder, savedDash *dashboards.Dashboard var dashboardStore dashboards.Store setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) var err error - dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) savedFolder = insertTestDashboard(t, dashboardStore, "1 test dash folder", 1, 0, "", true, "prod", "webapp") savedDash = insertTestDashboard(t, dashboardStore, "test dash 23", 1, savedFolder.ID, savedFolder.UID, false, "prod", "webapp") @@ -660,7 +660,7 @@ func TestIntegrationDashboardDataAccessGivenPluginWithImportedDashboards(t *test if testing.Short() { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) quotaService := quotatest.New(false, nil) dashboardStore, err := ProvideDashboardStore(sqlStore, &setting.Cfg{}, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) @@ -685,7 +685,7 @@ func TestIntegrationDashboard_SortingOptions(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) quotaService := quotatest.New(false, nil) dashboardStore, err := ProvideDashboardStore(sqlStore, &setting.Cfg{}, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) @@ -736,7 +736,7 @@ func TestIntegrationDashboard_Filter(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) dashboardStore, err := ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) @@ -780,7 +780,7 @@ func TestIntegrationDashboard_Filter(t *testing.T) { } func TestGetExistingDashboardByTitleAndFolder(t *testing.T) { - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) dashboardStore, err := ProvideDashboardStore(sqlStore, cfg, testFeatureToggles, tagimpl.ProvideService(sqlStore), quotaService) @@ -818,7 +818,7 @@ func TestIntegrationFindDashboardsByTitle(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) features := featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders, featuremgmt.FlagPanelTitleSearch) @@ -935,7 +935,7 @@ func TestIntegrationFindDashboardsByFolder(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) features := featuremgmt.WithFeatures(featuremgmt.FlagNestedFolders, featuremgmt.FlagPanelTitleSearch) @@ -1116,8 +1116,8 @@ func TestIntegrationFindDashboardsByFolder(t *testing.T) { } } -func insertTestRule(t *testing.T, sqlStore db.DB, foderOrgID int64, folderUID string) { - err := sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error { +func insertTestRule(t *testing.T, sqlStore db.ReplDB, foderOrgID int64, folderUID string) { + err := sqlStore.DB().WithDbSession(context.Background(), func(sess *db.Session) error { type alertQuery struct { RefID string DatasourceUID string diff --git a/pkg/services/dashboards/service/dashboard_service.go b/pkg/services/dashboards/service/dashboard_service.go index f9d2168b710..cacdaec4c50 100644 --- a/pkg/services/dashboards/service/dashboard_service.go +++ b/pkg/services/dashboards/service/dashboard_service.go @@ -7,11 +7,9 @@ import ( "strings" "time" - "github.com/prometheus/client_golang/prometheus" - - "golang.org/x/exp/slices" - "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" + "github.com/prometheus/client_golang/prometheus" + "golang.org/x/exp/slices" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/log" diff --git a/pkg/services/dashboards/service/dashboard_service_integration_test.go b/pkg/services/dashboards/service/dashboard_service_integration_test.go index f20bc83d245..a9d6d0a817e 100644 --- a/pkg/services/dashboards/service/dashboard_service_integration_test.go +++ b/pkg/services/dashboards/service/dashboard_service_integration_test.go @@ -103,7 +103,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) { permissionScenario(t, "When creating a new dashboard in the General folder", canSave, func(t *testing.T, sc *permissionScenarioContext) { - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cmd := dashboards.SaveDashboardCommand{ OrgID: testOrgID, Dashboard: simplejson.NewFromAny(map[string]any{ @@ -838,7 +838,7 @@ func TestIntegrationIntegratedDashboardService(t *testing.T) { type permissionScenarioContext struct { dashboardGuardianMock *guardian.FakeDashboardGuardian - sqlStore db.DB + sqlStore db.ReplDB dashboardStore dashboards.Store savedFolder *dashboards.Dashboard savedDashInFolder *dashboards.Dashboard @@ -858,7 +858,7 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc t.Run(desc, func(t *testing.T) { features := featuremgmt.WithFeatures() cfg := setting.NewCfg() - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) quotaService := quotatest.New(false, nil) ac := actest.FakeAccessControl{ExpectedEvaluate: true} dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) @@ -917,16 +917,16 @@ func permissionScenario(t *testing.T, desc string, canSave bool, fn permissionSc }) } -func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlStore db.DB) *dashboards.Dashboard { +func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlStore db.ReplDB) *dashboards.Dashboard { t.Helper() features := featuremgmt.WithFeatures() dto := toSaveDashboardDto(cmd) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) folderPermissions := accesscontrolmock.NewMockedPermissionsService() folderPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) @@ -948,14 +948,14 @@ func callSaveWithResult(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSt return res } -func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlStore db.DB) error { +func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlStore db.ReplDB) error { features := featuremgmt.WithFeatures() dto := toSaveDashboardDto(cmd) cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) service, err := ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, featuremgmt.WithFeatures(), @@ -970,7 +970,7 @@ func callSaveWithError(t *testing.T, cmd dashboards.SaveDashboardCommand, sqlSto return err } -func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string, sqlStore db.DB) *dashboards.Dashboard { +func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string, sqlStore db.ReplDB) *dashboards.Dashboard { t.Helper() cmd := dashboards.SaveDashboardCommand{ @@ -994,9 +994,9 @@ func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string features := featuremgmt.WithFeatures() cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) dashboardPermissions := accesscontrolmock.NewMockedPermissionsService() dashboardPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) service, err := ProvideDashboardServiceImpl( @@ -1016,7 +1016,7 @@ func saveTestDashboard(t *testing.T, title string, orgID int64, folderUID string return res } -func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *dashboards.Dashboard { +func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.ReplDB) *dashboards.Dashboard { t.Helper() cmd := dashboards.SaveDashboardCommand{ OrgID: orgID, @@ -1044,9 +1044,9 @@ func saveTestFolder(t *testing.T, title string, orgID int64, sqlStore db.DB) *da features := featuremgmt.WithFeatures() cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) folderPermissions := accesscontrolmock.NewMockedPermissionsService() folderPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) service, err := ProvideDashboardServiceImpl( diff --git a/pkg/services/dashboardsnapshots/service/service_test.go b/pkg/services/dashboardsnapshots/service/service_test.go index c2cdf73efad..0c56c52ebd5 100644 --- a/pkg/services/dashboardsnapshots/service/service_test.go +++ b/pkg/services/dashboardsnapshots/service/service_test.go @@ -92,7 +92,7 @@ func TestDashboardSnapshotsService(t *testing.T) { } func TestValidateDashboardExists(t *testing.T) { - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() dsStore := dashsnapdb.ProvideStore(sqlStore, cfg) secretsService := secretsManager.SetupTestService(t, database.ProvideSecretsStore(sqlStore)) diff --git a/pkg/services/folder/folderimpl/dashboard_folder_store_test.go b/pkg/services/folder/folderimpl/dashboard_folder_store_test.go index 8345f6ce32a..660fdeb40ec 100644 --- a/pkg/services/folder/folderimpl/dashboard_folder_store_test.go +++ b/pkg/services/folder/folderimpl/dashboard_folder_store_test.go @@ -23,15 +23,15 @@ func TestMain(m *testing.M) { } func TestIntegrationDashboardFolderStore(t *testing.T) { - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) var err error - dashboardStore, err = database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(featuremgmt.FlagPanelTitleSearch), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(featuremgmt.FlagPanelTitleSearch), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) } t.Run("Given dashboard and folder with the same title", func(t *testing.T) { diff --git a/pkg/services/folder/folderimpl/folder_test.go b/pkg/services/folder/folderimpl/folder_test.go index c3c07dc89c4..391bfb4a1ae 100644 --- a/pkg/services/folder/folderimpl/folder_test.go +++ b/pkg/services/folder/folderimpl/folder_test.go @@ -418,7 +418,7 @@ func TestIntegrationNestedFolderService(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - db, cfg := sqlstore.InitTestDB(t) + db, cfg := sqlstore.InitTestReplDB(t) quotaService := quotatest.New(false, nil) folderStore := ProvideDashboardFolderStore(db) @@ -823,7 +823,7 @@ func TestFolderServiceDualWrite(t *testing.T) { guardian.New = g }) - db, _ := sqlstore.InitTestDB(t) + db, _ := sqlstore.InitTestReplDB(t) cfg := setting.NewCfg() features := featuremgmt.WithFeatures() nestedFolderStore := ProvideStore(db) @@ -1378,7 +1378,7 @@ func TestIntegrationNestedFolderSharedWithMe(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - db, cfg := sqlstore.InitTestDB(t) + db, cfg := sqlstore.InitTestReplDB(t) quotaService := quotatest.New(false, nil) folderStore := ProvideDashboardFolderStore(db) @@ -1781,7 +1781,7 @@ func TestIntegrationNestedFolderSharedWithMe(t *testing.T) { } func TestFolderServiceGetFolder(t *testing.T) { - db, _ := sqlstore.InitTestDB(t) + db, _ := sqlstore.InitTestReplDB(t) signedInAdminUser := user.SignedInUser{UserID: 1, OrgID: orgID, Permissions: map[int64]map[string][]string{ orgID: { @@ -1880,7 +1880,7 @@ func TestFolderServiceGetFolder(t *testing.T) { } func TestFolderServiceGetFolders(t *testing.T) { - db, cfg := sqlstore.InitTestDB(t) + db, cfg := sqlstore.InitTestReplDB(t) quotaService := quotatest.New(false, nil) folderStore := ProvideDashboardFolderStore(db) @@ -1955,7 +1955,7 @@ func TestFolderServiceGetFolders(t *testing.T) { // TODO replace it with an API test under /pkg/tests/api/folders // whenever the golang client with get updated to allow filtering child folders by permission func TestGetChildrenFilterByPermission(t *testing.T) { - db, cfg := sqlstore.InitTestDB(t) + db, cfg := sqlstore.InitTestReplDB(t) signedInAdminUser := user.SignedInUser{UserID: 1, OrgID: orgID, Permissions: map[int64]map[string][]string{ orgID: { diff --git a/pkg/services/libraryelements/libraryelements_delete_test.go b/pkg/services/libraryelements/libraryelements_delete_test.go index 597787d6ee0..c09062b18a4 100644 --- a/pkg/services/libraryelements/libraryelements_delete_test.go +++ b/pkg/services/libraryelements/libraryelements_delete_test.go @@ -4,12 +4,13 @@ import ( "encoding/json" "testing" + "github.com/stretchr/testify/require" + "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/libraryelements/model" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/web" - "github.com/stretchr/testify/require" ) func TestDeleteLibraryElement(t *testing.T) { @@ -74,7 +75,7 @@ func TestDeleteLibraryElement(t *testing.T) { Data: simplejson.NewFromAny(dashJSON), } // nolint:staticcheck - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) err := sc.service.ConnectElementsToDashboard(sc.reqContext.Req.Context(), sc.reqContext.SignedInUser, []string{sc.initialResult.Result.UID}, dashInDB.ID) require.NoError(t, err) diff --git a/pkg/services/libraryelements/libraryelements_get_test.go b/pkg/services/libraryelements/libraryelements_get_test.go index b441505639b..869e326389b 100644 --- a/pkg/services/libraryelements/libraryelements_get_test.go +++ b/pkg/services/libraryelements/libraryelements_get_test.go @@ -4,13 +4,14 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/kinds/librarypanel" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/libraryelements/model" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/web" - "github.com/stretchr/testify/require" ) func TestGetLibraryElement(t *testing.T) { @@ -124,7 +125,7 @@ func TestGetLibraryElement(t *testing.T) { Data: simplejson.NewFromAny(dashJSON), } // nolint:staticcheck - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) err := sc.service.ConnectElementsToDashboard(sc.reqContext.Req.Context(), sc.reqContext.SignedInUser, []string{sc.initialResult.Result.UID}, dashInDB.ID) require.NoError(t, err) diff --git a/pkg/services/libraryelements/libraryelements_test.go b/pkg/services/libraryelements/libraryelements_test.go index bf82e13b3c8..769742d380e 100644 --- a/pkg/services/libraryelements/libraryelements_test.go +++ b/pkg/services/libraryelements/libraryelements_test.go @@ -89,7 +89,7 @@ func TestDeleteLibraryPanelsInFolder(t *testing.T) { Data: simplejson.NewFromAny(dashJSON), } // nolint:staticcheck - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) err := sc.service.ConnectElementsToDashboard(sc.reqContext.Req.Context(), sc.reqContext.SignedInUser, []string{sc.initialResult.Result.UID}, dashInDB.ID) require.NoError(t, err) @@ -164,7 +164,7 @@ func TestGetLibraryPanelConnections(t *testing.T) { Data: simplejson.NewFromAny(dashJSON), } // nolint:staticcheck - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash, sc.folder.ID, sc.folder.UID) err := sc.service.ConnectElementsToDashboard(sc.reqContext.Req.Context(), sc.reqContext.SignedInUser, []string{sc.initialResult.Result.UID}, dashInDB.ID) require.NoError(t, err) @@ -279,10 +279,11 @@ type scenarioContext struct { folder *folder.Folder initialResult libraryElementResult sqlStore db.DB + replStore db.ReplDB log log.Logger } -func createDashboard(t *testing.T, sqlStore db.DB, user user.SignedInUser, dash *dashboards.Dashboard, folderID int64, folderUID string) *dashboards.Dashboard { +func createDashboard(t *testing.T, sqlStore db.ReplDB, user user.SignedInUser, dash *dashboards.Dashboard, folderID int64, folderUID string) *dashboards.Dashboard { // nolint:staticcheck dash.FolderID = folderID dash.FolderUID = folderUID @@ -297,13 +298,13 @@ func createDashboard(t *testing.T, sqlStore db.DB, user user.SignedInUser, dash features := featuremgmt.WithFeatures() cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) ac := actest.FakeAccessControl{ExpectedEvaluate: true} folderPermissions := acmock.NewMockedPermissionsService() dashboardPermissions := acmock.NewMockedPermissionsService() dashboardPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) service, err := dashboardservice.ProvideDashboardServiceImpl( cfg, dashboardStore, folderStore, features, folderPermissions, dashboardPermissions, ac, @@ -324,7 +325,7 @@ func createFolder(t *testing.T, sc scenarioContext, title string) *folder.Folder cfg := setting.NewCfg() ac := actest.FakeAccessControl{} quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sc.sqlStore, cfg, features, tagimpl.ProvideService(sc.sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sc.replStore, cfg, features, tagimpl.ProvideService(sc.sqlStore), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sc.sqlStore) @@ -380,7 +381,7 @@ func scenarioWithPanel(t *testing.T, desc string, fn func(t *testing.T, sc scena t.Helper() features := featuremgmt.WithFeatures() - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) ac := actest.FakeAccessControl{} quotaService := quotatest.New(false, nil) dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) @@ -441,7 +442,7 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo features := featuremgmt.WithFeatures() tracer := tracing.InitializeTracerForTest() - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) @@ -484,10 +485,11 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo require.NoError(t, err) sc := scenarioContext{ - user: usr, - ctx: &webCtx, - service: &service, - sqlStore: sqlStore, + user: usr, + ctx: &webCtx, + service: &service, + sqlStore: sqlStore.DB(), + replStore: sqlStore, reqContext: &contextmodel.ReqContext{ Context: &webCtx, SignedInUser: &usr, diff --git a/pkg/services/librarypanels/librarypanels_test.go b/pkg/services/librarypanels/librarypanels_test.go index 7defdb9a037..76cb8bac97c 100644 --- a/pkg/services/librarypanels/librarypanels_test.go +++ b/pkg/services/librarypanels/librarypanels_test.go @@ -85,7 +85,7 @@ func TestConnectLibraryPanelsForDashboard(t *testing.T) { Title: "Testing ConnectLibraryPanelsForDashboard", Data: simplejson.NewFromAny(dashJSON), } - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash) err := sc.service.ConnectLibraryPanelsForDashboard(sc.ctx, sc.user, dashInDB) require.NoError(t, err) @@ -183,7 +183,7 @@ func TestConnectLibraryPanelsForDashboard(t *testing.T) { Title: "Testing ConnectLibraryPanelsForDashboard", Data: simplejson.NewFromAny(dashJSON), } - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash) err = sc.service.ConnectLibraryPanelsForDashboard(sc.ctx, sc.user, dashInDB) require.NoError(t, err) @@ -229,7 +229,7 @@ func TestConnectLibraryPanelsForDashboard(t *testing.T) { Title: "Testing ConnectLibraryPanelsForDashboard", Data: simplejson.NewFromAny(dashJSON), } - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash) err := sc.service.ConnectLibraryPanelsForDashboard(sc.ctx, sc.user, dashInDB) require.EqualError(t, err, errLibraryPanelHeaderUIDMissing.Error()) @@ -285,7 +285,7 @@ func TestConnectLibraryPanelsForDashboard(t *testing.T) { Title: "Testing ConnectLibraryPanelsForDashboard", Data: simplejson.NewFromAny(dashJSON), } - dashInDB := createDashboard(t, sc.sqlStore, sc.user, &dash) + dashInDB := createDashboard(t, sc.replStore, sc.user, &dash) err = sc.elementService.ConnectElementsToDashboard(sc.ctx, sc.user, []string{sc.initialResult.Result.UID}, dashInDB.ID) require.NoError(t, err) @@ -636,6 +636,7 @@ type scenarioContext struct { folder *folder.Folder initialResult libraryPanelResult sqlStore db.DB + replStore db.ReplDB lps LibraryPanelService } @@ -712,7 +713,7 @@ func getExpected(t *testing.T, res model.LibraryElementDTO, UID string, name str } } -func createDashboard(t *testing.T, sqlStore db.DB, user *user.SignedInUser, dash *dashboards.Dashboard) *dashboards.Dashboard { +func createDashboard(t *testing.T, sqlStore db.ReplDB, user *user.SignedInUser, dash *dashboards.Dashboard) *dashboards.Dashboard { dashItem := &dashboards.SaveDashboardDTO{ Dashboard: dash, Message: "", @@ -724,10 +725,10 @@ func createDashboard(t *testing.T, sqlStore db.DB, user *user.SignedInUser, dash features := featuremgmt.WithFeatures() cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) ac := actest.FakeAccessControl{ExpectedEvaluate: true} - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) dashPermissionService := acmock.NewMockedPermissionsService() dashPermissionService.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) service, err := dashboardservice.ProvideDashboardServiceImpl( @@ -750,7 +751,7 @@ func createFolder(t *testing.T, sc scenarioContext, title string) *folder.Folder ac := actest.FakeAccessControl{ExpectedEvaluate: true} cfg := setting.NewCfg() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sc.sqlStore, cfg, features, tagimpl.ProvideService(sc.sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sc.replStore, cfg, features, tagimpl.ProvideService(sc.sqlStore), quotaService) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sc.sqlStore) s := folderimpl.ProvideService(ac, bus.ProvideBus(tracing.InitializeTracerForTest()), dashboardStore, folderStore, sc.sqlStore, features, supportbundlestest.NewFakeBundleService(), nil) @@ -815,7 +816,8 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo t.Run(desc, func(t *testing.T) { orgID := int64(1) role := org.RoleAdmin - sqlStore, cfg := db.InitTestDBWithCfg(t) + replStore, cfg := db.InitTestReplDBWithCfg(t) + sqlStore := replStore.DB() quotaService := quotatest.New(false, nil) ac := actest.FakeAccessControl{ExpectedEvaluate: true} @@ -832,7 +834,7 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo require.NoError(t, err) guardian.InitAccessControlGuardian(setting.NewCfg(), ac, dashService) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(replStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) features := featuremgmt.WithFeatures() folderService := folderimpl.ProvideService(ac, bus.ProvideBus(tracing.InitializeTracerForTest()), dashboardStore, folderStore, sqlStore, features, supportbundlestest.NewFakeBundleService(), nil) @@ -885,6 +887,7 @@ func testScenario(t *testing.T, desc string, fn func(t *testing.T, sc scenarioCo service: &service, elementService: elementService, sqlStore: sqlStore, + replStore: replStore, lps: service, } diff --git a/pkg/services/ngalert/api/api_provisioning_test.go b/pkg/services/ngalert/api/api_provisioning_test.go index 015166c13f3..84f6fa21a06 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -1762,7 +1762,8 @@ func createTestEnv(t *testing.T, testConfig string) testEnvironment { GetsConfig(models.AlertConfiguration{ AlertmanagerConfiguration: string(raw), }) - sqlStore, cfg := db.InitTestDBWithCfg(t) + replDB, cfg := db.InitTestReplDBWithCfg(t) + sqlStore := replDB.DB() quotas := &provisioning.MockQuotaChecker{} quotas.EXPECT().LimitOK() @@ -1786,7 +1787,7 @@ func createTestEnv(t *testing.T, testConfig string) testEnvironment { }}, nil).Maybe() ac := &recordingAccessControlFake{} - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardStore, err := database.ProvideDashboardStore(replDB, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) require.NoError(t, err) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) diff --git a/pkg/services/ngalert/provisioning/alert_rules_test.go b/pkg/services/ngalert/provisioning/alert_rules_test.go index 8786acc63db..30b7a307723 100644 --- a/pkg/services/ngalert/provisioning/alert_rules_test.go +++ b/pkg/services/ngalert/provisioning/alert_rules_test.go @@ -16,12 +16,6 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/expr" - "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" - "github.com/grafana/grafana/pkg/services/ngalert/tests/fakes" - "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" - "github.com/grafana/grafana/pkg/services/user" - "github.com/grafana/grafana/pkg/util" - "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/tracing" @@ -31,10 +25,15 @@ import ( "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/folder/folderimpl" "github.com/grafana/grafana/pkg/services/folder/foldertest" + "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/store" + "github.com/grafana/grafana/pkg/services/ngalert/tests/fakes" "github.com/grafana/grafana/pkg/services/ngalert/testutil" + "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" + "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util" ) func TestAlertRuleService(t *testing.T) { @@ -1474,7 +1473,7 @@ func TestDeleteRuleGroup(t *testing.T) { func TestProvisiongWithFullpath(t *testing.T) { tracer := tracing.InitializeTracerForTest() inProcBus := bus.ProvideBus(tracer) - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) _, dashboardStore := testutil.SetupDashboardService(t, sqlStore, folderStore, cfg) diff --git a/pkg/services/ngalert/store/alert_rule_test.go b/pkg/services/ngalert/store/alert_rule_test.go index ec701b82dd8..45a4c859845 100644 --- a/pkg/services/ngalert/store/alert_rule_test.go +++ b/pkg/services/ngalert/store/alert_rule_test.go @@ -11,27 +11,25 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/exp/rand" "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log/logtest" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol/actest" + acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/folder/folderimpl" + "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/testutil" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/user" - - "github.com/stretchr/testify/require" - "golang.org/x/exp/rand" - - "github.com/grafana/grafana/pkg/infra/db" - acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" - "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" ) @@ -42,7 +40,7 @@ func TestIntegrationUpdateAlertRules(t *testing.T) { } cfg := setting.NewCfg() cfg.UnifiedAlerting = setting.UnifiedAlertingSettings{BaseInterval: time.Duration(rand.Int63n(100)+1) * time.Second} - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) store := &DBstore{ SQLStore: sqlStore, Cfg: cfg.UnifiedAlerting, @@ -121,7 +119,7 @@ func TestIntegrationUpdateAlertRulesWithUniqueConstraintViolation(t *testing.T) } cfg := setting.NewCfg() cfg.UnifiedAlerting = setting.UnifiedAlertingSettings{BaseInterval: time.Duration(rand.Int63n(100)+1) * time.Second} - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) store := &DBstore{ SQLStore: sqlStore, Cfg: cfg.UnifiedAlerting, @@ -378,7 +376,7 @@ func TestIntegration_GetAlertRulesForScheduling(t *testing.T) { BaseInterval: time.Duration(rand.Int63n(100)) * time.Second, } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) store := &DBstore{ SQLStore: sqlStore, Cfg: cfg.UnifiedAlerting, @@ -501,7 +499,7 @@ func TestIntegration_CountAlertRules(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() store := &DBstore{SQLStore: sqlStore, FolderService: setupFolderService(t, sqlStore, cfg, featuremgmt.WithFeatures())} @@ -566,7 +564,7 @@ func TestIntegration_DeleteInFolder(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() store := &DBstore{ SQLStore: sqlStore, @@ -599,7 +597,7 @@ func TestIntegration_GetNamespaceByUID(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() store := &DBstore{ SQLStore: sqlStore, @@ -653,7 +651,7 @@ func TestIntegrationInsertAlertRules(t *testing.T) { } orgID := int64(1) - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.UnifiedAlerting.BaseInterval = 1 * time.Second store := &DBstore{ @@ -778,7 +776,7 @@ func TestIntegrationAlertRulesNotificationSettings(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.UnifiedAlerting.BaseInterval = 1 * time.Second store := &DBstore{ @@ -856,7 +854,7 @@ func TestIntegrationListNotificationSettings(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.UnifiedAlerting.BaseInterval = 1 * time.Second store := &DBstore{ @@ -918,7 +916,7 @@ func TestIntegrationGetNamespacesByRuleUID(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.UnifiedAlerting.BaseInterval = 1 * time.Second store := &DBstore{ @@ -969,7 +967,7 @@ func TestIntegrationRuleGroupsCaseSensitive(t *testing.T) { t.Skip("skipping integration test") } - sqlStore := db.InitTestDB(t) + sqlStore := db.InitTestReplDB(t) cfg := setting.NewCfg() cfg.UnifiedAlerting.BaseInterval = 1 * time.Second store := &DBstore{ @@ -1125,11 +1123,11 @@ func createFolder(t *testing.T, store *DBstore, uid, title string, orgID int64, require.NoError(t, err) } -func setupFolderService(t *testing.T, sqlStore db.DB, cfg *setting.Cfg, features featuremgmt.FeatureToggles) folder.Service { +func setupFolderService(t *testing.T, sqlStore db.ReplDB, cfg *setting.Cfg, features featuremgmt.FeatureToggles) folder.Service { tracer := tracing.InitializeTracerForTest() inProcBus := bus.ProvideBus(tracer) - folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) + folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore.DB()) _, dashboardStore := testutil.SetupDashboardService(t, sqlStore, folderStore, cfg) - return testutil.SetupFolderService(t, cfg, sqlStore, dashboardStore, folderStore, inProcBus, features, &actest.FakeAccessControl{}) + return testutil.SetupFolderService(t, cfg, sqlStore.DB(), dashboardStore, folderStore, inProcBus, features, &actest.FakeAccessControl{}) } diff --git a/pkg/services/ngalert/tests/util.go b/pkg/services/ngalert/tests/util.go index 72db5504942..0a7f69409c8 100644 --- a/pkg/services/ngalert/tests/util.go +++ b/pkg/services/ngalert/tests/util.go @@ -53,7 +53,8 @@ func SetupTestEnv(tb testing.TB, baseInterval time.Duration) (*ngalert.AlertNG, *cfg.UnifiedAlerting.Enabled = true m := metrics.NewNGAlert(prometheus.NewRegistry()) - sqlStore := db.InitTestDB(tb) + replStore := db.InitTestReplDB(tb) + sqlStore := replStore.DB() secretsService := secretsManager.SetupTestService(tb, database.ProvideSecretsStore(sqlStore)) ac := acmock.New() @@ -61,7 +62,7 @@ func SetupTestEnv(tb testing.TB, baseInterval time.Duration) (*ngalert.AlertNG, tracer := tracing.InitializeTracerForTest() bus := bus.ProvideBus(tracer) folderStore := folderimpl.ProvideDashboardFolderStore(sqlStore) - dashboardService, dashboardStore := testutil.SetupDashboardService(tb, sqlStore, folderStore, cfg) + dashboardService, dashboardStore := testutil.SetupDashboardService(tb, replStore, folderStore, cfg) features := featuremgmt.WithFeatures() folderService := testutil.SetupFolderService(tb, cfg, sqlStore, dashboardStore, folderStore, bus, features, ac) ruleStore, err := store.ProvideDBStore(cfg, featuremgmt.WithFeatures(), sqlStore, folderService, &dashboards.FakeDashboardService{}, ac) diff --git a/pkg/services/ngalert/testutil/testutil.go b/pkg/services/ngalert/testutil/testutil.go index 26440c1552a..1f8e032617c 100644 --- a/pkg/services/ngalert/testutil/testutil.go +++ b/pkg/services/ngalert/testutil/testutil.go @@ -29,7 +29,7 @@ func SetupFolderService(tb testing.TB, cfg *setting.Cfg, db db.DB, dashboardStor return folderimpl.ProvideService(ac, bus, dashboardStore, folderStore, db, features, supportbundlestest.NewFakeBundleService(), nil) } -func SetupDashboardService(tb testing.TB, sqlStore db.DB, fs *folderimpl.DashboardFolderStoreImpl, cfg *setting.Cfg) (*dashboardservice.DashboardServiceImpl, dashboards.Store) { +func SetupDashboardService(tb testing.TB, sqlStore db.ReplDB, fs *folderimpl.DashboardFolderStoreImpl, cfg *setting.Cfg) (*dashboardservice.DashboardServiceImpl, dashboards.Store) { tb.Helper() origNewGuardian := guardian.New @@ -50,7 +50,7 @@ func SetupDashboardService(tb testing.TB, sqlStore db.DB, fs *folderimpl.Dashboa features := featuremgmt.WithFeatures() quotaService := quotatest.New(false, nil) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, features, tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(tb, err) dashboardService, err := dashboardservice.ProvideDashboardServiceImpl( diff --git a/pkg/services/publicdashboards/api/query_test.go b/pkg/services/publicdashboards/api/query_test.go index 6146c36de2f..bb6a201c3c4 100644 --- a/pkg/services/publicdashboards/api/query_test.go +++ b/pkg/services/publicdashboards/api/query_test.go @@ -254,7 +254,7 @@ func TestIntegrationUnauthenticatedUserCanGetPubdashPanelQueryData(t *testing.T) if testing.Short() { t.Skip("skipping integration test") } - db, cfg := db.InitTestDBWithCfg(t) + db, cfg := db.InitTestReplDBWithCfg(t) cacheService := datasourcesService.ProvideCacheService(localcache.ProvideService(), db, guardian.ProvideGuardian()) qds := buildQueryDataService(t, cacheService, nil, db) diff --git a/pkg/services/publicdashboards/database/database_test.go b/pkg/services/publicdashboards/database/database_test.go index d2e506063b1..2138e4ccd5f 100644 --- a/pkg/services/publicdashboards/database/database_test.go +++ b/pkg/services/publicdashboards/database/database_test.go @@ -48,6 +48,7 @@ func TestIntegrationListPublicDashboard(t *testing.T) { } var sqlStore db.DB + var replStore db.ReplDB var cfg *setting.Cfg var aDash *dashboards.Dashboard @@ -63,9 +64,10 @@ func TestIntegrationListPublicDashboard(t *testing.T) { var publicdashboardStore *PublicDashboardStoreImpl setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t, db.InitTestDBOpt{}) + replStore, cfg = db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{}) + sqlStore = replStore.DB() quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(replStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) @@ -171,19 +173,19 @@ func TestIntegrationExistsEnabledByAccessToken(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl var savedDashboard *dashboards.Dashboard setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) - store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboardStore = store - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) } t.Run("ExistsEnabledByAccessToken will return true when at least one public dashboard has a matching access token", func(t *testing.T) { @@ -244,19 +246,19 @@ func TestIntegrationExistsEnabledByDashboardUid(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl var savedDashboard *dashboards.Dashboard setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) - store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboardStore = store - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) } @@ -309,19 +311,19 @@ func TestIntegrationFindByDashboardUid(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl var savedDashboard *dashboards.Dashboard setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) - store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboardStore = store - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) } @@ -377,7 +379,7 @@ func TestIntegrationFindByAccessToken(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -385,10 +387,10 @@ func TestIntegrationFindByAccessToken(t *testing.T) { var err error setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) - dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) + dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) } @@ -445,7 +447,7 @@ func TestIntegrationCreatePublicDashboard(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -453,12 +455,12 @@ func TestIntegrationCreatePublicDashboard(t *testing.T) { var savedDashboard2 *dashboards.Dashboard setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t, db.InitTestDBOpt{}) + sqlStore, cfg = db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{}) quotaService := quotatest.New(false, nil) - store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboardStore = store - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) savedDashboard2 = insertTestDashboard(t, dashboardStore, "testDashie2", 1, "", true) insertPublicDashboard(t, publicdashboardStore, savedDashboard2.UID, savedDashboard2.OrgID, false, PublicShareType) @@ -524,7 +526,7 @@ func TestIntegrationUpdatePublicDashboard(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -533,11 +535,11 @@ func TestIntegrationUpdatePublicDashboard(t *testing.T) { var err error setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t, db.InitTestDBOpt{}) + sqlStore, cfg = db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{}) quotaService := quotatest.New(false, nil) - dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) anotherSavedDashboard = insertTestDashboard(t, dashboardStore, "test another Dashie", 1, "", true) } @@ -629,7 +631,7 @@ func TestIntegrationGetOrgIdByAccessToken(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -637,11 +639,11 @@ func TestIntegrationGetOrgIdByAccessToken(t *testing.T) { var err error setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) - dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) } t.Run("GetOrgIdByAccessToken will OrgId when enabled", func(t *testing.T) { @@ -701,7 +703,7 @@ func TestIntegrationDelete(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -710,10 +712,10 @@ func TestIntegrationDelete(t *testing.T) { var err error setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t) - dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + sqlStore, cfg = db.InitTestReplDBWithCfg(t) + dashboardStore, err = dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", true) savedPublicDashboard = insertPublicDashboard(t, publicdashboardStore, savedDashboard.UID, savedDashboard.OrgID, true, PublicShareType) } @@ -761,7 +763,7 @@ func TestFindByFolder(t *testing.T) { }) t.Run("can get all pubdashes for dashboard folder and org", func(t *testing.T) { - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) quotaService := quotatest.New(false, nil) dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) @@ -790,7 +792,7 @@ func TestGetMetrics(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - var sqlStore db.DB + var sqlStore db.ReplDB var cfg *setting.Cfg var dashboardStore dashboards.Store var publicdashboardStore *PublicDashboardStoreImpl @@ -800,12 +802,12 @@ func TestGetMetrics(t *testing.T) { var savedDashboard4 *dashboards.Dashboard setup := func() { - sqlStore, cfg = db.InitTestDBWithCfg(t, db.InitTestDBOpt{}) + sqlStore, cfg = db.InitTestReplDBWithCfg(t, db.InitTestDBOpt{}) quotaService := quotatest.New(false, nil) - store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + store, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboardStore = store - publicdashboardStore = ProvideStore(sqlStore, cfg, featuremgmt.WithFeatures()) + publicdashboardStore = ProvideStore(sqlStore.DB(), cfg, featuremgmt.WithFeatures()) savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, "", false) savedDashboard2 = insertTestDashboard(t, dashboardStore, "testDashie2", 1, "", false) savedDashboard3 = insertTestDashboard(t, dashboardStore, "testDashie3", 2, "", false) diff --git a/pkg/services/publicdashboards/service/common_test.go b/pkg/services/publicdashboards/service/common_test.go index 959ed23849b..cf28a6e9872 100644 --- a/pkg/services/publicdashboards/service/common_test.go +++ b/pkg/services/publicdashboards/service/common_test.go @@ -24,10 +24,10 @@ func newPublicDashboardServiceImpl( publicDashboardStore publicdashboards.Store, dashboardService dashboards.DashboardService, annotationsRepo annotations.Repository, -) (*PublicDashboardServiceImpl, db.DB, *setting.Cfg) { +) (*PublicDashboardServiceImpl, db.ReplDB, *setting.Cfg) { t.Helper() - db, cfg := db.InitTestDBWithCfg(t) + db, cfg := db.InitTestReplDBWithCfg(t) tagService := tagimpl.ProvideService(db) if annotationsRepo == nil { annotationsRepo = annotationsimpl.ProvideService(db, cfg, featuremgmt.WithFeatures(), tagService, tracing.InitializeTracerForTest()) diff --git a/pkg/services/publicdashboards/service/query_test.go b/pkg/services/publicdashboards/service/query_test.go index 7a356effc7b..e82d452e77a 100644 --- a/pkg/services/publicdashboards/service/query_test.go +++ b/pkg/services/publicdashboards/service/query_test.go @@ -10,6 +10,9 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/db" @@ -25,10 +28,6 @@ import ( "github.com/grafana/grafana/pkg/services/quota/quotatest" "github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/util" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" ) const ( @@ -682,7 +681,7 @@ func TestGetQueryDataResponse(t *testing.T) { fakeQueryService.On("QueryData", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&backend.QueryDataResponse{}, nil) service.QueryDataService = fakeQueryService - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, service.cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, service.cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) publicDashboardQueryDTO := PublicDashboardQueryDTO{ @@ -1085,7 +1084,7 @@ func TestFindAnnotations(t *testing.T) { func TestGetMetricRequest(t *testing.T) { service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, nil, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]interface{}{}, nil) @@ -1167,7 +1166,7 @@ func TestBuildMetricRequest(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) publicDashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]interface{}{}, nil) nonPublicDashboard := insertTestDashboard(t, dashboardStore, "testNonPublicDashie", 1, 0, "", true, []map[string]interface{}{}, nil) @@ -1320,7 +1319,7 @@ func TestBuildMetricRequest(t *testing.T) { } func TestBuildAnonymousUser(t *testing.T) { - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]interface{}{}, nil) diff --git a/pkg/services/publicdashboards/service/service_test.go b/pkg/services/publicdashboards/service/service_test.go index fa28eed134c..2970fbb9b87 100644 --- a/pkg/services/publicdashboards/service/service_test.go +++ b/pkg/services/publicdashboards/service/service_test.go @@ -586,7 +586,7 @@ func TestCreatePublicDashboard(t *testing.T) { service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -666,7 +666,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -698,7 +698,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -725,7 +725,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) templateVars := make([]map[string]any, 1) @@ -791,7 +791,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -857,7 +857,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]interface{}{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -909,7 +909,7 @@ func TestCreatePublicDashboard(t *testing.T) { fakeDashboardService := &dashboards.FakeDashboardService{} service, sqlStore, cfg := newPublicDashboardServiceImpl(t, publicdashboardStore, fakeDashboardService, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotatest.New(false, nil)) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotatest.New(false, nil)) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -935,7 +935,7 @@ func TestCreatePublicDashboard(t *testing.T) { service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) @@ -973,7 +973,7 @@ func TestUpdatePublicDashboard(t *testing.T) { service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) dashboard2 := insertTestDashboard(t, dashboardStore, "testDashie2", 1, 0, "", true, []map[string]any{}, nil) @@ -1156,7 +1156,7 @@ func TestUpdatePublicDashboard(t *testing.T) { service, sqlStore, cfg := newPublicDashboardServiceImpl(t, nil, fakeDashboardService, nil) quotaService := quotatest.New(false, nil) - dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := dashboardsDB.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore.DB()), quotaService) require.NoError(t, err) dashboard := insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, "", true, []map[string]any{}, nil) fakeDashboardService.On("GetDashboard", mock.Anything, mock.Anything, mock.Anything).Return(dashboard, nil) diff --git a/pkg/services/quota/quotaimpl/quota_test.go b/pkg/services/quota/quotaimpl/quota_test.go index e74347c1ed9..6b07f83d0f3 100644 --- a/pkg/services/quota/quotaimpl/quota_test.go +++ b/pkg/services/quota/quotaimpl/quota_test.go @@ -69,7 +69,7 @@ func TestIntegrationQuotaCommandsAndQueries(t *testing.T) { if testing.Short() { t.Skip("skipping integration test") } - sqlStore, cfg := db.InitTestDBWithCfg(t) + sqlStore, cfg := db.InitTestReplDBWithCfg(t) cfg.Quota = setting.QuotaSettings{ Enabled: true, @@ -479,13 +479,14 @@ func getQuotaBySrvTargetScope(t *testing.T, quotaService quota.Service, srv quot return quota.QuotaDTO{}, err } -func setupEnv(t *testing.T, sqlStore db.DB, cfg *setting.Cfg, b bus.Bus, quotaService quota.Service) { +func setupEnv(t *testing.T, replStore db.ReplDB, cfg *setting.Cfg, b bus.Bus, quotaService quota.Service) { + sqlStore := replStore.DB() tracer := tracing.InitializeTracerForTest() _, err := apikeyimpl.ProvideService(sqlStore, cfg, quotaService) require.NoError(t, err) _, err = authimpl.ProvideUserAuthTokenService(sqlStore, nil, quotaService, cfg) require.NoError(t, err) - _, err = dashboardStore.ProvideDashboardStore(sqlStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) + _, err = dashboardStore.ProvideDashboardStore(replStore, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) secretsService := secretsmng.SetupTestService(t, fakes.NewFakeSecretsStore()) secretsStore := secretskvs.NewSQLSecretsKVStore(sqlStore, secretsService, log.New("test.logger")) diff --git a/pkg/services/searchV2/index_test.go b/pkg/services/searchV2/index_test.go index b4cb38506f1..584253ff2ac 100644 --- a/pkg/services/searchV2/index_test.go +++ b/pkg/services/searchV2/index_test.go @@ -773,7 +773,8 @@ func TestIntegrationSoftDeletion(t *testing.T) { // Set up search v2. folderCount := 1 dashboardsPerFolder := 1 - sqlStore, cfg := db.InitTestDBWithCfg(t) + replStore, cfg := db.InitTestReplDBWithCfg(t) + sqlStore := replStore.DB() searchService, testUser, err := setupIntegrationEnv(t, folderCount, dashboardsPerFolder, sqlStore) require.NoError(t, err) @@ -791,7 +792,7 @@ func TestIntegrationSoftDeletion(t *testing.T) { // Set up dashboard store. quotaService := quotatest.New(false, nil) featureToggles := featuremgmt.WithFeatures(featuremgmt.FlagPanelTitleSearch, featuremgmt.FlagDashboardRestore) - dashboardStore, err := database.ProvideDashboardStore(sqlStore, cfg, featureToggles, tagimpl.ProvideService(sqlStore), quotaService) + dashboardStore, err := database.ProvideDashboardStore(replStore, cfg, featureToggles, tagimpl.ProvideService(sqlStore), quotaService) require.NoError(t, err) // Soft delete "dashboard2". diff --git a/pkg/services/sqlstore/permissions/dashboard_test.go b/pkg/services/sqlstore/permissions/dashboard_test.go index caf74dbcad9..f92c0d9ce39 100644 --- a/pkg/services/sqlstore/permissions/dashboard_test.go +++ b/pkg/services/sqlstore/permissions/dashboard_test.go @@ -816,7 +816,7 @@ func setupTest(t *testing.T, numFolders, numDashboards int, permissions []access func setupNestedTest(t *testing.T, usr *user.SignedInUser, perms []accesscontrol.Permission, orgID int64, features featuremgmt.FeatureToggles) db.DB { t.Helper() - db, cfg := db.InitTestDBWithCfg(t) + db, cfg := db.InitTestReplDBWithCfg(t) // dashboard store commands that should be called. dashStore, err := database.ProvideDashboardStore(db, cfg, features, tagimpl.ProvideService(db), quotatest.New(false, nil)) diff --git a/pkg/services/sqlstore/permissions/dashboards_bench_test.go b/pkg/services/sqlstore/permissions/dashboards_bench_test.go index ac6bbddeaa4..26ee1fa05fb 100644 --- a/pkg/services/sqlstore/permissions/dashboards_bench_test.go +++ b/pkg/services/sqlstore/permissions/dashboards_bench_test.go @@ -77,7 +77,7 @@ func setupBenchMark(b *testing.B, usr user.SignedInUser, features featuremgmt.Fe nestingLevel = folder.MaxNestedFolderDepth } - store, cfg := db.InitTestDBWithCfg(b) + store, cfg := db.InitTestReplDBWithCfg(b) quotaService := quotatest.New(false, nil)