From c43bb7fb99c4cb5d47a258de68d3daabb5df1915 Mon Sep 17 00:00:00 2001 From: Carl Bergquist Date: Fri, 13 Jan 2017 15:46:23 +0100 Subject: [PATCH] Extractor should not modify dashboard json (#7256) * test(dashboard): tests that he extractor does not modify original json * feat(extractor): validate a cloned version of the dashboard json --- pkg/services/alerting/extractor.go | 17 +++++++++++++-- pkg/services/alerting/extractor_test.go | 28 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pkg/services/alerting/extractor.go b/pkg/services/alerting/extractor.go index 6e064c8cf76..28a6b8c61a0 100644 --- a/pkg/services/alerting/extractor.go +++ b/pkg/services/alerting/extractor.go @@ -60,12 +60,25 @@ func findPanelQueryByRefId(panel *simplejson.Json, refId string) *simplejson.Jso return nil } +func copyJson(in *simplejson.Json) (*simplejson.Json, error) { + rawJson, err := in.MarshalJSON() + if err != nil { + return nil, err + } + + return simplejson.NewJson(rawJson) +} + func (e *DashAlertExtractor) GetAlerts() ([]*m.Alert, error) { e.log.Debug("GetAlerts") - alerts := make([]*m.Alert, 0) + dashboardJson, err := copyJson(e.Dash.Data) + if err != nil { + return nil, err + } - for _, rowObj := range e.Dash.Data.Get("rows").MustArray() { + alerts := make([]*m.Alert, 0) + for _, rowObj := range dashboardJson.Get("rows").MustArray() { row := simplejson.NewFromAny(rowObj) for _, panelObj := range row.Get("panels").MustArray() { diff --git a/pkg/services/alerting/extractor_test.go b/pkg/services/alerting/extractor_test.go index e72e6d938d8..cb174783478 100644 --- a/pkg/services/alerting/extractor_test.go +++ b/pkg/services/alerting/extractor_test.go @@ -110,6 +110,34 @@ func TestAlertRuleExtraction(t *testing.T) { ] }` + Convey("Extractor should not modify the original json", func() { + dashJson, err := simplejson.NewJson([]byte(json)) + So(err, ShouldBeNil) + + dash := m.NewDashboardFromJson(dashJson) + + getTarget := func(j *simplejson.Json) string { + rowObj := j.Get("rows").MustArray()[0] + row := simplejson.NewFromAny(rowObj) + panelObj := row.Get("panels").MustArray()[0] + panel := simplejson.NewFromAny(panelObj) + conditionObj := panel.Get("alert").Get("conditions").MustArray()[0] + condition := simplejson.NewFromAny(conditionObj) + return condition.Get("query").Get("model").Get("target").MustString() + } + + Convey("Dashboard json rows.panels.alert.query.model.target should be empty", func() { + So(getTarget(dashJson), ShouldEqual, "") + }) + + extractor := NewDashAlertExtractor(dash, 1) + _, _ = extractor.GetAlerts() + + Convey("Dashboard json should not be updated after extracting rules", func() { + So(getTarget(dashJson), ShouldEqual, "") + }) + }) + Convey("Parsing and validating dashboard containing graphite alerts", func() { dashJson, err := simplejson.NewJson([]byte(json))