Alerting: modify DB table, accessors and migration to restrict org access (#37414)
* Alerting: modify table and accessors to limit org access appropriately * Update migration to create multiple Alertmanager configs * Apply suggestions from code review Co-authored-by: gotjosh <josue@grafana.com> * replace mg.ClearMigrationEntry() mg.ClearMigrationEntry() would create a new session. This commit introduces a new migration for clearing an entry from migration log for replacing mg.ClearMigrationEntry() so that all dashboard alert migration operations will run inside the same transaction. It adds also `SkipMigrationLog()` in Migrator interface for skipping adding an entry in the migration_log. Co-authored-by: gotjosh <josue@grafana.com>
This commit is contained in:
co-authored by
gotjosh
parent
4a9fdb8b76
commit
04d5dcb7c8
@@ -21,6 +21,10 @@ func (m *MigrationBase) GetCondition() MigrationCondition {
|
||||
return m.Condition
|
||||
}
|
||||
|
||||
func (m *MigrationBase) SkipMigrationLog() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
type RawSQLMigration struct {
|
||||
MigrationBase
|
||||
|
||||
|
||||
@@ -108,13 +108,17 @@ func (mg *Migrator) Start() error {
|
||||
if err != nil {
|
||||
mg.Logger.Error("Exec failed", "error", err, "sql", sql)
|
||||
record.Error = err.Error()
|
||||
if _, err := sess.Insert(&record); err != nil {
|
||||
return err
|
||||
if !m.SkipMigrationLog() {
|
||||
if _, err := sess.Insert(&record); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
record.Success = true
|
||||
_, err = sess.Insert(&record)
|
||||
if !m.SkipMigrationLog() {
|
||||
_, err = sess.Insert(&record)
|
||||
}
|
||||
if err == nil {
|
||||
migrationsPerformed++
|
||||
}
|
||||
@@ -171,16 +175,6 @@ func (mg *Migrator) exec(m Migration, sess *xorm.Session) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mg *Migrator) ClearMigrationEntry(id string) error {
|
||||
sess := mg.x.NewSession()
|
||||
defer sess.Close()
|
||||
_, err := sess.SQL(`DELETE from migration_log where migration_id = ?`, id).Query()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to clear migration entry %v: %w", id, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type dbTransactionFunc func(sess *xorm.Session) error
|
||||
|
||||
func (mg *Migrator) InTransaction(callback dbTransactionFunc) error {
|
||||
|
||||
@@ -19,6 +19,10 @@ type Migration interface {
|
||||
Id() string
|
||||
SetId(string)
|
||||
GetCondition() MigrationCondition
|
||||
// SkipMigrationLog is used by dashboard alert migration to Grafana 8 Alerts
|
||||
// for skipping recording it in the migration_log so that it can run several times.
|
||||
// For all the other migrations it should be false.
|
||||
SkipMigrationLog() bool
|
||||
}
|
||||
|
||||
type CodeMigration interface {
|
||||
|
||||
Reference in New Issue
Block a user