Alerting: Fix export of notification policy to JSON (#78021)

* Export Notification Policy correctly (#78020)

The JSON version of an exported Notification Policy now
inline correctly the policy in the same way the Yaml version
does.

Co-authored-by: Yuri Tseretyan <yuriy.tseretyan@grafana.com>
This commit is contained in:
Rodrigo Villablanca
2023-12-04 18:57:37 -03:00
committed by GitHub
parent 99580d60f5
commit ab83bc7346
5 changed files with 36 additions and 6 deletions

View File

@@ -573,7 +573,7 @@ func exportHcl(download bool, body definitions.AlertingFileExport) response.Resp
} }
for idx, cp := range body.Policies { for idx, cp := range body.Policies {
policy := cp.Policy policy := cp.RouteExport
resources = append(resources, hcl.Resource{ resources = append(resources, hcl.Resource{
Type: "grafana_notification_policy", Type: "grafana_notification_policy",
Name: fmt.Sprintf("notification_policy_%d", idx+1), Name: fmt.Sprintf("notification_policy_%d", idx+1),

View File

@@ -1113,7 +1113,7 @@ func TestProvisioningApi(t *testing.T) {
rc := createTestRequestCtx() rc := createTestRequestCtx()
rc.Context.Req.Header.Add("Accept", "application/json") rc.Context.Req.Header.Add("Accept", "application/json")
expectedResponse := `{"apiVersion":1,"policies":[{"orgId":1,"Policy":{"receiver":"default-receiver","group_by":["g1","g2"],"routes":[{"receiver":"nested-receiver","group_by":["g3","g4"],"matchers":["a=\"b\""],"object_matchers":[["foo","=","bar"]],"mute_time_intervals":["interval"],"continue":true,"group_wait":"5m","group_interval":"5m","repeat_interval":"5m"}],"group_wait":"30s","group_interval":"5m","repeat_interval":"1h"}}]}` expectedResponse := `{"apiVersion":1,"policies":[{"orgId":1,"receiver":"default-receiver","group_by":["g1","g2"],"routes":[{"receiver":"nested-receiver","group_by":["g3","g4"],"matchers":["a=\"b\""],"object_matchers":[["foo","=","bar"]],"mute_time_intervals":["interval"],"continue":true,"group_wait":"5m","group_interval":"5m","repeat_interval":"5m"}],"group_wait":"30s","group_interval":"5m","repeat_interval":"1h"}]}`
response := sut.RouteGetPolicyTreeExport(&rc) response := sut.RouteGetPolicyTreeExport(&rc)

View File

@@ -273,7 +273,7 @@ func AlertingFileExportFromRoute(orgID int64, route definitions.Route) (definiti
APIVersion: 1, APIVersion: 1,
Policies: []definitions.NotificationPolicyExport{{ Policies: []definitions.NotificationPolicyExport{{
OrgID: orgID, OrgID: orgID,
Policy: RouteExportFromRoute(&route), RouteExport: RouteExportFromRoute(&route),
}}, }},
} }
return f, nil return f, nil

View File

@@ -51,7 +51,7 @@ type Policytree struct {
// NotificationPolicyExport is the provisioned file export of alerting.NotificiationPolicyV1. // NotificationPolicyExport is the provisioned file export of alerting.NotificiationPolicyV1.
type NotificationPolicyExport struct { type NotificationPolicyExport struct {
OrgID int64 `json:"orgId" yaml:"orgId"` OrgID int64 `json:"orgId" yaml:"orgId"`
Policy *RouteExport `json:",inline" yaml:",inline"` *RouteExport `yaml:",inline"`
} }
// RouteExport is the provisioned file export of definitions.Route. This is needed to hide fields that aren't useable in // RouteExport is the provisioned file export of definitions.Route. This is needed to hide fields that aren't useable in

View File

@@ -0,0 +1,30 @@
package definitions
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
func TestNotificationPolicyExportMarshal(t *testing.T) {
c := true
npe := &NotificationPolicyExport{
OrgID: 1,
RouteExport: &RouteExport{
Receiver: "receiver",
Continue: &c,
},
}
t.Run("json", func(t *testing.T) {
val, err := json.Marshal(npe)
require.NoError(t, err)
require.Equal(t, "{\"orgId\":1,\"receiver\":\"receiver\",\"continue\":true}", string(val))
})
t.Run("yaml", func(t *testing.T) {
val, err := yaml.Marshal(npe)
require.NoError(t, err)
require.Equal(t, "orgId: 1\nreceiver: receiver\ncontinue: true\n", string(val))
})
}