From 3abe84121f78f773277bbdf11c511018668f76ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Fri, 4 Jul 2025 17:19:53 +0200 Subject: [PATCH] feat(config): add config `ensure_default_org_and_user` (#107619) --- pkg/services/sqlstore/database_config.go | 2 + pkg/services/sqlstore/sqlstore.go | 51 ++++++++------------- pkg/services/sqlstore/sqlstore_testinfra.go | 6 ++- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/pkg/services/sqlstore/database_config.go b/pkg/services/sqlstore/database_config.go index 171ff4972b9..f5ba069df15 100644 --- a/pkg/services/sqlstore/database_config.go +++ b/pkg/services/sqlstore/database_config.go @@ -39,6 +39,7 @@ type DatabaseConfig struct { WALEnabled bool UrlQueryParams map[string][]string SkipMigrations bool + EnsureDefaultOrgAndUser bool MigrationLock bool MigrationLockAttemptTimeout int LogQueries bool @@ -114,6 +115,7 @@ func (dbCfg *DatabaseConfig) readConfig(cfg *setting.Cfg) error { dbCfg.CacheMode = sec.Key("cache_mode").MustString("private") dbCfg.WALEnabled = sec.Key("wal").MustBool(false) dbCfg.SkipMigrations = sec.Key("skip_migrations").MustBool() + dbCfg.EnsureDefaultOrgAndUser = sec.Key("ensure_default_org_and_user").MustBool(true) dbCfg.MigrationLock = sec.Key("migration_locking").MustBool(true) dbCfg.MigrationLockAttemptTimeout = sec.Key("locking_attempt_timeout_sec").MustInt() diff --git a/pkg/services/sqlstore/sqlstore.go b/pkg/services/sqlstore/sqlstore.go index 0cfb63fb9e9..b54a177cf02 100644 --- a/pkg/services/sqlstore/sqlstore.go +++ b/pkg/services/sqlstore/sqlstore.go @@ -47,7 +47,6 @@ type SQLStore struct { engine *xorm.Engine log log.Logger dialect migrator.Dialect - skipEnsureDefaultOrgAndUser bool migrations registry.DatabaseMigrator tracer tracing.Tracer recursiveQueriesAreSupported *bool @@ -62,7 +61,7 @@ func ProvideService(cfg *setting.Cfg, // by that mimic the functionality of how it was functioning before // xorm's changes above. xorm.DefaultPostgresSchema = "" - s, err := newStore(cfg, nil, features, migrations, bus, tracer, false) + s, err := newStore(cfg, nil, features, migrations, bus, tracer) if err != nil { return nil, err } @@ -80,7 +79,7 @@ func ProvideService(cfg *setting.Cfg, } func ProvideServiceForTests(t sqlutil.ITestDB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, bus bus.Bus, migrations registry.DatabaseMigrator) (*SQLStore, error) { - return initTestDB(t, cfg, features, migrations, bus, InitTestDBOpt{EnsureDefaultOrgAndUser: true}) + return initTestDB(t, cfg, features, migrations, bus, InitTestDBOpt{}) } // NewSQLStoreWithoutSideEffects creates a new *SQLStore without side-effects such as @@ -88,20 +87,20 @@ func ProvideServiceForTests(t sqlutil.ITestDB, cfg *setting.Cfg, features featur func NewSQLStoreWithoutSideEffects(cfg *setting.Cfg, features featuremgmt.FeatureToggles, bus bus.Bus, tracer tracing.Tracer) (*SQLStore, error) { - return newStore(cfg, nil, features, nil, bus, tracer, true) + cfgDBSection := cfg.Raw.Section("database") + cfgDBSection.Key("ensure_default_org_and_user").SetValue("false") + return newStore(cfg, nil, features, nil, bus, tracer) } func newStore(cfg *setting.Cfg, engine *xorm.Engine, features featuremgmt.FeatureToggles, - migrations registry.DatabaseMigrator, bus bus.Bus, tracer tracing.Tracer, - skipEnsureDefaultOrgAndUser bool) (*SQLStore, error) { + migrations registry.DatabaseMigrator, bus bus.Bus, tracer tracing.Tracer) (*SQLStore, error) { ss := &SQLStore{ - cfg: cfg, - log: log.New("sqlstore"), - skipEnsureDefaultOrgAndUser: skipEnsureDefaultOrgAndUser, - migrations: migrations, - bus: bus, - tracer: tracer, - features: features, + cfg: cfg, + log: log.New("sqlstore"), + migrations: migrations, + bus: bus, + tracer: tracer, + features: features, } if err := ss.initEngine(engine); err != nil { @@ -148,11 +147,10 @@ func (ss *SQLStore) Migrate(isDatabaseLockingEnabled bool) error { // Reset resets database state. // If default org and user creation is enabled, it will be ensured they exist in the database. func (ss *SQLStore) Reset() error { - if ss.skipEnsureDefaultOrgAndUser { - return nil + if ss.dbCfg.EnsureDefaultOrgAndUser { + return ss.ensureMainOrgAndAdminUser(false) } - - return ss.ensureMainOrgAndAdminUser(false) + return nil } // Quote quotes the value in the used SQL dialect @@ -412,10 +410,8 @@ var testSQLStoreCleanup []func() // InitTestDBOpt contains options for InitTestDB. type InitTestDBOpt struct { - // EnsureDefaultOrgAndUser flags whether to ensure that default org and user exist. - EnsureDefaultOrgAndUser bool - FeatureFlags []string - Cfg *setting.Cfg + FeatureFlags []string + Cfg *setting.Cfg } // InitTestDBWithMigration initializes the test DB given custom migrations. @@ -533,7 +529,8 @@ func TestMain(m *testing.M) { } if len(opts) == 0 { - opts = []InitTestDBOpt{{EnsureDefaultOrgAndUser: false, FeatureFlags: []string{}}} + cfgDBSec := testCfg.Raw.Section("database") + cfgDBSec.Key("ensure_default_org_and_user").SetValue("false") } if testSQLStore == nil { @@ -566,16 +563,8 @@ func TestMain(m *testing.M) { engine.DatabaseTZ = time.UTC engine.TZLocation = time.UTC - skipEnsureDefaultOrgAndUser := false - for _, opt := range opts { - if !opt.EnsureDefaultOrgAndUser { - skipEnsureDefaultOrgAndUser = true - break - } - } - tracer := tracing.InitializeTracerForTest() - testSQLStore, err = newStore(testCfg, engine, features, migration, bus, tracer, skipEnsureDefaultOrgAndUser) + testSQLStore, err = newStore(testCfg, engine, features, migration, bus, tracer) if err != nil { return nil, err } diff --git a/pkg/services/sqlstore/sqlstore_testinfra.go b/pkg/services/sqlstore/sqlstore_testinfra.go index 194cf843c2f..5ac0b8e8288 100644 --- a/pkg/services/sqlstore/sqlstore_testinfra.go +++ b/pkg/services/sqlstore/sqlstore_testinfra.go @@ -174,8 +174,12 @@ func NewTestStore(tb TestingTB, opts ...TestOption) *SQLStore { engine.DatabaseTZ = time.UTC engine.TZLocation = time.UTC + cfgDBSec := cfg.Raw.Section("database") + shouldEnsure := fmt.Sprintf("%t", !options.NoDefaultUserOrg && !options.Truncate) + cfgDBSec.Key("ensure_default_org_and_user").SetValue(shouldEnsure) + store, err := newStore(cfg, engine, features, options.MigratorFactory(features), - options.Bus, options.Tracer, options.NoDefaultUserOrg || options.Truncate) + options.Bus, options.Tracer) if err != nil { tb.Fatalf("failed to create a new SQLStore: %v", err) panic("unreachable")