From fd7d888cf12d6475a9135044c21d7f64bc4b74cf Mon Sep 17 00:00:00 2001 From: mfeix Date: Fri, 6 Mar 2026 10:59:52 +0100 Subject: [PATCH 1/3] feat(helm): add configurable job history limits for heartbeat cronjob Problem The heartbeat CronJob had successfulJobsHistoryLimit hardcoded to 0 and failedJobsHistoryLimit was not set at all. This prevented users from retaining job history for debugging and monitoring purposes. Solution Add successfulJobsHistoryLimit and failedJobsHistoryLimit as configurable values under the heartbeat section in values.yaml. The template now uses these values with sensible defaults (0 for successful, 1 for failed). Validation - Verified the Helm template renders correctly with default values - Verified custom values can be passed via --set heartbeat.successfulJobsHistoryLimit=X Signed-off-by: mfeix --- charts/linkerd-control-plane/templates/heartbeat.yaml | 3 ++- charts/linkerd-control-plane/values.yaml | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/charts/linkerd-control-plane/templates/heartbeat.yaml b/charts/linkerd-control-plane/templates/heartbeat.yaml index 1f42493849406..f0fa5cc7e57ec 100644 --- a/charts/linkerd-control-plane/templates/heartbeat.yaml +++ b/charts/linkerd-control-plane/templates/heartbeat.yaml @@ -24,7 +24,8 @@ spec: {{ else -}} schedule: "{{ dateInZone "04 15 * * *" (now | mustDateModify "+10m") "UTC"}}" {{ end -}} - successfulJobsHistoryLimit: 0 + successfulJobsHistoryLimit: {{ .Values.heartbeat.successfulJobsHistoryLimit | default 0 }} + failedJobsHistoryLimit: {{ .Values.heartbeat.failedJobsHistoryLimit | default 1 }} jobTemplate: spec: template: diff --git a/charts/linkerd-control-plane/values.yaml b/charts/linkerd-control-plane/values.yaml index 0735571633230..83be5e1d28660 100644 --- a/charts/linkerd-control-plane/values.yaml +++ b/charts/linkerd-control-plane/values.yaml @@ -509,6 +509,11 @@ identity: disableHeartBeat: false # -- Config for the heartbeat cronjob # heartbeatSchedule: "0 0 * * *" +heartbeat: + # -- Number of successful job runs to retain + successfulJobsHistoryLimit: 0 + # -- Number of failed job runs to retain + failedJobsHistoryLimit: 1 # proxy injector configuration proxyInjector: From d6bf5bbe1a85a99bbbd29d40ebfb8ea5850ddfac Mon Sep 17 00:00:00 2001 From: mfeix Date: Sat, 21 Mar 2026 23:00:20 +0100 Subject: [PATCH 2/3] fix(helm): make heartbeat job history limits nil-safe and update golden files Fix template to handle nil .Values.heartbeat by using parenthesized access pattern. Regenerate test golden files to include the new failedJobsHistoryLimit field. Signed-off-by: mfeix --- charts/linkerd-control-plane/templates/heartbeat.yaml | 4 ++-- cli/cmd/testdata/install_controlplane_tracing_output.golden | 5 ++++- cli/cmd/testdata/install_custom_domain.golden | 5 ++++- cli/cmd/testdata/install_custom_registry.golden | 5 ++++- cli/cmd/testdata/install_default.golden | 5 ++++- .../testdata/install_default_override_dst_get_nets.golden | 5 ++++- cli/cmd/testdata/install_default_token.golden | 5 ++++- cli/cmd/testdata/install_gid_output.golden | 5 ++++- cli/cmd/testdata/install_ha_output.golden | 5 ++++- cli/cmd/testdata/install_ha_with_overrides_output.golden | 5 ++++- cli/cmd/testdata/install_heartbeat_disabled_output.golden | 4 +++- cli/cmd/testdata/install_helm_control_plane_output.golden | 5 ++++- cli/cmd/testdata/install_helm_control_plane_output_ha.golden | 5 ++++- .../install_helm_control_plane_output_ha_with_gid.golden | 5 ++++- cli/cmd/testdata/install_helm_output_ha_labels.golden | 5 ++++- .../install_helm_output_ha_namespace_selector.golden | 5 ++++- cli/cmd/testdata/install_no_init_container.golden | 5 ++++- cli/cmd/testdata/install_output.golden | 3 ++- cli/cmd/testdata/install_proxy_ignores.golden | 5 ++++- cli/cmd/testdata/install_tracing.golden | 5 ++++- cli/cmd/testdata/install_values_file.golden | 5 ++++- 21 files changed, 79 insertions(+), 22 deletions(-) diff --git a/charts/linkerd-control-plane/templates/heartbeat.yaml b/charts/linkerd-control-plane/templates/heartbeat.yaml index f0fa5cc7e57ec..f9a26d3aef104 100644 --- a/charts/linkerd-control-plane/templates/heartbeat.yaml +++ b/charts/linkerd-control-plane/templates/heartbeat.yaml @@ -24,8 +24,8 @@ spec: {{ else -}} schedule: "{{ dateInZone "04 15 * * *" (now | mustDateModify "+10m") "UTC"}}" {{ end -}} - successfulJobsHistoryLimit: {{ .Values.heartbeat.successfulJobsHistoryLimit | default 0 }} - failedJobsHistoryLimit: {{ .Values.heartbeat.failedJobsHistoryLimit | default 1 }} + successfulJobsHistoryLimit: {{ (.Values.heartbeat).successfulJobsHistoryLimit | default 0 }} + failedJobsHistoryLimit: {{ (.Values.heartbeat).failedJobsHistoryLimit | default 1 }} jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_controlplane_tracing_output.golden b/cli/cmd/testdata/install_controlplane_tracing_output.golden index f0e3131c0dc62..e217e99481111 100644 --- a/cli/cmd/testdata/install_controlplane_tracing_output.golden +++ b/cli/cmd/testdata/install_controlplane_tracing_output.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1830,6 +1832,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_custom_domain.golden b/cli/cmd/testdata/install_custom_domain.golden index f1d6be18ae7df..26ac4859fdc6c 100644 --- a/cli/cmd/testdata/install_custom_domain.golden +++ b/cli/cmd/testdata/install_custom_domain.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_custom_registry.golden b/cli/cmd/testdata/install_custom_registry.golden index 5f5c40fa7ef46..1f8bbe026d574 100644 --- a/cli/cmd/testdata/install_custom_registry.golden +++ b/cli/cmd/testdata/install_custom_registry.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_default.golden b/cli/cmd/testdata/install_default.golden index f1d6be18ae7df..26ac4859fdc6c 100644 --- a/cli/cmd/testdata/install_default.golden +++ b/cli/cmd/testdata/install_default.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_default_override_dst_get_nets.golden b/cli/cmd/testdata/install_default_override_dst_get_nets.golden index 21419b00c9002..4d943c59a5924 100644 --- a/cli/cmd/testdata/install_default_override_dst_get_nets.golden +++ b/cli/cmd/testdata/install_default_override_dst_get_nets.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_default_token.golden b/cli/cmd/testdata/install_default_token.golden index 42ddb15267e5a..77165fb0fb6fb 100644 --- a/cli/cmd/testdata/install_default_token.golden +++ b/cli/cmd/testdata/install_default_token.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1808,6 +1810,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_gid_output.golden b/cli/cmd/testdata/install_gid_output.golden index 6ea93a5e20926..80b181c11f337 100755 --- a/cli/cmd/testdata/install_gid_output.golden +++ b/cli/cmd/testdata/install_gid_output.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1836,6 +1838,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_ha_output.golden b/cli/cmd/testdata/install_ha_output.golden index 99dcba3ea2e94..9af8a8de5c39a 100644 --- a/cli/cmd/testdata/install_ha_output.golden +++ b/cli/cmd/testdata/install_ha_output.golden @@ -564,7 +564,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1966,6 +1968,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_ha_with_overrides_output.golden b/cli/cmd/testdata/install_ha_with_overrides_output.golden index b1f5407b24b61..d94bef5b4dfcd 100644 --- a/cli/cmd/testdata/install_ha_with_overrides_output.golden +++ b/cli/cmd/testdata/install_ha_with_overrides_output.golden @@ -564,7 +564,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1966,6 +1968,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_heartbeat_disabled_output.golden b/cli/cmd/testdata/install_heartbeat_disabled_output.golden index 42344f4bf6d31..82179e26f8782 100644 --- a/cli/cmd/testdata/install_heartbeat_disabled_output.golden +++ b/cli/cmd/testdata/install_heartbeat_disabled_output.golden @@ -486,7 +486,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false diff --git a/cli/cmd/testdata/install_helm_control_plane_output.golden b/cli/cmd/testdata/install_helm_control_plane_output.golden index 384b4dc8ceb1d..f4be4a460d787 100644 --- a/cli/cmd/testdata/install_helm_control_plane_output.golden +++ b/cli/cmd/testdata/install_helm_control_plane_output.golden @@ -556,7 +556,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1803,6 +1805,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_helm_control_plane_output_ha.golden b/cli/cmd/testdata/install_helm_control_plane_output_ha.golden index 6d85137673d52..6f38fa451d0b5 100644 --- a/cli/cmd/testdata/install_helm_control_plane_output_ha.golden +++ b/cli/cmd/testdata/install_helm_control_plane_output_ha.golden @@ -565,7 +565,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1943,6 +1945,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_helm_control_plane_output_ha_with_gid.golden b/cli/cmd/testdata/install_helm_control_plane_output_ha_with_gid.golden index b8d04948de559..8745225536411 100755 --- a/cli/cmd/testdata/install_helm_control_plane_output_ha_with_gid.golden +++ b/cli/cmd/testdata/install_helm_control_plane_output_ha_with_gid.golden @@ -565,7 +565,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1953,6 +1955,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_helm_output_ha_labels.golden b/cli/cmd/testdata/install_helm_output_ha_labels.golden index 24c6e7a0f9b76..fb4f0cc9954a3 100644 --- a/cli/cmd/testdata/install_helm_output_ha_labels.golden +++ b/cli/cmd/testdata/install_helm_output_ha_labels.golden @@ -565,7 +565,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1955,6 +1957,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_helm_output_ha_namespace_selector.golden b/cli/cmd/testdata/install_helm_output_ha_namespace_selector.golden index b1ed1264ac44f..e4b0562e31322 100644 --- a/cli/cmd/testdata/install_helm_output_ha_namespace_selector.golden +++ b/cli/cmd/testdata/install_helm_output_ha_namespace_selector.golden @@ -560,7 +560,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: true enablePodDisruptionBudget: true - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: cpu: limit: "" @@ -1933,6 +1935,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_no_init_container.golden b/cli/cmd/testdata/install_no_init_container.golden index b6b4a3dc5d39d..80304b628b4a0 100644 --- a/cli/cmd/testdata/install_no_init_container.golden +++ b/cli/cmd/testdata/install_no_init_container.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1802,6 +1804,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_output.golden b/cli/cmd/testdata/install_output.golden index de0e9be4d2a5e..a7f8a2ad3eae7 100644 --- a/cli/cmd/testdata/install_output.golden +++ b/cli/cmd/testdata/install_output.golden @@ -1760,6 +1760,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: @@ -2188,7 +2189,7 @@ spec: --- apiVersion: v1 data: - linkerd-config-overrides: Y2xpVmVyc2lvbjogQ2xpVmVyc2lvbgpjbHVzdGVyTmV0d29ya3M6IENsdXN0ZXJOZXR3b3Jrcwpjb250cm9sbGVyR0lEOiAyMTAzCmNvbnRyb2xsZXJJbWFnZTogQ29udHJvbGxlckltYWdlCmNvbnRyb2xsZXJMb2dGb3JtYXQ6IENvbnRyb2xsZXJMb2dGb3JtYXQKY29udHJvbGxlckxvZ0xldmVsOiBDb250cm9sbGVyTG9nTGV2ZWwKZGVidWdDb250YWluZXI6CiAgaW1hZ2U6CiAgICBuYW1lOiBEZWJ1Z0ltYWdlTmFtZQogICAgcHVsbFBvbGljeTogRGVidWdJbWFnZVB1bGxQb2xpY3kKICAgIHZlcnNpb246IERlYnVnVmVyc2lvbgpkaXNhYmxlSVB2NjogZmFsc2UKZW5hYmxlRW5kcG9pbnRTbGljZXM6IGZhbHNlCmhlYXJ0YmVhdFNjaGVkdWxlOiAxIDIgMyA0IDUKaWRlbnRpdHk6CiAgaXNzdWVyOgogICAgdGxzOgogICAgICBjcnRQRU06IHwKICAgICAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgICAgICBNSUlCd0RDQ0FXZWdBd0lCQWdJUkFKUklnWjhSdE84RXdnMVhlcGY4VDQ0d0NnWUlLb1pJemowRUF3SXdLVEVuCiAgICAgICAgTUNVR0ExVUVBeE1lYVdSbGJuUnBkSGt1YkdsdWEyVnlaQzVqYkhWemRHVnlMbXh2WTJGc01CNFhEVEl3TURneQogICAgICAgIE9EQTNNVE0wTjFvWERUTXdNRGd5TmpBM01UTTBOMW93S1RFbk1DVUdBMVVFQXhNZWFXUmxiblJwZEhrdWJHbHUKICAgICAgICBhMlZ5WkM1amJIVnpkR1Z5TG14dlkyRnNNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxL0ZwCiAgICAgICAgZmNSbkRjZWRMNkFqVWFYWVB2NERJTUJhSnVmT0k1Tld0eStYU1g3SmpYZ1p0TTcyZFF2UmFZYW51eEQzNkR0MQogICAgICAgIDIvSnh5aVNneEtXUmRvYXkrYU53TUc0d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUIKICAgICAgICBBZjhDQVFBd0hRWURWUjBPQkJZRUZJMVducnFNWUthSEhPbyt6cHlpaURxMnBPMEtNQ2tHQTFVZEVRUWlNQ0NDCiAgICAgICAgSG1sa1pXNTBhWFI1TG14cGJtdGxjbVF1WTJ4MWMzUmxjaTVzYjJOaGJEQUtCZ2dxaGtqT1BRUURBZ05IQURCRQogICAgICAgIEFpQXR1b0k1WHVDdHJHVlJ6U21SVGwycmEyOGFWOU15VFU3ZDVxblRBRkhLU2dJZ1JLQ3ZsdU9TZ0E1TzIxcDUKICAgICAgICA1MXRkcm1rSEVaUnIwcWxMU0pkSFlnRWZNems9CiAgICAgICAgLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQogICAgICBrZXlQRU06IHwKICAgICAgICAtLS0tLUJFR0lOIEVDIFBSSVZBVEUgS0VZLS0tLS0KICAgICAgICBNSGNDQVFFRUlBQWU4bmZielp1OWMvT0IyKzh4Sk0wRno3TlV3VFFhenVsa0ZOczRUSTUrb0FvR0NDcUdTTTQ5CiAgICAgICAgQXdFSG9VUURRZ0FFMS9GcGZjUm5EY2VkTDZBalVhWFlQdjRESU1CYUp1Zk9JNU5XdHkrWFNYN0pqWGdadE03MgogICAgICAgIGRRdlJhWWFudXhEMzZEdDEyL0p4eWlTZ3hLV1Jkb2F5K1E9PQogICAgICAgIC0tLS0tRU5EIEVDIFBSSVZBVEUgS0VZLS0tLS0KaWRlbnRpdHlUcnVzdEFuY2hvcnNQRU06IHwKICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICBNSUlCd1RDQ0FXYWdBd0lCQWdJUWVEWnA1bERhSXlnUTVVZk1LWnJGQVRBS0JnZ3Foa2pPUFFRREFqQXBNU2N3CiAgSlFZRFZRUURFeDVwWkdWdWRHbDBlUzVzYVc1clpYSmtMbU5zZFhOMFpYSXViRzlqWVd3d0hoY05NakF3T0RJNAogIE1EY3hNalEzV2hjTk16QXdPREkyTURjeE1qUTNXakFwTVNjd0pRWURWUVFERXg1cFpHVnVkR2wwZVM1c2FXNXIKICBaWEprTG1Oc2RYTjBaWEl1Ykc5allXd3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBUnFjNzBaCiAgbDF2Z3c3OXJqQjV1U0lUSUNVQTZHeWZ2U0ZmY3VJaXM3Qi9YRlNra3dBSFU1Uy9zMUFBUCtSMFRYN0hCV1VDNAogIHVhRzRXV3Npd0pLTm43bWdvM0F3YmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIKICAvd0lCQVRBZEJnTlZIUTRFRmdRVTVZdGpWVlBmZDdJN05MSHNuMkMyNkVCeUdWMHdLUVlEVlIwUkJDSXdJSUllCiAgYVdSbGJuUnBkSGt1YkdsdWEyVnlaQzVqYkhWemRHVnlMbXh2WTJGc01Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQwogIElRQ043bEJGTEREdmp4NlYwK1hranBLRVJSc0pZZjVhZE12bmxvRmw0OGlsSmdJaEFOdHhobmRjcitRSlB1QzgKICB2Z1VDMGQyLzlGTXVlSVZNYis0NldUQ09qc3FyCiAgLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQppbWFnZVB1bGxQb2xpY3k6IEltYWdlUHVsbFBvbGljeQppbWFnZVB1bGxTZWNyZXRzOiBudWxsCmxpbmtlcmRWZXJzaW9uOiBMaW5rZXJkVmVyc2lvbgpuZXR3b3JrVmFsaWRhdG9yOgogIGNvbm5lY3RBZGRyOiAxLjEuMS4xOjIwMDAxCiAgbGlzdGVuQWRkcjogJ1s6Ol06NDE0MCcKICBzZWN1cml0eUNvbnRleHQ6IG51bGwKcG9kTW9uaXRvcjogbnVsbApwb2xpY3lDb250cm9sbGVyOgogIGxvZ0xldmVsOiBsb2ctbGV2ZWwKICByZXNvdXJjZXM6CiAgICBjcHU6CiAgICAgIGxpbWl0OiBjcHUtbGltaXQKICAgICAgcmVxdWVzdDogY3B1LXJlcXVlc3QKICAgIG1lbW9yeToKICAgICAgbGltaXQ6IG1lbW9yeS1saW1pdAogICAgICByZXF1ZXN0OiBtZW1vcnktcmVxdWVzdApwb2xpY3lWYWxpZGF0b3I6CiAgY2FCdW5kbGU6IHBvbGljeSB2YWxpZGF0b3IgQ0EgYnVuZGxlCiAgZXh0ZXJuYWxTZWNyZXQ6IHRydWUKcHJpb3JpdHlDbGFzc05hbWU6IFByaW9yaXR5Q2xhc3NOYW1lCnByb2ZpbGVWYWxpZGF0b3I6CiAgY2FCdW5kbGU6IHByb2ZpbGUgdmFsaWRhdG9yIENBIGJ1bmRsZQogIGV4dGVybmFsU2VjcmV0OiB0cnVlCnByb3h5OgogIGNvbnRyb2w6IG51bGwKICBkZWZhdWx0SW5ib3VuZFBvbGljeTogZGVmYXVsdC1hbGxvdy1wb2xpY3kKICBnaWQ6IDIxMDIKICBpbWFnZToKICAgIG5hbWU6IFByb3h5SW1hZ2VOYW1lCiAgICBwdWxsUG9saWN5OiBJbWFnZVB1bGxQb2xpY3kKICAgIHZlcnNpb246IFByb3h5VmVyc2lvbgogIGluYm91bmRDb25uZWN0VGltZW91dDogIiIKICBpbmJvdW5kRGlzY292ZXJ5Q2FjaGVVbnVzZWRUaW1lb3V0OiAiIgogIGxvZ0xldmVsOiB3YXJuLGxpbmtlcmQ9aW5mbwogIG9wYXF1ZVBvcnRzOiAyNSw0NDMsNTg3LDMzMDYsNTQzMiwxMTIxMQogIG91dGJvdW5kQ29ubmVjdFRpbWVvdXQ6ICIiCiAgb3V0Ym91bmREaXNjb3ZlcnlDYWNoZVVudXNlZFRpbWVvdXQ6ICIiCiAgb3V0Ym91bmRUcmFuc3BvcnRNb2RlOiAiIgogIHJlc291cmNlczoKICAgIGNwdToKICAgICAgbGltaXQ6IGNwdS1saW1pdAogICAgICByZXF1ZXN0OiBjcHUtcmVxdWVzdAogICAgbWVtb3J5OgogICAgICBsaW1pdDogbWVtb3J5LWxpbWl0CiAgICAgIHJlcXVlc3Q6IG1lbW9yeS1yZXF1ZXN0CiAgc2VjdXJpdHlDb250ZXh0OiBudWxsCiAgc3RhcnR1cFByb2JlOiBudWxsCnByb3h5Q29udGFpbmVyTmFtZTogUHJveHlDb250YWluZXJOYW1lCnByb3h5SW5pdDoKICBpZ25vcmVJbmJvdW5kUG9ydHM6ICIiCiAgaWdub3JlT3V0Ym91bmRQb3J0czogIjQ0MyIKICBpcHRhYmxlc01vZGU6IGxlZ2FjeQogIGt1YmVBUElTZXJ2ZXJQb3J0czogIiIKcHJveHlJbmplY3RvcjoKICBjYUJ1bmRsZTogcHJveHkgaW5qZWN0b3IgQ0EgYnVuZGxlCiAgZXh0ZXJuYWxTZWNyZXQ6IHRydWUKc3BWYWxpZGF0b3I6IG51bGwKd2ViaG9va0ZhaWx1cmVQb2xpY3k6IFdlYmhvb2tGYWlsdXJlUG9saWN5Cg== + linkerd-config-overrides: Y2xpVmVyc2lvbjogQ2xpVmVyc2lvbgpjbHVzdGVyTmV0d29ya3M6IENsdXN0ZXJOZXR3b3Jrcwpjb250cm9sbGVyR0lEOiAyMTAzCmNvbnRyb2xsZXJJbWFnZTogQ29udHJvbGxlckltYWdlCmNvbnRyb2xsZXJMb2dGb3JtYXQ6IENvbnRyb2xsZXJMb2dGb3JtYXQKY29udHJvbGxlckxvZ0xldmVsOiBDb250cm9sbGVyTG9nTGV2ZWwKZGVidWdDb250YWluZXI6CiAgaW1hZ2U6CiAgICBuYW1lOiBEZWJ1Z0ltYWdlTmFtZQogICAgcHVsbFBvbGljeTogRGVidWdJbWFnZVB1bGxQb2xpY3kKICAgIHZlcnNpb246IERlYnVnVmVyc2lvbgpkaXNhYmxlSVB2NjogZmFsc2UKZW5hYmxlRW5kcG9pbnRTbGljZXM6IGZhbHNlCmhlYXJ0YmVhdDogbnVsbApoZWFydGJlYXRTY2hlZHVsZTogMSAyIDMgNCA1CmlkZW50aXR5OgogIGlzc3VlcjoKICAgIHRsczoKICAgICAgY3J0UEVNOiB8CiAgICAgICAgLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICAgICAgTUlJQndEQ0NBV2VnQXdJQkFnSVJBSlJJZ1o4UnRPOEV3ZzFYZXBmOFQ0NHdDZ1lJS29aSXpqMEVBd0l3S1RFbgogICAgICAgIE1DVUdBMVVFQXhNZWFXUmxiblJwZEhrdWJHbHVhMlZ5WkM1amJIVnpkR1Z5TG14dlkyRnNNQjRYRFRJd01EZ3kKICAgICAgICBPREEzTVRNME4xb1hEVE13TURneU5qQTNNVE0wTjFvd0tURW5NQ1VHQTFVRUF4TWVhV1JsYm5ScGRIa3ViR2x1CiAgICAgICAgYTJWeVpDNWpiSFZ6ZEdWeUxteHZZMkZzTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMS9GcAogICAgICAgIGZjUm5EY2VkTDZBalVhWFlQdjRESU1CYUp1Zk9JNU5XdHkrWFNYN0pqWGdadE03MmRRdlJhWWFudXhEMzZEdDEKICAgICAgICAyL0p4eWlTZ3hLV1Jkb2F5K2FOd01HNHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCCiAgICAgICAgQWY4Q0FRQXdIUVlEVlIwT0JCWUVGSTFXbnJxTVlLYUhIT28renB5aWlEcTJwTzBLTUNrR0ExVWRFUVFpTUNDQwogICAgICAgIEhtbGtaVzUwYVhSNUxteHBibXRsY21RdVkyeDFjM1JsY2k1c2IyTmhiREFLQmdncWhrak9QUVFEQWdOSEFEQkUKICAgICAgICBBaUF0dW9JNVh1Q3RyR1ZSelNtUlRsMnJhMjhhVjlNeVRVN2Q1cW5UQUZIS1NnSWdSS0N2bHVPU2dBNU8yMXA1CiAgICAgICAgNTF0ZHJta0hFWlJyMHFsTFNKZEhZZ0VmTXprPQogICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgICAga2V5UEVNOiB8CiAgICAgICAgLS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCiAgICAgICAgTUhjQ0FRRUVJQUFlOG5mYnpadTljL09CMis4eEpNMEZ6N05Vd1RRYXp1bGtGTnM0VEk1K29Bb0dDQ3FHU000OQogICAgICAgIEF3RUhvVVFEUWdBRTEvRnBmY1JuRGNlZEw2QWpVYVhZUHY0RElNQmFKdWZPSTVOV3R5K1hTWDdKalhnWnRNNzIKICAgICAgICBkUXZSYVlhbnV4RDM2RHQxMi9KeHlpU2d4S1dSZG9heStRPT0KICAgICAgICAtLS0tLUVORCBFQyBQUklWQVRFIEtFWS0tLS0tCmlkZW50aXR5VHJ1c3RBbmNob3JzUEVNOiB8CiAgLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgTUlJQndUQ0NBV2FnQXdJQkFnSVFlRFpwNWxEYUl5Z1E1VWZNS1pyRkFUQUtCZ2dxaGtqT1BRUURBakFwTVNjdwogIEpRWURWUVFERXg1cFpHVnVkR2wwZVM1c2FXNXJaWEprTG1Oc2RYTjBaWEl1Ykc5allXd3dIaGNOTWpBd09ESTQKICBNRGN4TWpRM1doY05NekF3T0RJMk1EY3hNalEzV2pBcE1TY3dKUVlEVlFRREV4NXBaR1Z1ZEdsMGVTNXNhVzVyCiAgWlhKa0xtTnNkWE4wWlhJdWJHOWpZV3d3V1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVJxYzcwWgogIGwxdmd3NzlyakI1dVNJVElDVUE2R3lmdlNGZmN1SWlzN0IvWEZTa2t3QUhVNVMvczFBQVArUjBUWDdIQldVQzQKICB1YUc0V1dzaXdKS05uN21nbzNBd2JqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCCiAgL3dJQkFUQWRCZ05WSFE0RUZnUVU1WXRqVlZQZmQ3STdOTEhzbjJDMjZFQnlHVjB3S1FZRFZSMFJCQ0l3SUlJZQogIGFXUmxiblJwZEhrdWJHbHVhMlZ5WkM1amJIVnpkR1Z5TG14dlkyRnNNQW9HQ0NxR1NNNDlCQU1DQTBrQU1FWUMKICBJUUNON2xCRkxERHZqeDZWMCtYa2pwS0VSUnNKWWY1YWRNdm5sb0ZsNDhpbEpnSWhBTnR4aG5kY3IrUUpQdUM4CiAgdmdVQzBkMi85Rk11ZUlWTWIrNDZXVENPanNxcgogIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KaW1hZ2VQdWxsUG9saWN5OiBJbWFnZVB1bGxQb2xpY3kKaW1hZ2VQdWxsU2VjcmV0czogbnVsbApsaW5rZXJkVmVyc2lvbjogTGlua2VyZFZlcnNpb24KbmV0d29ya1ZhbGlkYXRvcjoKICBjb25uZWN0QWRkcjogMS4xLjEuMToyMDAwMQogIGxpc3RlbkFkZHI6ICdbOjpdOjQxNDAnCiAgc2VjdXJpdHlDb250ZXh0OiBudWxsCnBvZE1vbml0b3I6IG51bGwKcG9saWN5Q29udHJvbGxlcjoKICBsb2dMZXZlbDogbG9nLWxldmVsCiAgcmVzb3VyY2VzOgogICAgY3B1OgogICAgICBsaW1pdDogY3B1LWxpbWl0CiAgICAgIHJlcXVlc3Q6IGNwdS1yZXF1ZXN0CiAgICBtZW1vcnk6CiAgICAgIGxpbWl0OiBtZW1vcnktbGltaXQKICAgICAgcmVxdWVzdDogbWVtb3J5LXJlcXVlc3QKcG9saWN5VmFsaWRhdG9yOgogIGNhQnVuZGxlOiBwb2xpY3kgdmFsaWRhdG9yIENBIGJ1bmRsZQogIGV4dGVybmFsU2VjcmV0OiB0cnVlCnByaW9yaXR5Q2xhc3NOYW1lOiBQcmlvcml0eUNsYXNzTmFtZQpwcm9maWxlVmFsaWRhdG9yOgogIGNhQnVuZGxlOiBwcm9maWxlIHZhbGlkYXRvciBDQSBidW5kbGUKICBleHRlcm5hbFNlY3JldDogdHJ1ZQpwcm94eToKICBjb250cm9sOiBudWxsCiAgZGVmYXVsdEluYm91bmRQb2xpY3k6IGRlZmF1bHQtYWxsb3ctcG9saWN5CiAgZ2lkOiAyMTAyCiAgaW1hZ2U6CiAgICBuYW1lOiBQcm94eUltYWdlTmFtZQogICAgcHVsbFBvbGljeTogSW1hZ2VQdWxsUG9saWN5CiAgICB2ZXJzaW9uOiBQcm94eVZlcnNpb24KICBpbmJvdW5kQ29ubmVjdFRpbWVvdXQ6ICIiCiAgaW5ib3VuZERpc2NvdmVyeUNhY2hlVW51c2VkVGltZW91dDogIiIKICBsb2dMZXZlbDogd2FybixsaW5rZXJkPWluZm8KICBvcGFxdWVQb3J0czogMjUsNDQzLDU4NywzMzA2LDU0MzIsMTEyMTEKICBvdXRib3VuZENvbm5lY3RUaW1lb3V0OiAiIgogIG91dGJvdW5kRGlzY292ZXJ5Q2FjaGVVbnVzZWRUaW1lb3V0OiAiIgogIG91dGJvdW5kVHJhbnNwb3J0TW9kZTogIiIKICByZXNvdXJjZXM6CiAgICBjcHU6CiAgICAgIGxpbWl0OiBjcHUtbGltaXQKICAgICAgcmVxdWVzdDogY3B1LXJlcXVlc3QKICAgIG1lbW9yeToKICAgICAgbGltaXQ6IG1lbW9yeS1saW1pdAogICAgICByZXF1ZXN0OiBtZW1vcnktcmVxdWVzdAogIHNlY3VyaXR5Q29udGV4dDogbnVsbAogIHN0YXJ0dXBQcm9iZTogbnVsbApwcm94eUNvbnRhaW5lck5hbWU6IFByb3h5Q29udGFpbmVyTmFtZQpwcm94eUluaXQ6CiAgaWdub3JlSW5ib3VuZFBvcnRzOiAiIgogIGlnbm9yZU91dGJvdW5kUG9ydHM6ICI0NDMiCiAgaXB0YWJsZXNNb2RlOiBsZWdhY3kKICBrdWJlQVBJU2VydmVyUG9ydHM6ICIiCnByb3h5SW5qZWN0b3I6CiAgY2FCdW5kbGU6IHByb3h5IGluamVjdG9yIENBIGJ1bmRsZQogIGV4dGVybmFsU2VjcmV0OiB0cnVlCnNwVmFsaWRhdG9yOiBudWxsCndlYmhvb2tGYWlsdXJlUG9saWN5OiBXZWJob29rRmFpbHVyZVBvbGljeQo= kind: Secret metadata: labels: diff --git a/cli/cmd/testdata/install_proxy_ignores.golden b/cli/cmd/testdata/install_proxy_ignores.golden index 73f0da71bc1bf..3f169aab98b27 100644 --- a/cli/cmd/testdata/install_proxy_ignores.golden +++ b/cli/cmd/testdata/install_proxy_ignores.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_tracing.golden b/cli/cmd/testdata/install_tracing.golden index 776efca8cbff7..2cb33bb9df794 100644 --- a/cli/cmd/testdata/install_tracing.golden +++ b/cli/cmd/testdata/install_tracing.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1882,6 +1884,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: diff --git a/cli/cmd/testdata/install_values_file.golden b/cli/cmd/testdata/install_values_file.golden index 6998f0d9e69f8..35065656f5320 100644 --- a/cli/cmd/testdata/install_values_file.golden +++ b/cli/cmd/testdata/install_values_file.golden @@ -555,7 +555,9 @@ data: enableH2Upgrade: true enablePodAntiAffinity: false enablePodDisruptionBudget: false - heartbeat: null + heartbeat: + failedJobsHistoryLimit: 1 + successfulJobsHistoryLimit: 0 heartbeatResources: null heartbeatSchedule: 1 2 3 4 5 highAvailability: false @@ -1826,6 +1828,7 @@ spec: concurrencyPolicy: Replace schedule: "1 2 3 4 5" successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 jobTemplate: spec: template: From 6242f0c4182fa25d85c7227668bc2e32fe040aec Mon Sep 17 00:00:00 2001 From: mfeix Date: Mon, 23 Mar 2026 18:39:31 +0100 Subject: [PATCH 3/3] test(helm): add expected Heartbeat values to TestNewValues Add the Heartbeat map with successfulJobsHistoryLimit and failedJobsHistoryLimit to the expected Values struct in the test, matching the new defaults in values.yaml. Signed-off-by: mfeix --- pkg/charts/linkerd2/values_test.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/pkg/charts/linkerd2/values_test.go b/pkg/charts/linkerd2/values_test.go index 62bf3a3f7a0dc..bdf69c140191b 100644 --- a/pkg/charts/linkerd2/values_test.go +++ b/pkg/charts/linkerd2/values_test.go @@ -50,17 +50,21 @@ func TestNewValues(t *testing.T) { }, } expected := &Values{ - ControllerImage: "cr.l5d.io/linkerd/controller", - ControllerReplicas: 1, - RevisionHistoryLimit: 10, - ControllerUID: 2103, - ControllerGID: -1, - EnableH2Upgrade: true, - EnablePodAntiAffinity: false, - WebhookFailurePolicy: "Ignore", - DisableHeartBeat: false, - DeploymentStrategy: defaultDeploymentStrategy, - HeartbeatSchedule: "", + ControllerImage: "cr.l5d.io/linkerd/controller", + ControllerReplicas: 1, + RevisionHistoryLimit: 10, + ControllerUID: 2103, + ControllerGID: -1, + EnableH2Upgrade: true, + EnablePodAntiAffinity: false, + WebhookFailurePolicy: "Ignore", + DisableHeartBeat: false, + DeploymentStrategy: defaultDeploymentStrategy, + HeartbeatSchedule: "", + Heartbeat: map[string]interface{}{ + "successfulJobsHistoryLimit": float64(0), + "failedJobsHistoryLimit": float64(1), + }, ClusterDomain: "cluster.local", ClusterNetworks: "10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16,fd00::/8", ImagePullPolicy: "IfNotPresent",