diff --git a/chart/templates/_helpers.yaml b/chart/templates/_helpers.yaml index f3cafc03731b0..074ecc7d4914c 100644 --- a/chart/templates/_helpers.yaml +++ b/chart/templates/_helpers.yaml @@ -443,6 +443,17 @@ server_tls_key_file = /etc/pgbouncer/server.key {{ (printf "%s/webserver_config.py" .Values.airflowHome) | quote }} {{- end }} +{{ define "airflow_webserver_config_configmap_name" -}} +{{ default (printf "%s-webserver-config" .Release.Name) .Values.webserver.webserverConfigConfigMapName }} +{{- end }} + +{{ define "airflow_webserver_config_mount" -}} +- name: webserver-config + mountPath: {{ template "airflow_webserver_config_path" . }} + subPath: webserver_config.py + readOnly: True +{{- end -}} + {{ define "airflow_local_setting_path" -}} {{ (printf "%s/config/airflow_local_settings.py" .Values.airflowHome) | quote }} {{- end }} diff --git a/chart/templates/configmaps/webserver-configmap.yaml b/chart/templates/configmaps/webserver-configmap.yaml index e8d5ca016e725..26fb5094d969e 100644 --- a/chart/templates/configmaps/webserver-configmap.yaml +++ b/chart/templates/configmaps/webserver-configmap.yaml @@ -18,11 +18,11 @@ ################################ ## Airflow ConfigMap ################################# -{{- if .Values.webserver.webserverConfig }} +{{- if and .Values.webserver.webserverConfig (not .Values.webserver.webserverConfigConfigMapName) }} apiVersion: v1 kind: ConfigMap metadata: - name: {{ .Release.Name }}-webserver-config + name: {{ template "airflow_webserver_config_configmap_name" . }} labels: tier: airflow component: config diff --git a/chart/templates/scheduler/scheduler-deployment.yaml b/chart/templates/scheduler/scheduler-deployment.yaml index 89e5ab3d8c98e..9f8411c716b07 100644 --- a/chart/templates/scheduler/scheduler-deployment.yaml +++ b/chart/templates/scheduler/scheduler-deployment.yaml @@ -139,6 +139,9 @@ spec: {{- include "airflow_config_mount" . | nindent 12 }} {{- if .Values.scheduler.extraVolumeMounts }} {{ toYaml .Values.scheduler.extraVolumeMounts | indent 12 }} +{{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} args: {{- include "wait-for-migrations-command" . | indent 10 }} @@ -204,6 +207,9 @@ spec: - name: logs mountPath: {{ template "airflow_logs" . }} {{- include "airflow_config_mount" . | nindent 12 }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} +{{- end }} {{- if and $localOrDagProcessorDisabled (or .Values.dags.persistence.enabled .Values.dags.gitSync.enabled) }} {{- include "airflow_dags_mount" . | nindent 12 }} {{- end }} @@ -235,6 +241,9 @@ spec: mountPath: {{ template "airflow_logs" . }} {{- if .Values.scheduler.extraVolumeMounts }} {{ toYaml .Values.scheduler.extraVolumeMounts | indent 12 }} +{{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} {{- end }} {{- if .Values.scheduler.extraContainers }} @@ -244,6 +253,11 @@ spec: - name: config configMap: name: {{ template "airflow_config" . }} + {{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} + - name: webserver-config + configMap: + name: {{ template "airflow_webserver_config_configmap_name" . }} + {{- end }} {{- if $localOrDagProcessorDisabled }} {{- if .Values.dags.persistence.enabled }} - name: dags diff --git a/chart/templates/triggerer/triggerer-deployment.yaml b/chart/templates/triggerer/triggerer-deployment.yaml index d79bc5ccc4a94..33f478caed651 100644 --- a/chart/templates/triggerer/triggerer-deployment.yaml +++ b/chart/templates/triggerer/triggerer-deployment.yaml @@ -120,6 +120,9 @@ spec: {{- if .Values.triggerer.extraVolumeMounts }} {{ toYaml .Values.triggerer.extraVolumeMounts | nindent 12 }} {{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} +{{- end }} args: {{- include "wait-for-migrations-command" . | nindent 10 }} envFrom: @@ -156,6 +159,9 @@ spec: - name: logs mountPath: {{ template "airflow_logs" . }} {{- include "airflow_config_mount" . | nindent 12 }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} +{{- end }} {{- if or .Values.dags.persistence.enabled .Values.dags.gitSync.enabled }} {{- include "airflow_dags_mount" . | nindent 12 }} {{- end }} @@ -187,6 +193,11 @@ spec: - name: config configMap: name: {{ template "airflow_config" . }} + {{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} + - name: webserver-config + configMap: + name: {{ template "airflow_webserver_config_configmap_name" . }} + {{- end }} {{- if .Values.dags.persistence.enabled }} - name: dags persistentVolumeClaim: diff --git a/chart/templates/webserver/webserver-deployment.yaml b/chart/templates/webserver/webserver-deployment.yaml index e745eed6a8a2a..81d97ab83d88b 100644 --- a/chart/templates/webserver/webserver-deployment.yaml +++ b/chart/templates/webserver/webserver-deployment.yaml @@ -131,6 +131,9 @@ spec: {{- include "airflow_config_mount" . | nindent 12 }} {{- if .Values.webserver.extraVolumeMounts }} {{ toYaml .Values.webserver.extraVolumeMounts | indent 12 }} +{{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} args: {{- include "wait-for-migrations-command" . | indent 10 }} @@ -169,11 +172,8 @@ spec: readOnly: true {{- end }} {{- include "airflow_config_mount" . | nindent 12 }} -{{- if .Values.webserver.webserverConfig }} - - name: webserver-config - mountPath: {{ template "airflow_webserver_config_path" . }} - subPath: webserver_config.py - readOnly: true +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} {{- if and (semverCompare "<2.0.0" .Values.airflowVersion) (or .Values.dags.gitSync.enabled .Values.dags.persistence.enabled) }} {{- include "airflow_dags_mount" . | nindent 12 }} @@ -232,10 +232,10 @@ spec: - name: config configMap: name: {{ template "airflow_config" . }} - {{- if .Values.webserver.webserverConfig }} + {{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} - name: webserver-config configMap: - name: {{ .Release.Name }}-webserver-config + name: {{ template "airflow_webserver_config_configmap_name" . }} {{- end }} {{- if (semverCompare "<2.0.0" .Values.airflowVersion) }} {{- if .Values.dags.persistence.enabled }} diff --git a/chart/templates/workers/worker-deployment.yaml b/chart/templates/workers/worker-deployment.yaml index c60b09ce3e418..5e8969b669c49 100644 --- a/chart/templates/workers/worker-deployment.yaml +++ b/chart/templates/workers/worker-deployment.yaml @@ -149,6 +149,9 @@ spec: {{- include "airflow_config_mount" . | nindent 12 }} {{- if .Values.workers.extraVolumeMounts }} {{ toYaml .Values.workers.extraVolumeMounts | indent 12 }} +{{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} args: {{- include "wait-for-migrations-command" . | indent 10 }} @@ -216,6 +219,9 @@ spec: {{- if or .Values.dags.persistence.enabled .Values.dags.gitSync.enabled }} {{- include "airflow_dags_mount" . | nindent 12 }} {{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} +{{- end }} envFrom: {{- include "custom_airflow_environment_from" . | default "\n []" | indent 10 }} env: @@ -257,6 +263,9 @@ spec: {{- if .Values.workers.extraVolumeMounts }} {{ toYaml .Values.workers.extraVolumeMounts | indent 12 }} {{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} +{{- end }} {{- end }} {{- if .Values.workers.kerberosSidecar.enabled }} - name: worker-kerberos @@ -282,6 +291,9 @@ spec: readOnly: false {{- if .Values.workers.extraVolumeMounts }} {{ toYaml .Values.workers.extraVolumeMounts | indent 12 }} +{{- end }} +{{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} +{{ include "airflow_webserver_config_mount" . | indent 12 }} {{- end }} envFrom: {{- include "custom_airflow_environment_from" . | default "\n []" | indent 10 }} @@ -303,6 +315,11 @@ spec: - name: config configMap: name: {{ template "airflow_config" . }} + {{- if or .Values.webserver.webserverConfig .Values.webserver.webserverConfigConfigMapName }} + - name: webserver-config + configMap: + name: {{ template "airflow_webserver_config_configmap_name" . }} + {{- end }} {{- if .Values.kerberos.enabled }} - name: kerberos-keytab secret: diff --git a/chart/values.schema.json b/chart/values.schema.json index b9cb8fd1a5afa..96506e24c4e0d 100644 --- a/chart/values.schema.json +++ b/chart/values.schema.json @@ -3429,7 +3429,7 @@ } }, "webserverConfig": { - "description": "This string (can be templated) will be mounted into the Airflow webserver as a custom `webserver_config.py`. You can bake a `webserver_config.py` in to your image instead.", + "description": "This string (can be templated) will be mounted into the Airflow webserver as a custom `webserver_config.py`. You can bake a `webserver_config.py` in to your image instead or specify a configmap containing the webserver_config.py.", "type": [ "string", "null" @@ -3440,6 +3440,18 @@ "from airflow import configuration as conf\n\n# The SQLAlchemy connection string.\nSQLALCHEMY_DATABASE_URI = conf.get('database', 'SQL_ALCHEMY_CONN')\n\n# Flask-WTF flag for CSRF\nCSRF_ENABLED = True" ] }, + "webserverConfigConfigMapName": { + "description": "The configmap name containing the webserver_config.py.", + "type": [ + "string", + "null" + ], + "x-docsSection": "Common", + "default": null, + "examples": [ + "my-webserver-configmap" + ] + }, "service": { "description": "Webserver Service configuration.", "type": "object", diff --git a/chart/values.yaml b/chart/values.yaml index b05ddf4d58e21..22bba7da14fc8 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -970,8 +970,10 @@ webserver: extraVolumes: [] extraVolumeMounts: [] - # This string (can be templated) will be mounted into the Airflow Webserver as a custom - # webserver_config.py. You can bake a webserver_config.py in to your image instead. + # This string (can be templated) will be mounted into the Airflow Webserver + # as a custom webserver_config.py. You can bake a webserver_config.py in to + # your image instead or specify a configmap containing the + # webserver_config.py. webserverConfig: ~ # webserverConfig: | # from airflow import configuration as conf @@ -981,6 +983,7 @@ webserver: # # Flask-WTF flag for CSRF # CSRF_ENABLED = True + webserverConfigConfigMapName: ~ service: type: ClusterIP diff --git a/tests/charts/test_airflow_common.py b/tests/charts/test_airflow_common.py index 2a983c194e541..bb1389334d16e 100644 --- a/tests/charts/test_airflow_common.py +++ b/tests/charts/test_airflow_common.py @@ -89,6 +89,42 @@ def test_dags_mount(self, dag_values, expected_mount): for doc in docs: assert expected_mount in jmespath.search("spec.template.spec.containers[0].volumeMounts", doc) + def test_webserver_config_configmap_name_volume_mounts(self): + configmap_name = "my-configmap" + docs = render_chart( + values={ + "webserver": { + "webserverConfig": "CSRF_ENABLED = True # {{ .Release.Name }}", + "webserverConfigConfigMapName": configmap_name, + }, + "workers": {"kerberosSidecar": {"enabled": True}}, + }, + show_only=[ + "templates/scheduler/scheduler-deployment.yaml", + "templates/triggerer/triggerer-deployment.yaml", + "templates/webserver/webserver-deployment.yaml", + "templates/workers/worker-deployment.yaml", + ], + ) + for index in range(len(docs)): + print(docs[index]) + assert "webserver-config" in [ + c["name"] + for r in jmespath.search( + "spec.template.spec.initContainers[?name=='wait-for-airflow-migrations'].volumeMounts", + docs[index], + ) + for c in r + ] + for container in jmespath.search("spec.template.spec.containers", docs[index]): + assert "webserver-config" in [c["name"] for c in jmespath.search("volumeMounts", container)] + assert "webserver-config" in [ + c["name"] for c in jmespath.search("spec.template.spec.volumes", docs[index]) + ] + assert configmap_name == jmespath.search( + "spec.template.spec.volumes[?name=='webserver-config'].configMap.name | [0]", docs[index] + ) + def test_annotations(self): """ Test Annotations are correctly applied on all pods created Scheduler, Webserver & Worker diff --git a/tests/charts/test_webserver.py b/tests/charts/test_webserver.py index dbe8a80dd96d2..c5551e730bb84 100644 --- a/tests/charts/test_webserver.py +++ b/tests/charts/test_webserver.py @@ -758,6 +758,18 @@ def test_no_webserver_config_configmap_by_default(self): docs = render_chart(show_only=["templates/configmaps/webserver-configmap.yaml"]) assert 0 == len(docs) + def test_no_webserver_config_configmap_with_configmap_name(self): + docs = render_chart( + values={ + "webserver": { + "webserverConfig": "CSRF_ENABLED = True # {{ .Release.Name }}", + "webserverConfigConfigMapName": "my-configmap", + } + }, + show_only=["templates/configmaps/webserver-configmap.yaml"], + ) + assert 0 == len(docs) + def test_webserver_config_configmap(self): docs = render_chart( values={"webserver": {"webserverConfig": "CSRF_ENABLED = True # {{ .Release.Name }}"}},