From 84115c80386e002ead96016a0564bf3b83c1e735 Mon Sep 17 00:00:00 2001 From: bergquist Date: Fri, 22 Apr 2016 17:49:50 +0200 Subject: [PATCH] feat(alerting): delete alerts when panels are removed --- pkg/services/sqlstore/alerting.go | 26 +++++++++++++-- pkg/services/sqlstore/alerting_test.go | 45 ++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/pkg/services/sqlstore/alerting.go b/pkg/services/sqlstore/alerting.go index 804fa8552ce..06e41e11734 100644 --- a/pkg/services/sqlstore/alerting.go +++ b/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 } diff --git a/pkg/services/sqlstore/alerting_test.go b/pkg/services/sqlstore/alerting_test.go index 6489d34e9e5..00e2bfde4f2 100644 --- a/pkg/services/sqlstore/alerting_test.go +++ b/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) + }) + }) + }) }) }