diff --git a/pkg/services/ngalert/models/silence.go b/pkg/services/ngalert/models/silence.go deleted file mode 100644 index 56f52db3971..00000000000 --- a/pkg/services/ngalert/models/silence.go +++ /dev/null @@ -1,119 +0,0 @@ -package models - -import ( - "encoding/json" - "errors" - "fmt" - - "github.com/go-openapi/strfmt" - - amv2 "github.com/prometheus/alertmanager/api/v2/models" -) - -var ( - // ErrSilenceNotFound is an error for an unknown silence. - ErrSilenceNotFound = fmt.Errorf("could not find silence") - // ErrSilenceFailedGenerateUniqueUID is an error for failure to generate silence UID - ErrSilenceFailedGenerateUniqueUID = errors.New("failed to generate silence UID") -) - -type SilenceSettings amv2.GettableSilence - -type SilenceStatus amv2.SilenceStatus - -// FromDB loads silence status stored in the database. -// FromDB is part of the xorm Conversion interface. -func (st *SilenceStatus) FromDB(b []byte) error { - str := string(b) - *st = SilenceStatus{State: &str} - return nil -} - -// ToDB serializes silence status to be stored in the database. -// ToDB is part of the xorm Conversion interface. -func (st *SilenceStatus) ToDB() ([]byte, error) { - return []byte(*st.State), nil -} - -type Matchers amv2.Matchers - -// FromDB loads matchers stored in the database. -// FromDB is part of the xorm Conversion interface. -func (m *Matchers) FromDB(b []byte) error { - err := json.Unmarshal(b, &m) - if err != nil { - return fmt.Errorf("failed to convert matchers from database: %w", err) - } - return nil -} - -// ToDB serializes matchers to be stored in the database. -// ToDB is part of the xorm Conversion interface. -func (m *Matchers) ToDB() ([]byte, error) { - blobMatchers, err := json.Marshal(m) - if err != nil { - return nil, fmt.Errorf("failed to convert matchers to send to the database: %w", err) - } - return blobMatchers, nil -} - -type Silence struct { - ID int64 `xorm:"pk autoincr 'id'"` - OrgID int64 `xorm:"org_id" json:"orgId"` - UID string `xorm:"uid" json:"uid"` - Status SilenceStatus `json:"status"` - UpdatedAt strfmt.DateTime `json:"updatedAt"` - Comment string `json:"comment"` - CreatedBy string `json:"createdBy"` - EndsAt strfmt.DateTime `json:"endsAt"` - Matchers Matchers `json:"matchers"` - StartsAt strfmt.DateTime `json:"startsAt"` -} - -func (s Silence) ToGettableSilence() amv2.GettableSilence { - gettableSilence := amv2.GettableSilence{ - ID: &s.UID, - Status: &amv2.SilenceStatus{State: s.Status.State}, - UpdatedAt: &s.UpdatedAt, - } - gettableSilence.Comment = &s.Comment - gettableSilence.CreatedBy = &s.CreatedBy - gettableSilence.EndsAt = &s.EndsAt - gettableSilence.Matchers = amv2.Matchers(s.Matchers) - gettableSilence.StartsAt = &s.StartsAt - return gettableSilence -} - -type SaveSilenceCommand struct { - amv2.Silence - UID string - OrgID int64 -} - -type DeleteSilenceByUIDCommand struct { - UID string - OrgID int64 -} - -type DeleteSilenceByIDCommand struct { - ID int64 -} - -type GetSilenceByUIDQuery struct { - UID string - OrgID int64 - - Result *Silence -} - -type GetSilenceByIDQuery struct { - ID int64 - - Result *Silence -} - -type GetSilencesQuery struct { - OrgID int64 - - Result []*Silence -} diff --git a/pkg/services/ngalert/ngalert.go b/pkg/services/ngalert/ngalert.go index 276b4734c03..4a23a3a9a83 100644 --- a/pkg/services/ngalert/ngalert.go +++ b/pkg/services/ngalert/ngalert.go @@ -118,7 +118,4 @@ func (ng *AlertNG) AddMigration(mg *migrator.Migrator) { // Create alert_rule store.AddAlertRuleMigrations(mg, defaultIntervalSeconds) store.AddAlertRuleVersionMigrations(mg) - - // Create silence table - store.SilenceMigration(mg) } diff --git a/pkg/services/ngalert/store/database.go b/pkg/services/ngalert/store/database.go index 474225718f1..e07f27d2273 100644 --- a/pkg/services/ngalert/store/database.go +++ b/pkg/services/ngalert/store/database.go @@ -42,12 +42,6 @@ type AlertingStore interface { GetLatestAlertmanagerConfiguration(*models.GetLatestAlertmanagerConfigurationQuery) error GetAlertmanagerConfiguration(*models.GetAlertmanagerConfigurationQuery) error SaveAlertmanagerConfiguration(*models.SaveAlertmanagerConfigurationCmd) error - GetOrgSilences(*models.GetSilencesQuery) error - GetSilenceByUID(*models.GetSilenceByUIDQuery) error - GetSilenceByID(*models.GetSilenceByIDQuery) error - SaveSilence(*models.SaveSilenceCommand) error - DeleteSilenceByUID(*models.DeleteSilenceByUIDCommand) error - DeleteSilenceByID(*models.DeleteSilenceByIDCommand) error } // DBstore stores the alert definitions and instances in the database. diff --git a/pkg/services/ngalert/store/silence.go b/pkg/services/ngalert/store/silence.go deleted file mode 100644 index 2beb92cbfed..00000000000 --- a/pkg/services/ngalert/store/silence.go +++ /dev/null @@ -1,165 +0,0 @@ -package store - -import ( - "context" - "errors" - "fmt" - - "github.com/go-openapi/strfmt" - "github.com/grafana/grafana/pkg/services/ngalert/models" - "github.com/grafana/grafana/pkg/services/sqlstore" - "github.com/grafana/grafana/pkg/util" - amv2 "github.com/prometheus/alertmanager/api/v2/models" -) - -func getSilenceByUID(sess *sqlstore.DBSession, silenceUID string, orgID int64) (*models.Silence, error) { - silence := &models.Silence{ - OrgID: orgID, - UID: silenceUID, - } - has, err := sess.Get(silence) - if err != nil { - return nil, err - } - if !has { - return nil, models.ErrSilenceNotFound - } - return silence, nil -} - -func getSilenceByID(sess *sqlstore.DBSession, id int64) (*models.Silence, error) { - silence := &models.Silence{} - - has, err := sess.ID(id).Get(silence) - if err != nil { - return nil, err - } - if !has { - return nil, ErrNoAlertmanagerConfiguration - } - - return silence, nil -} - -func (st DBstore) GetOrgSilences(query *models.GetSilencesQuery) error { - return st.SQLStore.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - silences := make([]*models.Silence, 0) - q := "SELECT * FROM silence WHERE org_id = ?" - if err := sess.SQL(q, query.OrgID).Find(&silences); err != nil { - return err - } - - query.Result = silences - return nil - }) -} - -func (st DBstore) GetSilenceByUID(query *models.GetSilenceByUIDQuery) error { - return st.SQLStore.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - silence, err := getSilenceByUID(sess, query.UID, query.OrgID) - if err != nil { - return err - } - query.Result = silence - return nil - }) -} - -func (st DBstore) GetSilenceByID(query *models.GetSilenceByIDQuery) error { - return st.SQLStore.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - silence, err := getSilenceByID(sess, query.ID) - if err != nil { - return err - } - query.Result = silence - return nil - }) -} - -func (st DBstore) DeleteSilenceByUID(cmd *models.DeleteSilenceByUIDCommand) error { - return st.SQLStore.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - _, err := getSilenceByUID(sess, cmd.UID, cmd.OrgID) - if err != nil && errors.Is(err, models.ErrSilenceNotFound) { - return err - } - - _, err = sess.Exec("DELETE FROM silence WHERE uid = ? AND org_id = ?", cmd.UID, cmd.OrgID) - if err != nil { - return err - } - return nil - }) -} - -func (st DBstore) DeleteSilenceByID(cmd *models.DeleteSilenceByIDCommand) error { - return st.SQLStore.WithTransactionalDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - _, err := getSilenceByID(sess, cmd.ID) - if err != nil && errors.Is(err, models.ErrSilenceNotFound) { - return err - } - - _, err = sess.Exec("DELETE FROM silence WHERE id ?", cmd.ID) - if err != nil { - return err - } - return nil - }) -} - -func (st DBstore) SaveSilence(cmd *models.SaveSilenceCommand) error { - return st.SQLStore.WithTransactionalDbSession(context.Background(), func(sess *sqlstore.DBSession) error { - var firstSeen bool - existingSilence, err := getSilenceByUID(sess, cmd.UID, cmd.OrgID) - if err != nil { - if !errors.Is(err, models.ErrSilenceNotFound) { - return err - } - firstSeen = true - } - - statusPending := amv2.SilenceStatusStatePending - updatedAt := strfmt.DateTime(TimeNow()) - - silenceModel := models.Silence{ - OrgID: cmd.OrgID, - UID: cmd.UID, - Status: models.SilenceStatus{State: &statusPending}, - UpdatedAt: updatedAt, - Comment: *cmd.Comment, - CreatedBy: *cmd.CreatedBy, - EndsAt: *cmd.EndsAt, - Matchers: models.Matchers(cmd.Matchers), - StartsAt: *cmd.StartsAt, - } - - switch firstSeen { - case true: - if _, err := sess.Insert(&silenceModel); err != nil { - return fmt.Errorf("failed to insert silence: %w", err) - } - default: - if _, err := sess.ID(existingSilence.ID).Update(&silenceModel); err != nil { - return fmt.Errorf("failed to update silence: %w", err) - } - } - - return nil - }) -} - -func GenerateNewSilenceUID(sess *sqlstore.DBSession, orgID int64) (string, error) { - for i := 0; i < 3; i++ { - uid := util.GenerateShortUID() - - exists, err := sess.Where("org_id=? AND uid=?", orgID, uid).Get(&models.Silence{}) - if err != nil { - return "", err - } - - if !exists { - return uid, nil - } - } - - return "", models.ErrSilenceFailedGenerateUniqueUID -}