Files
grafana/pkg/services/sqlstore/migrations/ualert/created_folders_mig.go

84 lines
2.2 KiB
Go

package ualert
import (
"encoding/json"
"fmt"
"time"
"xorm.io/xorm"
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
)
// stateKey is a vendored migrationStore.stateKey.
var stateKey = "stateKey"
// CreatedFoldersMigration moves the record of created folders during legacy migration from Dashboard created_by=-8
// to the kvstore. If there are no dashboards with created_by=-.8, then nothing needs to be done.
func CreatedFoldersMigration(mg *migrator.Migrator) {
mg.AddMigration("migrate record of created folders during legacy migration to kvstore", &createdFoldersToKVStore{})
}
type createdFoldersToKVStore struct {
migrator.MigrationBase
}
func (c createdFoldersToKVStore) SQL(migrator.Dialect) string {
return codeMigration
}
func (c createdFoldersToKVStore) Exec(sess *xorm.Session, mg *migrator.Migrator) error {
var results []struct {
UID string `xorm:"uid"`
OrgID int64 `xorm:"org_id"`
}
folderCreatedBy := -8
if err := sess.SQL("select * from dashboard where created_by = ?", folderCreatedBy).Find(&results); err != nil {
return err
}
if len(results) == 0 {
mg.Logger.Debug("no dashboards with created_by=-8, nothing to set in kvstore")
return nil
}
type orgMigrationState struct {
OrgID int64 `json:"orgId"`
CreatedFolders []string `json:"createdFolders"`
}
states := make(map[int64]*orgMigrationState)
for _, r := range results {
if _, ok := states[r.OrgID]; !ok {
states[r.OrgID] = &orgMigrationState{
OrgID: r.OrgID,
CreatedFolders: []string{},
}
}
states[r.OrgID].CreatedFolders = append(states[r.OrgID].CreatedFolders, r.UID)
}
now := time.Now()
for _, state := range states {
raw, err := json.Marshal(state)
if err != nil {
return err
}
orgId := state.OrgID
entry := kvStoreV1Entry{
OrgID: &orgId,
Namespace: &KVNamespace,
Key: &stateKey,
Value: string(raw),
Created: now,
Updated: now,
}
if _, errCreate := sess.Table("kv_store").Insert(&entry); errCreate != nil {
mg.Logger.Error("failed to insert record of created folders to kvstore", "err", errCreate)
return fmt.Errorf("failed to insert record of created folders to kvstore: %w", errCreate)
}
}
return nil
}