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

jedcunningham 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 0a307cce79a Fix webserver.defaultUser.enabled=false not honored 
(#62143)
0a307cce79a is described below

commit 0a307cce79a642b5063e1f49296ffb3f275103da
Author: Jed Cunningham <[email protected]>
AuthorDate: Wed Feb 18 14:30:41 2026 -0700

    Fix webserver.defaultUser.enabled=false not honored (#62143)
    
    When webserver.defaultUser.enabled was set to false, the create-user
    job still ran because createUserJob.enabled defaults to true and the
    OR condition let it through. This adds a helper template that gives
    the deprecated webserver.defaultUser precedence when present, only
    falling back to createUserJob.enabled otherwise. Also fixes NOTES.txt
    to display credentials from the correct source.
---
 chart/templates/NOTES.txt                          | 10 ++--
 chart/templates/_helpers.yaml                      | 13 +++++
 chart/templates/jobs/create-user-job.yaml          |  2 +-
 .../security-context-constraint-rolebinding.yaml   |  2 +-
 .../helm_tests/airflow_aux/test_create_user_job.py | 63 ++++++++++++++++++++++
 .../helm_tests/security/test_scc_rolebinding.py    | 29 ++++++++++
 6 files changed, 110 insertions(+), 9 deletions(-)

diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt
index 0d4c29c7bb3..39614d1f454 100644
--- a/chart/templates/NOTES.txt
+++ b/chart/templates/NOTES.txt
@@ -114,14 +114,10 @@ Flower Dashboard:      kubectl port-forward svc/{{ 
include "airflow.fullname" .
 {{- end }}
 
 
-{{- if and .Values.webserver.defaultUser 
.Values.webserver.defaultUser.enabled}}
+{{- if eq (include "createUserJob.isEnabled" .) "true" }}
 Default user (Airflow UI) Login credentials:
-    username: {{ .Values.createUserJob.defaultUser.username }}
-    password: {{ .Values.createUserJob.defaultUser.password }}
-{{- else if .Values.createUserJob.enabled}}
-Default user (Airflow UI) Login credentials:
-    username: {{ .Values.createUserJob.defaultUser.username }}
-    password: {{ .Values.createUserJob.defaultUser.password }}
+    username: {{ if .Values.webserver.defaultUser }}{{ 
.Values.webserver.defaultUser.username }}{{ else }}{{ 
.Values.createUserJob.defaultUser.username }}{{ end }}
+    password: {{ if .Values.webserver.defaultUser }}{{ 
.Values.webserver.defaultUser.password }}{{ else }}{{ 
.Values.createUserJob.defaultUser.password }}{{ end }}
 {{- end }}
 
 {{- if .Values.postgresql.enabled }}
diff --git a/chart/templates/_helpers.yaml b/chart/templates/_helpers.yaml
index 82326ca2ead..49106961b6c 100644
--- a/chart/templates/_helpers.yaml
+++ b/chart/templates/_helpers.yaml
@@ -1168,6 +1168,19 @@ Usage:
   {{- $result -}}
 {{- end -}}
 
+{{/*
+Determine if the create-user job should be enabled.
+When webserver.defaultUser is set (deprecated), it takes precedence to preserve
+backwards compatibility. Otherwise, fall back to createUserJob.enabled.
+*/}}
+{{- define "createUserJob.isEnabled" -}}
+  {{- if .Values.webserver.defaultUser -}}
+    {{- .Values.webserver.defaultUser.enabled -}}
+  {{- else -}}
+    {{- .Values.createUserJob.enabled -}}
+  {{- end -}}
+{{- end -}}
+
 {{/*
 Convert dagBundleConfigList YAML list to JSON string for 
dag_bundle_config_list.
 This helper function converts the structured YAML format to the JSON string
diff --git a/chart/templates/jobs/create-user-job.yaml 
b/chart/templates/jobs/create-user-job.yaml
index 0a58b50ce00..6626fb7ff5b 100644
--- a/chart/templates/jobs/create-user-job.yaml
+++ b/chart/templates/jobs/create-user-job.yaml
@@ -20,7 +20,7 @@
 ##########################
 ## Airflow Create User Job
 ##########################
-{{- if or (and .Values.webserver.defaultUser 
.Values.webserver.defaultUser.enabled) .Values.createUserJob.enabled }}
+{{- if eq (include "createUserJob.isEnabled" .) "true" }}
 {{- $nodeSelector := or .Values.createUserJob.nodeSelector 
.Values.nodeSelector }}
 {{- $affinity := or .Values.createUserJob.affinity .Values.affinity }}
 {{- $tolerations := or .Values.createUserJob.tolerations .Values.tolerations }}
diff --git a/chart/templates/rbac/security-context-constraint-rolebinding.yaml 
b/chart/templates/rbac/security-context-constraint-rolebinding.yaml
index 8e01246bd56..47544617184 100644
--- a/chart/templates/rbac/security-context-constraint-rolebinding.yaml
+++ b/chart/templates/rbac/security-context-constraint-rolebinding.yaml
@@ -88,7 +88,7 @@ subjects:
   - kind: ServiceAccount
     name: {{ include "migrateDatabaseJob.serviceAccountName" . }}
     namespace: "{{ .Release.Namespace }}"
-  {{- if or (and .Values.webserver.defaultUser 
.Values.webserver.defaultUser.enabled) .Values.createUserJob.enabled }}
+  {{- if eq (include "createUserJob.isEnabled" .) "true" }}
   - kind: ServiceAccount
     name: {{ include "createUserJob.serviceAccountName" . }}
     namespace: "{{ .Release.Namespace }}"
diff --git a/helm-tests/tests/helm_tests/airflow_aux/test_create_user_job.py 
b/helm-tests/tests/helm_tests/airflow_aux/test_create_user_job.py
index 91a9ab338d3..c87f7269a5d 100644
--- a/helm-tests/tests/helm_tests/airflow_aux/test_create_user_job.py
+++ b/helm-tests/tests/helm_tests/airflow_aux/test_create_user_job.py
@@ -486,6 +486,69 @@ class TestCreateUserJob:
         assert len(docs) == 1
         assert docs[0]["kind"] == "Job"
 
+    def test_should_not_create_job_when_deprecated_default_user_disabled(self):
+        """Setting webserver.defaultUser.enabled=false must suppress job even 
with createUserJob.enabled default."""
+        docs = render_chart(
+            values={
+                "webserver": {
+                    "defaultUser": {
+                        "enabled": False,
+                        "role": "Admin",
+                        "username": "admin",
+                        "email": "[email protected]",
+                        "firstName": "admin",
+                        "lastName": "user",
+                        "password": "admin",
+                    }
+                }
+            },
+            show_only=["templates/jobs/create-user-job.yaml"],
+        )
+        assert len(docs) == 0
+
+    def test_should_create_job_when_deprecated_default_user_enabled(self):
+        """Setting webserver.defaultUser.enabled=true should create the job."""
+        docs = render_chart(
+            values={
+                "webserver": {
+                    "defaultUser": {
+                        "enabled": True,
+                        "role": "Admin",
+                        "username": "admin",
+                        "email": "[email protected]",
+                        "firstName": "admin",
+                        "lastName": "user",
+                        "password": "admin",
+                    }
+                }
+            },
+            show_only=["templates/jobs/create-user-job.yaml"],
+        )
+        assert len(docs) == 1
+        assert docs[0]["kind"] == "Job"
+
+    def 
test_deprecated_default_user_enabled_overrides_createuserjob_disabled(self):
+        """webserver.defaultUser.enabled=true takes precedence over 
createUserJob.enabled=false."""
+        docs = render_chart(
+            values={
+                "createUserJob": {"enabled": False},
+                "webserver": {
+                    "defaultUser": {
+                        "enabled": True,
+                        "role": "Admin",
+                        "username": "admin",
+                        "email": "[email protected]",
+                        "firstName": "admin",
+                        "lastName": "user",
+                        "password": "admin",
+                    }
+                },
+            },
+            show_only=["templates/jobs/create-user-job.yaml"],
+        )
+        assert len(docs) == 1
+        assert docs[0]["kind"] == "Job"
+
 
 class TestCreateUserJobServiceAccount:
     """Tests create user job service account."""
diff --git a/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py 
b/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
index ae39752d8cf..e40bb909beb 100644
--- a/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
+++ b/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
@@ -128,3 +128,32 @@ class TestSCCActivation:
             assert jmespath.search("subjects[5].name", docs[0]) == 
"release-name-airflow-triggerer"
             assert jmespath.search("subjects[6].name", docs[0]) == 
"release-name-airflow-migrate-database-job"
             assert len(docs[0]["subjects"]) == 7
+
+    def 
test_deprecated_default_user_disabled_excludes_create_user_subject(self):
+        """webserver.defaultUser.enabled=false should exclude the 
create-user-job service account."""
+        docs = render_chart(
+            values={
+                "multiNamespaceMode": False,
+                "cleanup": {"enabled": False},
+                "databaseCleanup": {"enabled": False},
+                "flower": {"enabled": False},
+                "statsd": {"enabled": False},
+                "rbac": {"create": True, "createSCCRoleBinding": True},
+                "webserver": {
+                    "defaultUser": {
+                        "enabled": False,
+                        "role": "Admin",
+                        "username": "admin",
+                        "email": "[email protected]",
+                        "firstName": "admin",
+                        "lastName": "user",
+                        "password": "admin",
+                    }
+                },
+            },
+            
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
+        )
+
+        assert len(docs) == 1
+        subject_names = [s["name"] for s in docs[0]["subjects"]]
+        assert "release-name-airflow-create-user-job" not in subject_names

Reply via email to