mirror of https://github.com/grafana/grafana.git
				
				
				
			feat(alerting): move alert deletion to alert code
This commit is contained in:
		
							parent
							
								
									bb42579b0f
								
							
						
					
					
						commit
						3ef2be13df
					
				| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
package sqlstore
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	m "github.com/grafana/grafana/pkg/models"
 | 
			
		||||
	. "github.com/smartystreets/goconvey/convey"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	FakeOrgId int64 = 2
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestAlertRuleChangesDataAccess(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	Convey("Testing Alert rule changes data access", t, func() {
 | 
			
		||||
		InitTestDB(t)
 | 
			
		||||
 | 
			
		||||
		testDash := insertTestDashboard("dashboard with alerts", 2, "alert")
 | 
			
		||||
		var err error
 | 
			
		||||
 | 
			
		||||
		Convey("When dashboard is removed", func() {
 | 
			
		||||
			items := []m.AlertRule{
 | 
			
		||||
				{
 | 
			
		||||
					PanelId:     1,
 | 
			
		||||
					DashboardId: testDash.Id,
 | 
			
		||||
					Query:       "Query",
 | 
			
		||||
					QueryRefId:  "A",
 | 
			
		||||
					WarnLevel:   "> 30",
 | 
			
		||||
					CritLevel:   "> 50",
 | 
			
		||||
					Interval:    "10",
 | 
			
		||||
					Title:       "Alerting title",
 | 
			
		||||
					Description: "Alerting description",
 | 
			
		||||
					QueryRange:  "5m",
 | 
			
		||||
					Aggregator:  "avg",
 | 
			
		||||
					OrgId:       FakeOrgId,
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			cmd := m.SaveAlertsCommand{
 | 
			
		||||
				Alerts:      &items,
 | 
			
		||||
				DashboardId: testDash.Id,
 | 
			
		||||
				OrgId:       FakeOrgId,
 | 
			
		||||
				UserId:      2,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			SaveAlerts(&cmd)
 | 
			
		||||
 | 
			
		||||
			alertChanges, er := GetAlertRuleChanges(FakeOrgId)
 | 
			
		||||
			So(er, ShouldBeNil)
 | 
			
		||||
			So(len(alertChanges), ShouldEqual, 1)
 | 
			
		||||
 | 
			
		||||
			err = DeleteDashboard(&m.DeleteDashboardCommand{
 | 
			
		||||
				OrgId: FakeOrgId,
 | 
			
		||||
				Slug:  testDash.Slug,
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			So(err, ShouldBeNil)
 | 
			
		||||
 | 
			
		||||
			Convey("Alerts should be removed", func() {
 | 
			
		||||
				alerts, err2 := GetAlertsByDashboardId(testDash.Id)
 | 
			
		||||
 | 
			
		||||
				So(testDash.Id, ShouldEqual, 1)
 | 
			
		||||
				So(err2, ShouldBeNil)
 | 
			
		||||
				So(len(alerts), ShouldEqual, 0)
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			Convey("should add one more alert_rule_change", func() {
 | 
			
		||||
				alertChanges, er := GetAlertRuleChanges(FakeOrgId)
 | 
			
		||||
				So(er, ShouldBeNil)
 | 
			
		||||
				So(len(alertChanges), ShouldEqual, 2)
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -12,21 +12,37 @@ func init() {
 | 
			
		|||
	bus.AddHandler("sql", SaveAlerts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SaveAlertChange(change string, alert m.AlertRule) error {
 | 
			
		||||
	return inTransaction(func(sess *xorm.Session) error {
 | 
			
		||||
		_, err := sess.Insert(&m.AlertRuleChange{
 | 
			
		||||
			OrgId:   alert.OrgId,
 | 
			
		||||
			Type:    change,
 | 
			
		||||
			Created: time.Now(),
 | 
			
		||||
			AlertId: alert.Id,
 | 
			
		||||
		})
 | 
			
		||||
func DeleteAlertDefinition(dashboardId int64, sess *xorm.Session) error {
 | 
			
		||||
	alerts := make([]m.AlertRule, 0)
 | 
			
		||||
	sess.Where("dashboard_id = ?", dashboardId).Find(&alerts)
 | 
			
		||||
 | 
			
		||||
	for _, alert := range alerts {
 | 
			
		||||
		_, err := sess.Exec("DELETE FROM alert_rule WHERE id = ? ", alert.Id)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
		if err := SaveAlertChange("DELETED", alert, sess); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SaveAlertChange(change string, alert m.AlertRule, sess *xorm.Session) error {
 | 
			
		||||
	_, err := sess.Insert(&m.AlertRuleChange{
 | 
			
		||||
		OrgId:   alert.OrgId,
 | 
			
		||||
		Type:    change,
 | 
			
		||||
		Created: time.Now(),
 | 
			
		||||
		AlertId: alert.Id,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func alertIsDifferent(rule1, rule2 m.AlertRule) bool {
 | 
			
		||||
| 
						 | 
				
			
			@ -47,69 +63,81 @@ func alertIsDifferent(rule1, rule2 m.AlertRule) bool {
 | 
			
		|||
 | 
			
		||||
func SaveAlerts(cmd *m.SaveAlertsCommand) error {
 | 
			
		||||
	//this function should be refactored
 | 
			
		||||
	return inTransaction(func(sess *xorm.Session) error {
 | 
			
		||||
		fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId)
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId)
 | 
			
		||||
		alerts, err := GetAlertsByDashboardId2(cmd.DashboardId, sess)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	alerts, err := GetAlertsByDashboardId(cmd.DashboardId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
		for _, alert := range *cmd.Alerts {
 | 
			
		||||
			update := false
 | 
			
		||||
			var alertToUpdate m.AlertRule
 | 
			
		||||
 | 
			
		||||
	for _, alert := range *cmd.Alerts {
 | 
			
		||||
		update := false
 | 
			
		||||
		var alertToUpdate m.AlertRule
 | 
			
		||||
			for _, k := range alerts {
 | 
			
		||||
				if alert.PanelId == k.PanelId {
 | 
			
		||||
					update = true
 | 
			
		||||
					alert.Id = k.Id
 | 
			
		||||
					alertToUpdate = k
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		for _, k := range alerts {
 | 
			
		||||
			if alert.PanelId == k.PanelId {
 | 
			
		||||
				update = true
 | 
			
		||||
				alert.Id = k.Id
 | 
			
		||||
				alertToUpdate = k
 | 
			
		||||
			if update {
 | 
			
		||||
 | 
			
		||||
				if alertIsDifferent(alertToUpdate, alert) {
 | 
			
		||||
					_, err = sess.Id(alert.Id).Update(&alert)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					SaveAlertChange("UPDATED", alert, sess)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			} else {
 | 
			
		||||
				_, err = sess.Insert(&alert)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				SaveAlertChange("CREATED", alert, sess)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if update {
 | 
			
		||||
		for _, missingAlert := range alerts {
 | 
			
		||||
			missing := true
 | 
			
		||||
 | 
			
		||||
			if alertIsDifferent(alertToUpdate, alert) {
 | 
			
		||||
				_, err = x.Id(alert.Id).Update(&alert)
 | 
			
		||||
			for _, k := range *cmd.Alerts {
 | 
			
		||||
				if missingAlert.PanelId == k.PanelId {
 | 
			
		||||
					missing = false
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if missing {
 | 
			
		||||
				_, err = sess.Exec("DELETE FROM alert_rule WHERE id = ?", missingAlert.Id)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				SaveAlertChange("UPDATED", alert)
 | 
			
		||||
				err = SaveAlertChange("DELETED", missingAlert, sess)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
			_, err = x.Insert(&alert)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			SaveAlertChange("CREATED", alert)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetAlertsByDashboardId2(dashboardId int64, sess *xorm.Session) ([]m.AlertRule, error) {
 | 
			
		||||
	alerts := make([]m.AlertRule, 0)
 | 
			
		||||
	err := sess.Where("dashboard_id = ?", dashboardId).Find(&alerts)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return []m.AlertRule{}, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, missingAlert := range alerts {
 | 
			
		||||
		missing := true
 | 
			
		||||
 | 
			
		||||
		for _, k := range *cmd.Alerts {
 | 
			
		||||
			if missingAlert.PanelId == k.PanelId {
 | 
			
		||||
				missing = false
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if missing {
 | 
			
		||||
			_, err = x.Exec("DELETE FROM alert_rule WHERE id = ?", missingAlert.Id)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err = SaveAlertChange("DELETED", missingAlert)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return alerts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetAlertsByDashboardId(dashboardId int64) ([]m.AlertRule, error) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -227,7 +227,6 @@ func DeleteDashboard(cmd *m.DeleteDashboardCommand) error {
 | 
			
		|||
			"DELETE FROM dashboard_tag WHERE dashboard_id = ? ",
 | 
			
		||||
			"DELETE FROM star WHERE dashboard_id = ? ",
 | 
			
		||||
			"DELETE FROM dashboard WHERE id = ?",
 | 
			
		||||
			"DELETE FROM alert_rule WHERE dashboard_id = ?",
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, sql := range deletes {
 | 
			
		||||
| 
						 | 
				
			
			@ -237,6 +236,10 @@ func DeleteDashboard(cmd *m.DeleteDashboardCommand) error {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := DeleteAlertDefinition(dashboard.Id, sess.Session); err != nil {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue