From 1512afd5215b22c4f2cc9a8fedbb910a7f9ebdcb Mon Sep 17 00:00:00 2001 From: Andrii Chubatiuk Date: Wed, 29 Apr 2026 13:46:54 +0300 Subject: [PATCH] vmalertmanager: fixed ignore templates --- docs/CHANGELOG.md | 1 + .../operator/factory/vmalertmanager/config.go | 2 +- .../factory/vmalertmanager/config_test.go | 42 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ad7460f76..bda67362d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -18,6 +18,7 @@ aliases: * BUGFIX: [converter](https://docs.victoriametrics.com/operator/integrations/prometheus/#objects-conversion): disable all prometheus controllers if CRD group was not found. See [#2838](https://github.com/VictoriaMetrics/helm-charts/issues/2838). * BUGFIX: [vmdistributed](https://docs.victoriametrics.com/operator/resources/vmdistributed/): change default load balancing policy for write requests from `first_available` to `least_loaded`. This should allow to evenly distribute write load across all VMAgents. +* BUGFIX: [vmalertmanager](https://docs.victoriametrics.com/operator/resources/vmalertmanager/): fixed ignored alertmanager template if it has no discovered VMAlertmanagerconfig CRs or tracing config defined. See [#2121](https://github.com/VictoriaMetrics/operator/issues/2121). ## [v0.69.0](https://github.com/VictoriaMetrics/operator/releases/tag/v0.69.0) **Release date:** 22 April 2026 diff --git a/internal/controller/operator/factory/vmalertmanager/config.go b/internal/controller/operator/factory/vmalertmanager/config.go index d20d98694..c8da174c3 100644 --- a/internal/controller/operator/factory/vmalertmanager/config.go +++ b/internal/controller/operator/factory/vmalertmanager/config.go @@ -105,7 +105,7 @@ type parsedObjects struct { } func (pos *parsedObjects) buildConfig(cr *vmv1beta1.VMAlertmanager, data []byte, ac *build.AssetsCache) ([]byte, error) { - if len(pos.configs.All()) == 0 && cr.Spec.TracingConfig == nil { + if len(pos.configs.All()) == 0 && cr.Spec.TracingConfig == nil && len(cr.Spec.Templates) == 0 { return data, nil } var baseCfg amConfig diff --git a/internal/controller/operator/factory/vmalertmanager/config_test.go b/internal/controller/operator/factory/vmalertmanager/config_test.go index 4bf799739..c284e7fce 100644 --- a/internal/controller/operator/factory/vmalertmanager/config_test.go +++ b/internal/controller/operator/factory/vmalertmanager/config_test.go @@ -62,6 +62,48 @@ func TestBuildConfig(t *testing.T) { assert.Equal(t, o.want, string(data)) } + // templates only + f(opts{ + cr: &vmv1beta1.VMAlertmanager{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "default", + }, + Spec: vmv1beta1.VMAlertmanagerSpec{ + EnforcedNamespaceLabel: "alert-namespace", + ConfigNamespaceSelector: &metav1.LabelSelector{}, + Templates: []vmv1beta1.ConfigMapKeyReference{ + {LocalObjectReference: corev1.LocalObjectReference{Name: "test-am"}, Key: "test_1.tmpl"}, + }, + }, + }, + baseCfg: []byte(`global: + time_out: 1min + smtp_smarthost: some:443 +`), + predefinedObjects: []runtime.Object{ + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ca", + Namespace: "default", + }, + Data: map[string][]byte{ + "key": []byte("value"), + }, + }, + }, + want: `global: + smtp_smarthost: some:443 + time_out: 1min +route: + receiver: blackhole +receivers: +- name: blackhole +templates: +- /etc/vm/templates/test-am/test_1.tmpl +`, + }) + // tracing without discovered objects f(opts{ cr: &vmv1beta1.VMAlertmanager{