Alerting: Allow config api receiver create/delete with alertingApiServer (#95207)

Previously all receiver modifications were denied with alertingApiServer
enabled. This allows pure creates and deletes through as these specific
cases can be handled simply and without risk of rbac shenanigans.
This commit is contained in:
Matthew Jacobson
2024-10-22 16:54:05 -04:00
committed by GitHub
parent 4e725f2f74
commit 26162a53e6
2 changed files with 61 additions and 6 deletions
@@ -14,6 +14,7 @@ import (
"testing"
"github.com/grafana/alerting/notify"
"github.com/prometheus/alertmanager/config"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/api/errors"
@@ -1127,14 +1128,65 @@ func TestIntegrationRejectConfigApiReceiverModification(t *testing.T) {
cliCfg := helper.Org1.Admin.NewRestConfig()
legacyCli := alerting.NewAlertingLegacyAPIClient(helper.GetEnv().Server.HTTPServer.Listener.Addr().String(), cliCfg.Username, cliCfg.Password)
// This config has new and modified receivers.
adminK8sClient, err := versioned.NewForConfig(cliCfg)
require.NoError(t, err)
adminClient := adminK8sClient.NotificationsV0alpha1().Receivers("default")
alertmanagerRaw, err := testData.ReadFile(path.Join("test-data", "notification-settings.json"))
require.NoError(t, err)
var amConfig definitions.PostableUserConfig
require.NoError(t, json.Unmarshal(alertmanagerRaw, &amConfig))
persistInitialConfig(t, amConfig, adminClient, legacyCli)
// We modify the receiver, this should cause the POST to be rejected.
userDefinedReceiver := amConfig.AlertmanagerConfig.Receivers[slices.IndexFunc(amConfig.AlertmanagerConfig.Receivers, func(receiver *definitions.PostableApiReceiver) bool {
return receiver.Receiver.Name == "user-defined"
})]
userDefinedReceiver.GrafanaManagedReceivers[0].DisableResolveMessage = !userDefinedReceiver.GrafanaManagedReceivers[0].DisableResolveMessage
success, err := legacyCli.PostConfiguration(t, amConfig)
require.Falsef(t, success, "Expected receiver modification to be rejected, but got %s", err)
require.Falsef(t, success, "Expected receiver modification to be rejected, but got %t", success)
require.ErrorContainsf(t, err, "alertingApiServer", "Expected error message to contain 'alertingApiServer', but got %s", err)
// Revert the change.
userDefinedReceiver.GrafanaManagedReceivers[0].DisableResolveMessage = !userDefinedReceiver.GrafanaManagedReceivers[0].DisableResolveMessage
// We add a receiver, this should be accepted.
amConfig.AlertmanagerConfig.Receivers = append(amConfig.AlertmanagerConfig.Receivers, &definitions.PostableApiReceiver{
Receiver: config.Receiver{
Name: "new receiver",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
Name: "new receiver",
Type: "email",
Settings: []byte(`{"addresses": "<some@email.com>"}`),
},
},
},
})
success, err = legacyCli.PostConfiguration(t, amConfig)
require.Truef(t, success, "Expected receiver modification to be accepted, but got %s", err)
require.NoError(t, err)
// Sanity check.
gettable, status, body := legacyCli.GetAlertmanagerConfigWithStatus(t)
require.Equalf(t, http.StatusOK, status, body)
require.Lenf(t, gettable.AlertmanagerConfig.Receivers, 3, "Expected 3 receivers, got %d", len(gettable.AlertmanagerConfig.Receivers))
// We remove the receiver, this should be accepted.
amConfig.AlertmanagerConfig.Receivers = slices.DeleteFunc(amConfig.AlertmanagerConfig.Receivers, func(receiver *definitions.PostableApiReceiver) bool {
return receiver.GrafanaManagedReceivers[0].Name == "new receiver"
})
success, err = legacyCli.PostConfiguration(t, amConfig)
require.Truef(t, success, "Expected receiver modification to be accepted, but got %s", err)
require.NoError(t, err)
// Sanity check.
gettable, status, body = legacyCli.GetAlertmanagerConfigWithStatus(t)
require.Equalf(t, http.StatusOK, status, body)
require.Lenf(t, gettable.AlertmanagerConfig.Receivers, 2, "Expected 2 receivers, got %d", len(gettable.AlertmanagerConfig.Receivers))
}
func TestIntegrationReferentialIntegrity(t *testing.T) {