From 6ec97a60bd97bd2eced783d9cc619d90a80c1fdb Mon Sep 17 00:00:00 2001 From: Jayapriya Pai Date: Mon, 19 Jan 2026 14:45:59 +0530 Subject: [PATCH] alertmanager: add webhookURL secret validation to checkMSTeamsConfigs (#8294) Validate that the webhookURL secret exists in checkMSTeamsConfigs, consistent with checkMSTeamsV2Configs. This prevents operator degradation when an AlertmanagerConfig references a missing secret. Signed-off-by: Jayapriya Pai --- pkg/alertmanager/operator.go | 4 ++ pkg/alertmanager/operator_test.go | 75 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go index 18095aee9..e914f8ba5 100644 --- a/pkg/alertmanager/operator.go +++ b/pkg/alertmanager/operator.go @@ -1682,6 +1682,10 @@ func checkMSTeamsConfigs( return err } + if _, err := store.GetSecretKey(ctx, namespace, config.WebhookURL); err != nil { + return err + } + if err := configureHTTPConfigInStore(ctx, config.HTTPConfig, namespace, store); err != nil { return err } diff --git a/pkg/alertmanager/operator_test.go b/pkg/alertmanager/operator_test.go index 091791c72..893e23074 100644 --- a/pkg/alertmanager/operator_test.go +++ b/pkg/alertmanager/operator_test.go @@ -1141,6 +1141,81 @@ func TestCheckAlertmanagerConfig(t *testing.T) { }, ok: false, }, + { + amConfig: &monitoringv1alpha1.AlertmanagerConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "msteams-with-missing-webhook-url-secret", + Namespace: "ns1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "recv1", + }, + Receivers: []monitoringv1alpha1.Receiver{{ + Name: "recv1", + MSTeamsConfigs: []monitoringv1alpha1.MSTeamsConfig{ + { + WebhookURL: v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{Name: "not-existing-secret"}, + Key: "url", + }, + }, + }, + }}, + }, + }, + ok: false, + }, + { + amConfig: &monitoringv1alpha1.AlertmanagerConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "msteams-with-missing-webhook-url-key", + Namespace: "ns1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "recv1", + }, + Receivers: []monitoringv1alpha1.Receiver{{ + Name: "recv1", + MSTeamsConfigs: []monitoringv1alpha1.MSTeamsConfig{ + { + WebhookURL: v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{Name: "secret"}, + Key: "not-existing", + }, + }, + }, + }}, + }, + }, + ok: false, + }, + { + amConfig: &monitoringv1alpha1.AlertmanagerConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "msteams-with-valid-webhook-url-secret", + Namespace: "ns1", + }, + Spec: monitoringv1alpha1.AlertmanagerConfigSpec{ + Route: &monitoringv1alpha1.Route{ + Receiver: "recv1", + }, + Receivers: []monitoringv1alpha1.Receiver{{ + Name: "recv1", + MSTeamsConfigs: []monitoringv1alpha1.MSTeamsConfig{ + { + WebhookURL: v1.SecretKeySelector{ + LocalObjectReference: v1.LocalObjectReference{Name: "secret"}, + Key: "key1", + }, + }, + }, + }}, + }, + }, + ok: true, + }, } { t.Run(tc.amConfig.Name, func(t *testing.T) { store := assets.NewStoreBuilder(c.CoreV1(), c.CoreV1())