From 69b5a9c752f3dd05faf7159d73874b08fec7a524 Mon Sep 17 00:00:00 2001 From: ying-jeanne <74549700+ying-jeanne@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:51:46 +0100 Subject: [PATCH] Chore: [Nested Folder] Add db migration at service start time (#58590) * add db migration at service start time * make changes for the 3 db * revert migrator * fix feature toggle check Co-authored-by: Serge Zaitsev --- pkg/services/folder/folderimpl/folder.go | 26 ++++++++++++++++++- .../sqlstore/migrations/folder_mig.go | 12 +-------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index 6f3d1818b36..61aa379b549 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -15,6 +15,8 @@ import ( "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/sqlstore" + "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/services/guardian" @@ -54,7 +56,7 @@ func ProvideService( ac.RegisterScopeAttributeResolver(dashboards.NewFolderNameScopeResolver(dashboardStore)) ac.RegisterScopeAttributeResolver(dashboards.NewFolderIDScopeResolver(dashboardStore)) store := ProvideStore(db, cfg, features) - return &Service{ + svr := &Service{ cfg: cfg, log: log.New("folder-service"), dashboardService: dashboardService, @@ -66,6 +68,28 @@ func ProvideService( accessControl: ac, bus: bus, } + if features.IsEnabled(featuremgmt.FlagNestedFolders) { + svr.DBMigration(db) + } + return svr +} + +func (s *Service) DBMigration(db db.DB) { + ctx := context.Background() + err := db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { + var err error + if db.GetDialect().DriverName() == migrator.SQLite { + _, err = sess.Exec("INSERT OR REPLACE INTO folder (id, uid, org_id, title, created, updated) SELECT id, uid, org_id, title, created, updated FROM dashboard WHERE is_folder = 1") + } else if db.GetDialect().DriverName() == migrator.Postgres { + _, err = sess.Exec("INSERT INTO folder (id, uid, org_id, title, created, updated) SELECT id, uid, org_id, title, created, updated FROM dashboard WHERE is_folder = true ON CONFLICT DO NOTHING") + } else { + _, err = sess.Exec("INSERT IGNORE INTO folder (id, uid, org_id, title, created, updated) SELECT id, uid, org_id, title, created, updated FROM dashboard WHERE is_folder = 1") + } + return err + }) + if err != nil { + s.log.Error("DB migration on folder service start failed.") + } } func (s *Service) Get(ctx context.Context, cmd *folder.GetFolderQuery) (*folder.Folder, error) { diff --git a/pkg/services/sqlstore/migrations/folder_mig.go b/pkg/services/sqlstore/migrations/folder_mig.go index fd9835612dd..71938ed791b 100644 --- a/pkg/services/sqlstore/migrations/folder_mig.go +++ b/pkg/services/sqlstore/migrations/folder_mig.go @@ -1,9 +1,6 @@ package migrations import ( - "fmt" - - "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/sqlstore/migrator" ) @@ -11,13 +8,6 @@ import ( func addFolderMigrations(mg *migrator.Migrator) { mg.AddMigration("create folder table", migrator.NewAddTableMigration(folderv1())) - // copy any existing folders in the dashboard table into the new folder - // table. The *legacy* parent folder ID, stored as folder_id in the - // dashboard table, is always going to be "0" so it is safe to convert to a parent UID. - mg.AddMigration("copy existing folders from dashboard table", migrator.NewRawSQLMigration( - "INSERT INTO folder (id, uid, org_id, title, created, updated) SELECT id, uid, org_id, title, created, updated FROM dashboard WHERE is_folder = 1;", - ).Postgres("INSERT INTO folder (id, uid, org_id, title, created, updated) SELECT id, uid, org_id, title, created, updated FROM dashboard WHERE is_folder = true;")) - mg.AddMigration("Add index for parent_uid", migrator.NewAddIndexMigration(folderv1(), &migrator.Index{ Cols: []string{"parent_uid", "org_id"}, })) @@ -43,7 +33,7 @@ func folderv1() migrator.Table { {Name: "org_id", Type: migrator.DB_BigInt, Nullable: false}, {Name: "title", Type: migrator.DB_NVarchar, Length: 255, Nullable: false}, {Name: "description", Type: migrator.DB_NVarchar, Length: 255, Nullable: true}, - {Name: "parent_uid", Type: migrator.DB_NVarchar, Length: 40, Default: fmt.Sprintf("'%s'", folder.GeneralFolderUID)}, + {Name: "parent_uid", Type: migrator.DB_NVarchar, Length: 40, Default: ""}, {Name: "created", Type: migrator.DB_DateTime, Nullable: false}, {Name: "updated", Type: migrator.DB_DateTime, Nullable: false}, },