Просмотр исходного кода

feat(alerting): delete alerts when panels are removed

bergquist 9 лет назад
Родитель
Сommit
84115c8038
2 измененных файлов с 69 добавлено и 2 удалено
  1. 24 2
      pkg/services/sqlstore/alerting.go
  2. 45 0
      pkg/services/sqlstore/alerting_test.go

+ 24 - 2
pkg/services/sqlstore/alerting.go

@@ -22,13 +22,14 @@ func SaveAlerts(cmd *m.SaveAlertsCommand) error {
 		update := false
 
 		for _, k := range alerts {
-			if alert.PanelId == k.PanelId && alert.DashboardId == k.DashboardId {
+			if alert.PanelId == k.PanelId {
 				update = true
+				alert.Id = k.Id
 			}
 		}
 
 		if update {
-			_, err = x.Update(&alert)
+			_, err = x.Id(alert.Id).Update(&alert)
 			if err != nil {
 				return err
 			}
@@ -40,6 +41,27 @@ func SaveAlerts(cmd *m.SaveAlertsCommand) error {
 		}
 	}
 
+	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 WHERE id = ?", missingAlert.Id)
+			if err != nil {
+				return err
+			}
+
+			if err != nil {
+				return err
+			}
+		}
+	}
+
 	return nil
 }
 

+ 45 - 0
pkg/services/sqlstore/alerting_test.go

@@ -81,5 +81,50 @@ func TestAlertingDataAccess(t *testing.T) {
 				So(alerts[0].Query, ShouldEqual, "Updated Query")
 			})
 		})
+
+		Convey("Multiple alerts per dashboard", func() {
+			//save 3 alerts
+			multipleItems := []m.Alert{
+				{
+					DashboardId: 1,
+					PanelId:     1,
+					Query:       "1",
+				},
+				{
+					DashboardId: 1,
+					PanelId:     2,
+					Query:       "2",
+				},
+				{
+					DashboardId: 1,
+					PanelId:     3,
+					Query:       "3",
+				},
+			}
+
+			cmd.Alerts = &multipleItems
+			err = SaveAlerts(&cmd)
+
+			Convey("Should save 3 dashboards", func() {
+				So(err, ShouldBeNil)
+
+				alerts, err2 := GetAlertsByDashboardId(1)
+				So(err2, ShouldBeNil)
+				So(len(alerts), ShouldEqual, 3)
+			})
+
+			Convey("should updated two dashboards and delete one", func() {
+				missingOneAlert := multipleItems[:2]
+
+				cmd.Alerts = &missingOneAlert
+				err = SaveAlerts(&cmd)
+
+				Convey("should delete the missing alert", func() {
+					alerts, err2 := GetAlertsByDashboardId(1)
+					So(err2, ShouldBeNil)
+					So(len(alerts), ShouldEqual, 2)
+				})
+			})
+		})
 	})
 }