package store import ( "context" "fmt" "xorm.io/builder" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/sqlstore" ) var ( // ErrNoAlertmanagerConfiguration is an error for when no alertmanager configuration is found. ErrNoAlertmanagerConfiguration = fmt.Errorf("could not find an Alertmanager configuration") ) // GetLatestAlertmanagerConfiguration returns the lastest version of the alertmanager configuration. // It returns ErrNoAlertmanagerConfiguration if no configuration is found. func (st *DBstore) GetLatestAlertmanagerConfiguration(query *models.GetLatestAlertmanagerConfigurationQuery) error { return st.SQLStore.WithDbSession(context.Background(), func(sess *sqlstore.DBSession) error { c := &models.AlertConfiguration{} // The ID is already an auto incremental column, using the ID as an order should guarantee the latest. ok, err := sess.Desc("id").Where("org_id = ?", query.OrgID).Limit(1).Get(c) if err != nil { return err } if !ok { return ErrNoAlertmanagerConfiguration } query.Result = c return nil }) } // GetAllLatestAlertmanagerConfiguration returns the latest configuration of every organization func (st *DBstore) GetAllLatestAlertmanagerConfiguration(ctx context.Context) ([]*models.AlertConfiguration, error) { var result []*models.AlertConfiguration err := st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error { condition := builder.In("id", builder.Select("MAX(id)").From("alert_configuration").GroupBy("org_id")) if err := sess.Table("alert_configuration").Where(condition).Find(&result); err != nil { return err } return nil }) if err != nil { return nil, err } return result, nil } // SaveAlertmanagerConfiguration creates an alertmanager configuration. func (st DBstore) SaveAlertmanagerConfiguration(cmd *models.SaveAlertmanagerConfigurationCmd) error { return st.SaveAlertmanagerConfigurationWithCallback(cmd, func() error { return nil }) } type SaveCallback func() error // SaveAlertmanagerConfigurationWithCallback creates an alertmanager configuration version and then executes a callback. // If the callback results in error it rolls back the transaction. func (st DBstore) SaveAlertmanagerConfigurationWithCallback(cmd *models.SaveAlertmanagerConfigurationCmd, callback SaveCallback) error { return st.SQLStore.WithTransactionalDbSession(context.Background(), func(sess *sqlstore.DBSession) error { config := models.AlertConfiguration{ AlertmanagerConfiguration: cmd.AlertmanagerConfiguration, ConfigurationVersion: cmd.ConfigurationVersion, Default: cmd.Default, OrgID: cmd.OrgID, } if _, err := sess.Insert(config); err != nil { return err } if err := callback(); err != nil { return err } return nil }) }