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

feat(alerting): excisting alerts are now updated

bergquist 9 лет назад
Родитель
Сommit
8bb62a79d0
2 измененных файлов с 68 добавлено и 7 удалено
  1. 39 4
      pkg/services/sqlstore/alerting.go
  2. 29 3
      pkg/services/sqlstore/alerting_test.go

+ 39 - 4
pkg/services/sqlstore/alerting.go

@@ -13,17 +13,48 @@ func init() {
 func SaveAlerts(cmd *m.SaveAlertsCommand) error {
 	fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId)
 
+	alerts, err := GetAlertsByDashboardId(cmd.DashboardId)
+	if err != nil {
+		return err
+	}
+
 	for _, alert := range *cmd.Alerts {
-		_, err := x.Insert(&alert)
-		if err != nil {
-			return err
+		update := false
+
+		for _, k := range alerts {
+			if alert.PanelId == k.PanelId && alert.DashboardId == k.DashboardId {
+				update = true
+			}
+		}
+
+		if update {
+			_, err = x.Update(&alert)
+			if err != nil {
+				return err
+			}
+		} else {
+			_, err = x.Insert(&alert)
+			if err != nil {
+				return err
+			}
 		}
 	}
 
 	return nil
 }
 
-func GetAlertsByDashboard(dashboardId, panelId int64) (m.Alert, error) {
+func GetAlertsByDashboardId(dashboardId int64) ([]m.Alert, error) {
+	alerts := make([]m.Alert, 0)
+	err := x.Where("dashboard_id = ?", dashboardId).Find(&alerts)
+
+	if err != nil {
+		return []m.Alert{}, err
+	}
+
+	return alerts, nil
+}
+
+func GetAlertsByDashboardAndPanelId(dashboardId, panelId int64) (m.Alert, error) {
 	// this code should be refactored!!
 	// uniqueness should be garanted!
 
@@ -34,5 +65,9 @@ func GetAlertsByDashboard(dashboardId, panelId int64) (m.Alert, error) {
 		return m.Alert{}, err
 	}
 
+	if len(alerts) != 1 {
+		return m.Alert{}, err
+	}
+
 	return alerts[0], nil
 }

+ 29 - 3
pkg/services/sqlstore/alerting_test.go

@@ -37,12 +37,12 @@ func TestAlertingDataAccess(t *testing.T) {
 
 		err := SaveAlerts(&cmd)
 
-		Convey("Can create alert", func() {
+		Convey("Can create one alert", func() {
 			So(err, ShouldBeNil)
 		})
 
-		Convey("can read properties", func() {
-			alert, err2 := GetAlertsByDashboard(1, 1)
+		Convey("Can read properties", func() {
+			alert, err2 := GetAlertsByDashboardAndPanelId(1, 1)
 
 			So(err2, ShouldBeNil)
 			So(alert.Interval, ShouldEqual, "10")
@@ -55,5 +55,31 @@ func TestAlertingDataAccess(t *testing.T) {
 			So(alert.QueryRange, ShouldEqual, "5m")
 			So(alert.Aggregator, ShouldEqual, "avg")
 		})
+
+		Convey("Alerts with same dashboard id and panel id should update", func() {
+			modifiedItems := items
+			modifiedItems[0].Query = "Updated Query"
+
+			modifiedCmd := m.SaveAlertsCommand{
+				DashboardId: 1,
+				OrgId:       1,
+				UserId:      1,
+				Alerts:      &modifiedItems,
+			}
+
+			err := SaveAlerts(&modifiedCmd)
+
+			Convey("Can save alerts with same dashboard and panel id", func() {
+				So(err, ShouldBeNil)
+			})
+
+			Convey("Alerts should be updated", func() {
+				alerts, err2 := GetAlertsByDashboardId(1)
+
+				So(err2, ShouldBeNil)
+				So(len(alerts), ShouldEqual, 1)
+				So(alerts[0].Query, ShouldEqual, "Updated Query")
+			})
+		})
 	})
 }