From 8ab12aede4499b3dbed86740d1f37b1db5cdccc2 Mon Sep 17 00:00:00 2001 From: Moustafa Baiou Date: Tue, 31 Dec 2024 12:50:43 -0500 Subject: [PATCH] Alerting: Fix terraform export of notification policy When exporting a notification policy with no `group_by` the hcl exported is not valid as it is missing the required field. This fixes the issue by initializing the `group_by` field with an empty list if it is nil. --- pkg/services/ngalert/api/api_provisioning.go | 4 ++++ .../ngalert/api/api_provisioning_test.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/pkg/services/ngalert/api/api_provisioning.go b/pkg/services/ngalert/api/api_provisioning.go index 3072fce074f..19c73030f01 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -614,6 +614,10 @@ func exportHcl(download bool, body definitions.AlertingFileExport) response.Resp for idx, cp := range body.Policies { policy := cp.RouteExport + if policy.GroupByStr == nil { + // required field, must be set to empty array + policy.GroupByStr = &[]string{} + } resources = append(resources, hcl.Resource{ Type: "grafana_notification_policy", Name: fmt.Sprintf("notification_policy_%d", idx+1), diff --git a/pkg/services/ngalert/api/api_provisioning_test.go b/pkg/services/ngalert/api/api_provisioning_test.go index ff94223dd0a..6c9f2d50834 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -1428,6 +1428,23 @@ func TestProvisioningApi(t *testing.T) { require.Equal(t, 200, response.Status()) require.Equal(t, expectedResponse, string(response.Body())) }) + + t.Run("hcl contains required group_by field", func(t *testing.T) { + sut := createProvisioningSrvSut(t) + rc := createTestRequestCtx() + + rc.Context.Req.Form.Add("format", "hcl") + expectedResponse := "resource \"grafana_notification_policy\" \"notification_policy_1\" {\n" + + " contact_point = \"some-receiver\"\n" + + " group_by = []\n" + + "}\n" + + response := sut.RouteGetPolicyTreeExport(&rc) + + t.Log(string(response.Body())) + require.Equal(t, 200, response.Status()) + require.Equal(t, expectedResponse, string(response.Body())) + }) }) t.Run("mute timings", func(t *testing.T) {