Alerting: Fix config api POST provenance guard (#93244)

* Add failing tests

* Fix bug in provenance guard on renaming receivers or moving integrations

* Linting
This commit is contained in:
Matthew Jacobson
2024-09-13 12:42:33 -04:00
committed by GitHub
parent a5c122af78
commit bd9fc8127b
2 changed files with 345 additions and 54 deletions
@@ -10,7 +10,6 @@ import (
"github.com/prometheus/common/model"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
"github.com/grafana/grafana/pkg/services/ngalert/models"
)
@@ -308,10 +307,45 @@ func TestCheckContactPoints(t *testing.T) {
}(),
},
},
{
name: "editing name of a provisioned receiver should fail",
shouldErr: true,
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-1")
receiver.Name = "updated name"
return receiver
}(),
},
},
{
name: "Moving provisioned integration to different receiver should fail",
shouldErr: true,
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
func() *definitions.PostableApiReceiver { // Move integration from test-1 to test-2
receiver := defaultPostableReceiver(t, "test-1")
receiver.GrafanaManagedReceivers = []*definitions.PostableGrafanaReceiver{}
return receiver
}(),
func() *definitions.PostableApiReceiver {
receiver2 := defaultPostableReceiver(t, "test-2")
integration1 := defaultPostableReceiver(t, "test-1").GrafanaManagedReceivers[0]
receiver2.GrafanaManagedReceivers = append(receiver2.GrafanaManagedReceivers, integration1)
return receiver2
}(),
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := checkContactPoints(&logtest.Fake{}, test.currentConfig, test.newConfig)
err := checkContactPoints(test.currentConfig, test.newConfig)
if test.shouldErr {
require.Error(t, err)
} else {
@@ -321,14 +355,131 @@ func TestCheckContactPoints(t *testing.T) {
}
}
func TestReceiversDelta(t *testing.T) {
tests := []struct {
name string
currentConfig []*definitions.GettableApiReceiver
newConfig []*definitions.PostableApiReceiver
expectedDelta ReceiversDelta
}{
{
name: "no changes",
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
defaultPostableReceiver(t, "test-1"),
defaultPostableReceiver(t, "test-2"),
},
expectedDelta: ReceiversDelta{},
},
{
name: "create one",
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
defaultPostableReceiver(t, "test-1"),
defaultPostableReceiver(t, "test-2"),
},
expectedDelta: ReceiversDelta{
Created: []*definitions.PostableApiReceiver{
defaultPostableReceiver(t, "test-2"),
},
},
},
{
name: "delete one",
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
defaultPostableReceiver(t, "test-1"),
},
expectedDelta: ReceiversDelta{
Deleted: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
},
},
},
{
name: "update some",
currentConfig: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-3", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-4", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-5", models.ProvenanceAPI),
},
newConfig: []*definitions.PostableApiReceiver{
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-1")
receiver.GrafanaManagedReceivers[0].Settings = definitions.RawMessage(`{ "hello": "data", "data": { "test": "test"}}`)
return receiver
}(),
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-2")
receiver.Name = "updated name"
return receiver
}(),
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-3")
receiver.GrafanaManagedReceivers[0].DisableResolveMessage = !receiver.GrafanaManagedReceivers[0].DisableResolveMessage
return receiver
}(),
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-4")
receiver.GrafanaManagedReceivers[0].Name = "updated name"
return receiver
}(),
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-5")
receiver.GrafanaManagedReceivers = append(receiver.GrafanaManagedReceivers, defaultPostableReceiver(t, "test-1").GrafanaManagedReceivers[0])
return receiver
}(),
},
expectedDelta: ReceiversDelta{
Updated: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-1", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-3", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-4", models.ProvenanceAPI),
defaultGettableReceiver(t, "test-5", models.ProvenanceAPI),
},
Created: []*definitions.PostableApiReceiver{
func() *definitions.PostableApiReceiver {
receiver := defaultPostableReceiver(t, "test-2")
receiver.Name = "updated name"
return receiver
}(),
},
Deleted: []*definitions.GettableApiReceiver{
defaultGettableReceiver(t, "test-2", models.ProvenanceAPI),
},
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
delta, err := calculateReceiversDelta(test.currentConfig, test.newConfig)
require.NoError(t, err)
require.Equalf(t, test.expectedDelta, delta, "unexpected delta: %q, expected: %q", delta.String(), test.expectedDelta.String())
})
}
}
func defaultGettableReceiver(t *testing.T, uid string, provenance models.Provenance) *definitions.GettableApiReceiver {
t.Helper()
return &definitions.GettableApiReceiver{
Receiver: amConfig.Receiver{
Name: uid,
},
GettableGrafanaReceivers: definitions.GettableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.GettableGrafanaReceiver{
{
UID: "123",
Name: "yeah",
UID: uid,
Name: uid,
Type: "slack",
DisableResolveMessage: true,
Provenance: definitions.Provenance(provenance),
@@ -348,11 +499,14 @@ func defaultGettableReceiver(t *testing.T, uid string, provenance models.Provena
func defaultPostableReceiver(t *testing.T, uid string) *definitions.PostableApiReceiver {
t.Helper()
return &definitions.PostableApiReceiver{
Receiver: amConfig.Receiver{
Name: uid,
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "123",
Name: "yeah",
UID: uid,
Name: uid,
Type: "slack",
DisableResolveMessage: true,
Settings: definitions.RawMessage(`{