This is an automated email from the ASF dual-hosted git repository.

jscheffl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new b397baa4437 Customize statsd dagprocessor labels (#55832)
b397baa4437 is described below

commit b397baa443757270f84d1624809c725696579a6c
Author: Gonçalo <[email protected]>
AuthorDate: Mon Nov 3 21:46:39 2025 +0100

    Customize statsd dagprocessor labels (#55832)
    
    * feat(helm): Pass custom labels to redis, statsd and dagProcessor
    
    Co-authored-by: Gonçalo <[email protected]>
    
    * docs(helm): Write helm labels customization doc
    
    Co-authored-by: Gonçalo <[email protected]>
    
    * feat(helm): Clarify dagProcessor values.yaml comments
    
    Co-authored-by: Przemysław Mirowski <[email protected]>
    
    * docs(helm): Clarify component-specific labels override behavior
    
    * feat(helm): Remove parenthesis from label checks
    
    * tests(helm): Add label tests for redis, statsd and dagprocessor
    
    * tests(helm): Fix tests formatting
    
    * fix(docs): Update breeze output docs
    
    ---------
    
    Co-authored-by: Gonçalo Costa <[email protected]>
    Co-authored-by: Gonçalo <[email protected]>
    Co-authored-by: Przemysław Mirowski <[email protected]>
---
 chart/docs/customizing-labels.rst                  |  59 ++++++++++
 chart/docs/index.rst                               |   1 +
 .../dag-processor/dag-processor-deployment.yaml    |   4 +-
 .../dag-processor-serviceaccount.yaml              |   4 +-
 chart/templates/redis/redis-networkpolicy.yaml     |   4 +-
 chart/templates/redis/redis-service.yaml           |   4 +-
 chart/templates/redis/redis-serviceaccount.yaml    |   4 +-
 chart/templates/redis/redis-statefulset.yaml       |   4 +-
 chart/templates/statsd/statsd-deployment.yaml      |   4 +-
 chart/templates/statsd/statsd-ingress.yaml         |   4 +-
 chart/templates/statsd/statsd-networkpolicy.yaml   |   4 +-
 chart/templates/statsd/statsd-service.yaml         |   4 +-
 chart/templates/statsd/statsd-serviceaccount.yaml  |   4 +-
 chart/values.schema.json                           |  24 +++++
 chart/values.yaml                                  |  11 ++
 .../doc/images/output_testing_helm-tests.svg       |  54 +++++-----
 .../doc/images/output_testing_helm-tests.txt       |   2 +-
 .../tests/helm_tests/dagprocessor/__init__.py      |  16 +++
 .../dagprocessor/test_labels_deployment.py         | 101 +++++++++++++++++
 .../dagprocessor/test_labels_service_account.py    |  95 ++++++++++++++++
 helm-tests/tests/helm_tests/redis/__init__.py      |  16 +++
 .../helm_tests/redis/test_labels_networkpolicy.py  | 103 ++++++++++++++++++
 .../tests/helm_tests/redis/test_labels_service.py  |  99 +++++++++++++++++
 .../helm_tests/redis/test_labels_serviceaccount.py | 105 ++++++++++++++++++
 .../helm_tests/redis/test_labels_statefulset.py    | 119 +++++++++++++++++++++
 helm-tests/tests/helm_tests/statsd/__init__.py     |  16 +++
 .../helm_tests/statsd/test_labels_deployment.py    | 113 +++++++++++++++++++
 .../tests/helm_tests/statsd/test_labels_ingress.py |  98 +++++++++++++++++
 .../helm_tests/statsd/test_labels_networkpolicy.py |  98 +++++++++++++++++
 .../tests/helm_tests/statsd/test_labels_service.py |  94 ++++++++++++++++
 .../statsd/test_labels_serviceaccount.py           |  94 ++++++++++++++++
 31 files changed, 1314 insertions(+), 48 deletions(-)

diff --git a/chart/docs/customizing-labels.rst 
b/chart/docs/customizing-labels.rst
new file mode 100644
index 00000000000..47e06009854
--- /dev/null
+++ b/chart/docs/customizing-labels.rst
@@ -0,0 +1,59 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+..   http://www.apache.org/licenses/LICENSE-2.0
+
+.. Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.
+
+Customizing Labels for Pods
+---------------------------
+
+The Helm chart allows you to customize labels for your Airflow objects. You 
can set global labels that apply to all objects and pods defined in the chart, 
as well as component-specific labels for individual Airflow components.
+
+Global Labels
+~~~~~~~~~~~~~
+
+Global labels can be set using the ``labels`` parameter in your values file. 
These labels will be applied to all Airflow objects and pods defined in the 
chart:
+
+.. code-block:: yaml
+
+    labels:
+      environment: production
+
+Component-Specific Labels
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can also set specific labels for individual Airflow components, which will 
be merged with the global labels. Component-specific labels take precedence 
over global labels, allowing you to override them as needed.
+
+For example, to add specific labels to different components:
+
+.. code-block:: yaml
+
+    # Global labels applied to all pods
+    labels:
+      environment: production
+
+    # Scheduler specific labels
+    scheduler:
+      labels:
+        role: scheduler
+
+    # Worker specific labels
+    workers:
+      labels:
+        role: worker
+
+    # Webserver specific labels
+    webserver:
+      labels:
+        role: ui
diff --git a/chart/docs/index.rst b/chart/docs/index.rst
index 68be09bbedf..9ce59d74779 100644
--- a/chart/docs/index.rst
+++ b/chart/docs/index.rst
@@ -35,6 +35,7 @@ Helm Chart for Apache Airflow
     keda
     using-additional-containers
     customizing-workers
+    customizing-labels
     Installing from sources<installing-helm-chart-from-sources>
     Extending the Chart<extending-the-chart>
 
diff --git a/chart/templates/dag-processor/dag-processor-deployment.yaml 
b/chart/templates/dag-processor/dag-processor-deployment.yaml
index b5490fcfe2c..f628d94627d 100644
--- a/chart/templates/dag-processor/dag-processor-deployment.yaml
+++ b/chart/templates/dag-processor/dag-processor-deployment.yaml
@@ -71,8 +71,8 @@ spec:
         tier: airflow
         component: dag-processor
         release: {{ .Release.Name }}
-        {{- with .Values.labels }}
-          {{- toYaml . | nindent 8 }}
+        {{- if or .Values.labels .Values.dagProcessor.labels }}
+          {{- mustMerge .Values.dagProcessor.labels .Values.labels | toYaml | 
nindent 8 }}
         {{- end }}
       annotations:
         checksum/metadata-secret: {{ include (print $.Template.BasePath 
"/secrets/metadata-connection-secret.yaml") . | sha256sum }}
diff --git a/chart/templates/dag-processor/dag-processor-serviceaccount.yaml 
b/chart/templates/dag-processor/dag-processor-serviceaccount.yaml
index 8fdae4abe1f..acca4a6ec67 100644
--- a/chart/templates/dag-processor/dag-processor-serviceaccount.yaml
+++ b/chart/templates/dag-processor/dag-processor-serviceaccount.yaml
@@ -37,8 +37,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.dagProcessor.labels }}
+      {{- mustMerge .Values.dagProcessor.labels .Values.labels | toYaml | 
nindent 4 }}
     {{- end }}
   {{- with .Values.dagProcessor.serviceAccount.annotations}}
   annotations: {{- toYaml . | nindent 4 }}
diff --git a/chart/templates/redis/redis-networkpolicy.yaml 
b/chart/templates/redis/redis-networkpolicy.yaml
index 6a186a4b685..8ae08e01f87 100644
--- a/chart/templates/redis/redis-networkpolicy.yaml
+++ b/chart/templates/redis/redis-networkpolicy.yaml
@@ -31,8 +31,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.redis.labels }}
+      {{- mustMerge .Values.redis.labels .Values.labels | toYaml | nindent 4 }}
     {{- end }}
 spec:
   podSelector:
diff --git a/chart/templates/redis/redis-service.yaml 
b/chart/templates/redis/redis-service.yaml
index 40424a7313e..3ade825f28d 100644
--- a/chart/templates/redis/redis-service.yaml
+++ b/chart/templates/redis/redis-service.yaml
@@ -31,8 +31,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.redis.labels }}
+      {{- mustMerge .Values.redis.labels .Values.labels | toYaml | nindent 4 }}
     {{- end }}
 spec:
 {{- if eq .Values.redis.service.type "ClusterIP" }}
diff --git a/chart/templates/redis/redis-serviceaccount.yaml 
b/chart/templates/redis/redis-serviceaccount.yaml
index 06f33e12f5d..f645b4ee2f4 100644
--- a/chart/templates/redis/redis-serviceaccount.yaml
+++ b/chart/templates/redis/redis-serviceaccount.yaml
@@ -32,8 +32,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.redis.labels }}
+      {{- mustMerge .Values.redis.labels .Values.labels | toYaml | nindent 4 }}
     {{- end }}
   {{- with .Values.redis.serviceAccount.annotations }}
   annotations: {{- toYaml . | nindent 4 }}
diff --git a/chart/templates/redis/redis-statefulset.yaml 
b/chart/templates/redis/redis-statefulset.yaml
index d1e1edef808..b8374d81e9d 100644
--- a/chart/templates/redis/redis-statefulset.yaml
+++ b/chart/templates/redis/redis-statefulset.yaml
@@ -57,8 +57,8 @@ spec:
         tier: airflow
         component: redis
         release: {{ .Release.Name }}
-        {{- with .Values.labels }}
-          {{- toYaml . | nindent 8 }}
+        {{- if or .Values.labels .Values.redis.labels }}
+          {{- mustMerge .Values.redis.labels .Values.labels | toYaml | nindent 
8 }}
         {{- end }}
       {{- if or .Values.redis.safeToEvict .Values.redis.podAnnotations }}
       annotations:
diff --git a/chart/templates/statsd/statsd-deployment.yaml 
b/chart/templates/statsd/statsd-deployment.yaml
index 1eab1fda8b8..ecbd1f80f41 100644
--- a/chart/templates/statsd/statsd-deployment.yaml
+++ b/chart/templates/statsd/statsd-deployment.yaml
@@ -61,8 +61,8 @@ spec:
         tier: airflow
         component: statsd
         release: {{ .Release.Name }}
-        {{- with .Values.labels }}
-          {{- toYaml . | nindent 8 }}
+        {{- if or .Values.labels .Values.statsd.labels }}
+          {{- mustMerge .Values.statsd.labels .Values.labels | toYaml | 
nindent 8 }}
         {{- end }}
       {{- if or .Values.statsd.extraMappings .Values.statsd.podAnnotations }}
       annotations:
diff --git a/chart/templates/statsd/statsd-ingress.yaml 
b/chart/templates/statsd/statsd-ingress.yaml
index c01792643c4..d48ec29085a 100644
--- a/chart/templates/statsd/statsd-ingress.yaml
+++ b/chart/templates/statsd/statsd-ingress.yaml
@@ -32,8 +32,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.statsd.labels }}
+      {{- mustMerge .Values.statsd.labels .Values.labels | toYaml | nindent 4 
}}
     {{- end }}
   {{- with .Values.ingress.statsd.annotations }}
   annotations: {{- toYaml . | nindent 4 }}
diff --git a/chart/templates/statsd/statsd-networkpolicy.yaml 
b/chart/templates/statsd/statsd-networkpolicy.yaml
index 3690cda8971..9d4ccde72db 100644
--- a/chart/templates/statsd/statsd-networkpolicy.yaml
+++ b/chart/templates/statsd/statsd-networkpolicy.yaml
@@ -31,8 +31,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.statsd.labels }}
+      {{- mustMerge .Values.statsd.labels .Values.labels | toYaml | nindent 4 
}}
     {{- end }}
 spec:
   podSelector:
diff --git a/chart/templates/statsd/statsd-service.yaml 
b/chart/templates/statsd/statsd-service.yaml
index 2486264c5cb..c7bee0ea3f4 100644
--- a/chart/templates/statsd/statsd-service.yaml
+++ b/chart/templates/statsd/statsd-service.yaml
@@ -31,8 +31,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.statsd.labels }}
+      {{- mustMerge .Values.statsd.labels .Values.labels | toYaml | nindent 4 
}}
     {{- end }}
   annotations:
     prometheus.io/scrape: "true"
diff --git a/chart/templates/statsd/statsd-serviceaccount.yaml 
b/chart/templates/statsd/statsd-serviceaccount.yaml
index 838cbdd857c..e2659769516 100644
--- a/chart/templates/statsd/statsd-serviceaccount.yaml
+++ b/chart/templates/statsd/statsd-serviceaccount.yaml
@@ -32,8 +32,8 @@ metadata:
     release: {{ .Release.Name }}
     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
     heritage: {{ .Release.Service }}
-    {{- with .Values.labels }}
-      {{- toYaml . | nindent 4 }}
+    {{- if or .Values.labels .Values.statsd.labels }}
+      {{- mustMerge .Values.statsd.labels .Values.labels | toYaml | nindent 4 
}}
     {{- end }}
   {{- with .Values.statsd.serviceAccount.annotations }}
   annotations: {{- toYaml . | nindent 4 }}
diff --git a/chart/values.schema.json b/chart/values.schema.json
index d1bc354468e..0ed32986314 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -4192,6 +4192,14 @@
                         }
                     }
                 },
+                "labels": {
+                    "description": "Labels specific to dag processor objects 
and pods",
+                    "type": "object",
+                    "default": {},
+                    "additionalProperties": {
+                        "type": "string"
+                    }
+                },
                 "env": {
                     "description": "Add additional env vars to dag processor.",
                     "type": "array",
@@ -7317,6 +7325,14 @@
                         
"--statsd.mapping-config=/etc/statsd-exporter/mappings.yml"
                     ]
                 },
+                "labels": {
+                    "description": "Labels specific to statsd objects and 
pods",
+                    "type": "object",
+                    "default": {},
+                    "additionalProperties": {
+                        "type": "string"
+                    }
+                },
                 "env": {
                     "description": "Add additional env vars to statsd 
container.",
                     "type": "array",
@@ -8306,6 +8322,14 @@
                         }
                     }
                 },
+                "labels": {
+                    "description": "Labels to add to the redis objects and 
pods.",
+                    "type": "object",
+                    "default": {},
+                    "additionalProperties": {
+                        "type": "string"
+                    }
+                },
                 "uid": {
                     "description": "Redis run as user parameter.",
                     "type": "integer",
diff --git a/chart/values.yaml b/chart/values.yaml
index 904c0594c1a..0a92348cd56 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -2174,6 +2174,10 @@ dagProcessor:
     securityContexts:
       container: {}
 
+  # Labels specific to dag processor objects
+  labels: {}
+
+  # Environment variables to add to dag processor container
   env: []
 
 # Flower settings
@@ -2404,6 +2408,10 @@ statsd:
   overrideMappings: []
 
   podAnnotations: {}
+
+  # Labels specific to statsd objects and pods
+  labels: {}
+  # Environment variables to add to statsd container
   env: []
 
 # PgBouncer settings
@@ -2717,6 +2725,9 @@ redis:
   # container level lifecycle hooks
   containerLifecycleHooks: {}
 
+  # Labels specific to redis objects and pods
+  labels: {}
+
   podAnnotations: {}
 # Auth secret for a private registry
 # This is used if pulling airflow images from a private registry
diff --git a/dev/breeze/doc/images/output_testing_helm-tests.svg 
b/dev/breeze/doc/images/output_testing_helm-tests.svg
index b5532a7ea15..133234e5d15 100644
--- a/dev/breeze/doc/images/output_testing_helm-tests.svg
+++ b/dev/breeze/doc/images/output_testing_helm-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 733.1999999999999" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-testing-helm-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="682.1999999999999" />
+      <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
     </clipPath>
     <clipPath id="breeze-testing-helm-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -126,9 +126,12 @@
 <clipPath id="breeze-testing-helm-tests-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-helm-tests-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="731.2" rx="8"/><text 
class="breeze-testing-helm-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;helm-tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="755.6" rx="8"/><text 
class="breeze-testing-helm-tests-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;testing&#160;helm-tests</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -144,28 +147,29 @@
 </text><text class="breeze-testing-helm-tests-r1" x="12.2" y="93.2" 
textLength="256.2" 
clip-path="url(#breeze-testing-helm-tests-line-3)">Run&#160;Helm&#160;chart&#160;tests.</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-3)">
 </text><text class="breeze-testing-helm-tests-r1" x="1464" y="117.6" 
textLength="12.2" clip-path="url(#breeze-testing-helm-tests-line-4)">
 </text><text class="breeze-testing-helm-tests-r5" x="0" y="142" 
textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-5)">╭─</text><text 
class="breeze-testing-helm-tests-r5" x="24.4" y="142" textLength="378.2" 
clip-path="url(#breeze-testing-helm-tests-line-5)">&#160;Flags&#160;for&#160;helms-tests&#160;command&#160;</text><text
 class="breeze-testing-helm-tests-r5" x="402.6" y="142" textLength="1037" 
clip-path="url(#breeze-testing-helm-tests-line-5)">─────────────────────────── 
[...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-6)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="166.4" textLength="134.2" 
clip-path="url(#breeze-testing-helm-tests-line-6)">--test-type</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="166.4" textLength="939.4" 
clip-path="url(#breeze-testing-helm-tests-line-6)">Type&#160;of&#160;helm&#160;tests&#160;to&#160;run&#160;&#160;&#160;
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-7)">│</text><text 
class="breeze-testing-helm-tests-r6" x="244" y="190.8" textLength="939.4" 
clip-path="url(#breeze-testing-helm-tests-line-7)">(All&#160;|&#160;airflow_aux&#160;|&#160;airflow_core&#160;|&#160;apiserver&#160;|&#160;other&#160;|&#160;security&#160;|&#160;webserver)</text><text
 class="breeze-testing-helm-tests-r5" x="1451.8" y="190.8" textLength [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-8)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="215.2" textLength="939.4" 
clip-path="url(#breeze-testing-helm-tests-line-8)">[default:&#160;All]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-9)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="239.6" textLength="170.8" 
clip-path="url(#breeze-testing-helm-tests-line-9)">--test-timeout</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="239.6" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-9)">Test&#160;timeout&#160;in&#160;seconds.&#160;Set&#160;the&#160;p
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-10)">│</text><text 
class="breeze-testing-helm-tests-r6" x="244" y="264" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-10)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-11)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="288.4" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-11)">[default:&#160;60;&#160;x&gt;=0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-12)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="312.8" textLength="134.2" 
clip-path="url(#breeze-testing-helm-tests-line-12)">--use-xdist</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="312.8" textLength="329.4" 
clip-path="url(#breeze-testing-helm-tests-line-12)">Use&#160;xdist&#160;plugin&#160;for&#160;pytest</text><text
 class [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-13)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="337.2" textLength="158.6" 
clip-path="url(#breeze-testing-helm-tests-line-13)">--parallelism</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="337.2" textLength="915" 
clip-path="url(#breeze-testing-helm-tests-line-13)">Maximum&#160;number&#160;of&#160;processes&#160;to&#160;use&#160;
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-14)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="361.6" textLength="915" 
clip-path="url(#breeze-testing-helm-tests-line-14)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="386" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="386" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-15)">
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="410.4" 
textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-16)">╭─</text><text 
class="breeze-testing-helm-tests-r5" x="24.4" y="410.4" textLength="451.4" 
clip-path="url(#breeze-testing-helm-tests-line-16)">&#160;Advanced&#160;flag&#160;for&#160;helm-test&#160;command&#160;</text><text
 class="breeze-testing-helm-tests-r5" x="475.8" y="410.4" textLength="963.8" 
clip-path="url(#breeze-testing-helm-tests-line-16)">────── [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-17)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="434.8" textLength="231.8" 
clip-path="url(#breeze-testing-helm-tests-line-17)">--github-repository</text><text
 class="breeze-testing-helm-tests-r7" x="280.6" y="434.8" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-17)">-g</text><text 
class="breeze-testing-helm-tests-r1" x="3 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-18)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="459.2" textLength="183" 
clip-path="url(#breeze-testing-helm-tests-line-18)">--mount-sources</text><text 
class="breeze-testing-helm-tests-r1" x="329.4" y="459.2" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-18)">Choose&#160;scope&#160;of&#160;local&#160;sources&#160;that&
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-19)">│</text><text 
class="breeze-testing-helm-tests-r1" x="329.4" y="483.6" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-19)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-20)">│</text><text 
class="breeze-testing-helm-tests-r6" x="329.4" y="508" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-20)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove&#160;|&#160;tests&#160;|&#160;providers-and-tests)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-21)">│</text><text 
class="breeze-testing-helm-tests-r5" x="329.4" y="532.4" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-21)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="556.8" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="556.8" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-22)">
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="581.2" 
textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-23)">╭─</text><text 
class="breeze-testing-helm-tests-r5" x="24.4" y="581.2" textLength="195.2" 
clip-path="url(#breeze-testing-helm-tests-line-23)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-helm-tests-r5" x="219.6" y="581.2" textLength="1220" 
clip-path="url(#breeze-testing-helm-tests-line-23)">───────────────────────────────────────────
 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-24)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="605.6" textLength="109.8" 
clip-path="url(#breeze-testing-helm-tests-line-24)">--verbose</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="605.6" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-24)">-v</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="6 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-25)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="630" textLength="109.8" 
clip-path="url(#breeze-testing-helm-tests-line-25)">--dry-run</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="630" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-25)">-D</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="630" te [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-26)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="654.4" textLength="73.2" 
clip-path="url(#breeze-testing-helm-tests-line-26)">--help</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="654.4" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-26)">-h</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="654.4 [...]
-</text><text class="breeze-testing-helm-tests-r5" x="0" y="678.8" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="678.8" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-27)">
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-6)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="166.4" textLength="134.2" 
clip-path="url(#breeze-testing-helm-tests-line-6)">--test-type</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="166.4" textLength="1195.6" 
clip-path="url(#breeze-testing-helm-tests-line-6)">Type&#160;of&#160;helm&#160;tests&#160;to&#160;run&#160;&#160;&#160
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-7)">│</text><text 
class="breeze-testing-helm-tests-r6" x="244" y="190.8" textLength="1195.6" 
clip-path="url(#breeze-testing-helm-tests-line-7)">(All&#160;|&#160;airflow_aux&#160;|&#160;airflow_core&#160;|&#160;apiserver&#160;|&#160;dagprocessor&#160;|&#160;other&#160;|&#160;redis&#160;|&#160;security&#160;|&#160;statsd&#160;|</text><text
 class="breeze-testing [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-8)">│</text><text 
class="breeze-testing-helm-tests-r6" x="244" y="215.2" textLength="1195.6" 
clip-path="url(#breeze-testing-helm-tests-line-8)">webserver)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-9)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="239.6" textLength="1195.6" 
clip-path="url(#breeze-testing-helm-tests-line-9)">[default:&#160;All]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-10)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="264" textLength="170.8" 
clip-path="url(#breeze-testing-helm-tests-line-10)">--test-timeout</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="264" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-10)">Test&#160;timeout&#160;in&#160;seconds.&#160;Set&#160;the&#160;pyte
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-11)">│</text><text 
class="breeze-testing-helm-tests-r6" x="244" y="288.4" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-11)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-12)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="312.8" textLength="1122.4" 
clip-path="url(#breeze-testing-helm-tests-line-12)">[default:&#160;60;&#160;x&gt;=0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-13)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="337.2" textLength="134.2" 
clip-path="url(#breeze-testing-helm-tests-line-13)">--use-xdist</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="337.2" textLength="329.4" 
clip-path="url(#breeze-testing-helm-tests-line-13)">Use&#160;xdist&#160;plugin&#160;for&#160;pytest</text><text
 class [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-14)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="361.6" textLength="158.6" 
clip-path="url(#breeze-testing-helm-tests-line-14)">--parallelism</text><text 
class="breeze-testing-helm-tests-r1" x="244" y="361.6" textLength="915" 
clip-path="url(#breeze-testing-helm-tests-line-14)">Maximum&#160;number&#160;of&#160;processes&#160;to&#160;use&#160;
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-15)">│</text><text 
class="breeze-testing-helm-tests-r5" x="244" y="386" textLength="915" 
clip-path="url(#breeze-testing-helm-tests-line-15)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="410.4" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="410.4" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-16)">
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="434.8" 
textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-17)">╭─</text><text 
class="breeze-testing-helm-tests-r5" x="24.4" y="434.8" textLength="451.4" 
clip-path="url(#breeze-testing-helm-tests-line-17)">&#160;Advanced&#160;flag&#160;for&#160;helm-test&#160;command&#160;</text><text
 class="breeze-testing-helm-tests-r5" x="475.8" y="434.8" textLength="963.8" 
clip-path="url(#breeze-testing-helm-tests-line-17)">────── [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-18)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="459.2" textLength="231.8" 
clip-path="url(#breeze-testing-helm-tests-line-18)">--github-repository</text><text
 class="breeze-testing-helm-tests-r7" x="280.6" y="459.2" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-18)">-g</text><text 
class="breeze-testing-helm-tests-r1" x="3 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-19)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="483.6" textLength="183" 
clip-path="url(#breeze-testing-helm-tests-line-19)">--mount-sources</text><text 
class="breeze-testing-helm-tests-r1" x="329.4" y="483.6" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-19)">Choose&#160;scope&#160;of&#160;local&#160;sources&#160;that&
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-20)">│</text><text 
class="breeze-testing-helm-tests-r1" x="329.4" y="508" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-20)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-21)">│</text><text 
class="breeze-testing-helm-tests-r6" x="329.4" y="532.4" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-21)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove&#160;|&#160;tests&#160;|&#160;providers-and-tests)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-22)">│</text><text 
class="breeze-testing-helm-tests-r5" x="329.4" y="556.8" textLength="1110.2" 
clip-path="url(#breeze-testing-helm-tests-line-22)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="581.2" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="581.2" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-23)">
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="605.6" 
textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-24)">╭─</text><text 
class="breeze-testing-helm-tests-r5" x="24.4" y="605.6" textLength="195.2" 
clip-path="url(#breeze-testing-helm-tests-line-24)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-helm-tests-r5" x="219.6" y="605.6" textLength="1220" 
clip-path="url(#breeze-testing-helm-tests-line-24)">───────────────────────────────────────────
 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-25)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="630" textLength="109.8" 
clip-path="url(#breeze-testing-helm-tests-line-25)">--verbose</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="630" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-25)">-v</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="630" te [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-26)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="654.4" textLength="109.8" 
clip-path="url(#breeze-testing-helm-tests-line-26)">--dry-run</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="654.4" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-26)">-D</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="6 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-27)">│</text><text 
class="breeze-testing-helm-tests-r4" x="24.4" y="678.8" textLength="73.2" 
clip-path="url(#breeze-testing-helm-tests-line-27)">--help</text><text 
class="breeze-testing-helm-tests-r7" x="158.6" y="678.8" textLength="24.4" 
clip-path="url(#breeze-testing-helm-tests-line-27)">-h</text><text 
class="breeze-testing-helm-tests-r1" x="207.4" y="678.8 [...]
+</text><text class="breeze-testing-helm-tests-r5" x="0" y="703.2" 
textLength="1464" 
clip-path="url(#breeze-testing-helm-tests-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-helm-tests-r1" x="1464" y="703.2" textLength="12.2" 
clip-path="url(#breeze-testing-helm-tests-line-28)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_testing_helm-tests.txt 
b/dev/breeze/doc/images/output_testing_helm-tests.txt
index 14ca452d17b..cfa0314542d 100644
--- a/dev/breeze/doc/images/output_testing_helm-tests.txt
+++ b/dev/breeze/doc/images/output_testing_helm-tests.txt
@@ -1 +1 @@
-f67f6341ee5ef1786505b25152a278cc
+33c785aec11cf1a774057a69bb8364ba
diff --git a/helm-tests/tests/helm_tests/dagprocessor/__init__.py 
b/helm-tests/tests/helm_tests/dagprocessor/__init__.py
new file mode 100644
index 00000000000..13a83393a91
--- /dev/null
+++ b/helm-tests/tests/helm_tests/dagprocessor/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/helm-tests/tests/helm_tests/dagprocessor/test_labels_deployment.py 
b/helm-tests/tests/helm_tests/dagprocessor/test_labels_deployment.py
new file mode 100644
index 00000000000..7a044783353
--- /dev/null
+++ b/helm-tests/tests/helm_tests/dagprocessor/test_labels_deployment.py
@@ -0,0 +1,101 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestDagProcessorDeployment:
+    """Tests dag-processor deployment labels."""
+
+    AIRFLOW_VERSION = "3.0.0"
+    TEMPLATE_FILE = "templates/dag-processor/dag-processor-deployment.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.dagProcessor.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "dagProcessor": {
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.dagProcessor.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"test_global_label": "test_global_label_value"},
+                "dagProcessor": {
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"common_label": "global_value"},
+                "dagProcessor": {
+                    "labels": {"common_label": "component_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert jmespath.search("spec.template.metadata.labels", 
docs[0])["common_label"] == "component_value"
diff --git 
a/helm-tests/tests/helm_tests/dagprocessor/test_labels_service_account.py 
b/helm-tests/tests/helm_tests/dagprocessor/test_labels_service_account.py
new file mode 100644
index 00000000000..6f8bb8bf8b4
--- /dev/null
+++ b/helm-tests/tests/helm_tests/dagprocessor/test_labels_service_account.py
@@ -0,0 +1,95 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestDagProcessorServiceAccount:
+    """Tests dag-processor service account labels."""
+
+    AIRFLOW_VERSION = "3.0.0"
+    TEMPLATE_FILE = "templates/dag-processor/dag-processor-serviceaccount.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.dagProcessor.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "dagProcessor": {
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.dagProcessor.labels."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"test_global_label": "test_global_label_value"},
+                "dagProcessor": {
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "airflowVersion": self.AIRFLOW_VERSION,
+                "labels": {"common_label": "global_value"},
+                "dagProcessor": {
+                    "labels": {"common_label": "component_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/redis/__init__.py 
b/helm-tests/tests/helm_tests/redis/__init__.py
new file mode 100644
index 00000000000..13a83393a91
--- /dev/null
+++ b/helm-tests/tests/helm_tests/redis/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/helm-tests/tests/helm_tests/redis/test_labels_networkpolicy.py 
b/helm-tests/tests/helm_tests/redis/test_labels_networkpolicy.py
new file mode 100644
index 00000000000..54b324eb495
--- /dev/null
+++ b/helm-tests/tests/helm_tests/redis/test_labels_networkpolicy.py
@@ -0,0 +1,103 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestRedisNetworkPolicy:
+    """Tests redis network policy labels."""
+
+    AIRFLOW_EXECUTOR = "CeleryExecutor"
+    TEMPLATE_FILE = "templates/redis/redis-networkpolicy.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {"enabled": True},
+                "networkPolicies": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "networkPolicies": {"enabled": True},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "networkPolicies": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "networkPolicies": {"enabled": True},
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/redis/test_labels_service.py 
b/helm-tests/tests/helm_tests/redis/test_labels_service.py
new file mode 100644
index 00000000000..d8f6cd0c465
--- /dev/null
+++ b/helm-tests/tests/helm_tests/redis/test_labels_service.py
@@ -0,0 +1,99 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestRedisService:
+    """Tests redis service labels."""
+
+    AIRFLOW_EXECUTOR = "CeleryExecutor"
+    TEMPLATE_FILE = "templates/redis/redis-service.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/redis/test_labels_serviceaccount.py 
b/helm-tests/tests/helm_tests/redis/test_labels_serviceaccount.py
new file mode 100644
index 00000000000..2c90b3d20be
--- /dev/null
+++ b/helm-tests/tests/helm_tests/redis/test_labels_serviceaccount.py
@@ -0,0 +1,105 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestRedisServiceAccount:
+    """Tests redis service account labels."""
+
+    AIRFLOW_EXECUTOR = "CeleryExecutor"
+    TEMPLATE_FILE = "templates/redis/redis-serviceaccount.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "serviceAccount": {"create": True},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "serviceAccount": {"create": True},
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.redis.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "serviceAccount": {"create": True},
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "serviceAccount": {"create": True},
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/redis/test_labels_statefulset.py 
b/helm-tests/tests/helm_tests/redis/test_labels_statefulset.py
new file mode 100644
index 00000000000..e4e189e2c9f
--- /dev/null
+++ b/helm-tests/tests/helm_tests/redis/test_labels_statefulset.py
@@ -0,0 +1,119 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestRedisStatefulSet:
+    """Tests redis statefulset labels."""
+
+    AIRFLOW_EXECUTOR = "CeleryExecutor"
+    TEMPLATE_FILE = "templates/redis/redis-statefulset.yaml"
+
+    def test_should_add_global_labels_to_metadata(self):
+        """Test adding only .Values.labels to metadata.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_global_labels_to_pod_template(self):
+        """Test adding only .Values.labels to spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+
+    def test_should_add_component_specific_labels_to_pod_template(self):
+        """Test adding only .Values.redis.labels to 
spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def 
test_should_merge_global_and_component_specific_labels_in_pod_template(self):
+        """Test adding both .Values.labels and .Values.redis.labels to 
spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "executor": self.AIRFLOW_EXECUTOR,
+                "redis": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert jmespath.search("spec.template.metadata.labels", 
docs[0])["common_label"] == "component_value"
diff --git a/helm-tests/tests/helm_tests/statsd/__init__.py 
b/helm-tests/tests/helm_tests/statsd/__init__.py
new file mode 100644
index 00000000000..13a83393a91
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/helm-tests/tests/helm_tests/statsd/test_labels_deployment.py 
b/helm-tests/tests/helm_tests/statsd/test_labels_deployment.py
new file mode 100644
index 00000000000..867facb0fd3
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/test_labels_deployment.py
@@ -0,0 +1,113 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestStatsdDeployment:
+    """Tests statsd deployment labels."""
+
+    TEMPLATE_FILE = "templates/statsd/statsd-deployment.yaml"
+
+    def test_should_add_global_labels_to_metadata(self):
+        """Test adding only .Values.labels to metadata.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_global_labels_to_pod_template(self):
+        """Test adding only .Values.labels to spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+
+    def test_should_add_component_specific_labels_to_pod_template(self):
+        """Test adding only .Values.statsd.labels to 
spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def 
test_should_merge_global_and_component_specific_labels_in_pod_template(self):
+        """Test adding both .Values.labels and .Values.statsd.labels to 
spec.template.metadata.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_global_label"]
+            == "test_global_label_value"
+        )
+        assert "test_component_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert (
+            jmespath.search("spec.template.metadata.labels", 
docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in 
jmespath.search("spec.template.metadata.labels", docs[0])
+        assert jmespath.search("spec.template.metadata.labels", 
docs[0])["common_label"] == "component_value"
diff --git a/helm-tests/tests/helm_tests/statsd/test_labels_ingress.py 
b/helm-tests/tests/helm_tests/statsd/test_labels_ingress.py
new file mode 100644
index 00000000000..fb7c72365fe
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/test_labels_ingress.py
@@ -0,0 +1,98 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestStatsdIngress:
+    """Tests statsd ingress labels."""
+
+    TEMPLATE_FILE = "templates/statsd/statsd-ingress.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "ingress": {"statsd": {"enabled": True}},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "ingress": {"statsd": {"enabled": True}},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "ingress": {"statsd": {"enabled": True}},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "ingress": {"statsd": {"enabled": True}},
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/statsd/test_labels_networkpolicy.py 
b/helm-tests/tests/helm_tests/statsd/test_labels_networkpolicy.py
new file mode 100644
index 00000000000..0fbf3bb680b
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/test_labels_networkpolicy.py
@@ -0,0 +1,98 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestStatsdNetworkPolicy:
+    """Tests statsd network policy labels."""
+
+    TEMPLATE_FILE = "templates/statsd/statsd-networkpolicy.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "networkPolicies": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "networkPolicies": {"enabled": True},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "networkPolicies": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "networkPolicies": {"enabled": True},
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/statsd/test_labels_service.py 
b/helm-tests/tests/helm_tests/statsd/test_labels_service.py
new file mode 100644
index 00000000000..73ff5b49912
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/test_labels_service.py
@@ -0,0 +1,94 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestStatsdService:
+    """Tests statsd service labels."""
+
+    TEMPLATE_FILE = "templates/statsd/statsd-service.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"
diff --git a/helm-tests/tests/helm_tests/statsd/test_labels_serviceaccount.py 
b/helm-tests/tests/helm_tests/statsd/test_labels_serviceaccount.py
new file mode 100644
index 00000000000..73ff5b49912
--- /dev/null
+++ b/helm-tests/tests/helm_tests/statsd/test_labels_serviceaccount.py
@@ -0,0 +1,94 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import jmespath
+from chart_utils.helm_template_generator import render_chart
+
+
+class TestStatsdService:
+    """Tests statsd service labels."""
+
+    TEMPLATE_FILE = "templates/statsd/statsd-service.yaml"
+
+    def test_should_add_global_labels(self):
+        """Test adding only .Values.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {"enabled": True},
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+
+    def test_should_add_component_specific_labels(self):
+        """Test adding only .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_should_merge_global_and_component_specific_labels(self):
+        """Test adding both .Values.labels and .Values.statsd.labels."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"test_component_label": 
"test_component_label_value"},
+                },
+                "labels": {"test_global_label": "test_global_label_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "test_global_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert jmespath.search("metadata.labels", 
docs[0])["test_global_label"] == "test_global_label_value"
+        assert "test_component_label" in jmespath.search("metadata.labels", 
docs[0])
+        assert (
+            jmespath.search("metadata.labels", docs[0])["test_component_label"]
+            == "test_component_label_value"
+        )
+
+    def test_component_specific_labels_should_override_global_labels(self):
+        """Test that component-specific labels take precedence over global 
labels with the same key."""
+        docs = render_chart(
+            values={
+                "statsd": {
+                    "enabled": True,
+                    "labels": {"common_label": "component_value"},
+                },
+                "labels": {"common_label": "global_value"},
+            },
+            show_only=[self.TEMPLATE_FILE],
+        )
+
+        assert "common_label" in jmespath.search("metadata.labels", docs[0])
+        assert jmespath.search("metadata.labels", docs[0])["common_label"] == 
"component_value"


Reply via email to