# 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.
---
# Default values for Airflow.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

# Provide a name to substitute for the full names of resources
fullnameOverride: ""

# Provide a name to substitute for the name of the chart
nameOverride: ""

# Use standard naming for all resources using airflow.fullname template
# Consider removing this later and default it to true
# to make this chart follow standard naming conventions using the fullname template.
# For now this is an opt-in switch for backwards compatibility to leverage the standard naming convention
# and being able to use fully fullnameOverride and nameOverride in all resources
# For new installations - it is recommended to set it to True to follow standard naming conventions
# For existing installations, this will rename and redeploy your resources with the new names. Be aware that
# this will recreate your Deployment/StatefulSets along with their persistent volume claims and data storage
# migration may be needed to keep your old data
useStandardNaming: false

# Max number of old replicasets to retain. Can be overridden by each Deployment's revisionHistoryLimit
revisionHistoryLimit: ~

# User and group of Airflow user
uid: 50000
gid: 0

# Default security context for Airflow (deprecated, use `securityContexts` instead)
securityContext: {}
#  runAsUser: 50000
#  fsGroup: 0
#  runAsGroup: 0

# Detailed default security context for Airflow Deployments
securityContexts:
  pod: {}
  containers: {}

# Global container lifecycle hooks for Airflow containers
containerLifecycleHooks: {}

# Airflow home directory
# Used for mount paths
airflowHome: /opt/airflow

# Default Airflow repository -- overridden by all the specific images below
defaultAirflowRepository: apache/airflow

# Default Airflow tag to deploy
defaultAirflowTag: "3.2.0"

# Default Airflow digest. If specified, it takes precedence over tag
defaultAirflowDigest: ~

# Airflow version (Used to make some decisions based on Airflow Version being deployed)
# Version 2.11.0 and above is supported.
airflowVersion: "3.2.0"

images:
  airflow:
    repository: ~
    tag: ~
    # Specifying digest takes precedence over tag.
    digest: ~
    pullPolicy: IfNotPresent
  # To avoid images with user code, you can turn this to 'true' and
  # all the 'run-airflow-migrations' and 'wait-for-airflow-migrations' jobs/containers
  # will use the images from 'defaultAirflowRepository:defaultAirflowTag' values
  # to run and wait for DB migrations .
  useDefaultImageForMigration: false
  # timeout (in seconds) for airflow-migrations to complete
  migrationsWaitTimeout: 60
  pod_template:
    # Note that `images.pod_template.repository` and `images.pod_template.tag` parameters can be overridden
    # in `config.kubernetes_executor` section. So for these parameters to have effect
    # `config.kubernetes_executor.worker_container_repository` and
    # `config.kubernetes_executor.worker_container_tag` must be not set .
    repository: ~
    tag: ~
    pullPolicy: IfNotPresent
  flower:
    repository: ~
    tag: ~
    pullPolicy: IfNotPresent
  statsd:
    repository: quay.io/prometheus/statsd-exporter
    tag: v0.29.0
    pullPolicy: IfNotPresent
  redis:
    repository: redis
    # Redis is limited to 7.2-bookworm due to licencing change
    # https://redis.io/blog/redis-adopts-dual-source-available-licensing/
    tag: 7.2-bookworm
    pullPolicy: IfNotPresent
  pgbouncer:
    repository: apache/airflow
    tag: airflow-pgbouncer-2025.03.05-1.23.1
    pullPolicy: IfNotPresent
  pgbouncerExporter:
    repository: apache/airflow
    tag: airflow-pgbouncer-exporter-2025.03.05-0.18.0
    pullPolicy: IfNotPresent
  gitSync:
    repository: registry.k8s.io/git-sync/git-sync
    tag: v4.4.2
    pullPolicy: IfNotPresent

# Select certain nodes for Airflow pods.
nodeSelector: {}
affinity: {}
tolerations: []
topologySpreadConstraints: []
schedulerName: ~

# Add common labels to all objects and pods defined in this chart.
labels: {}

# List of existing Kubernetes secrets containing Base64 encoded credentials to connect to private
# registries. Items can be either strings or {name: secret} objects.
imagePullSecrets: []

# Ingress configuration
ingress:
  # Enable all ingress resources
  # (deprecated, use
  #   `ingress.web.enabled`,
  #   `ingress.apiServer.enabled` and/or
  #   `ingress.flower.enabled`
  # instead)
  enabled: ~

  # Configs for the Ingress of the API Server (Airflow 3+)
  apiServer:
    # Enable API Server ingress resource
    enabled: false

    # Annotations for the API Server Ingress
    annotations: {}

    # The path for the API Server Ingress
    path: "/"

    # The pathType for the above path
    pathType: "ImplementationSpecific"

    # The hostname for the API Server Ingress (deprecated, use `ingress.apiServer.hosts` instead)
    host: ""

    # The hostnames or hosts configuration for the API Server Ingress (templated)
    hosts: []
    # - name: ""
    #   # configs for API Server Ingress TLS
    #   tls:
    #     # Enable TLS termination for the API Server Ingress
    #     enabled: false
    #     # The name of a pre-created Secret containing a TLS private key and certificate
    #     secretName: ""

    # The Ingress Class for the API Server Ingress
    ingressClassName: ""

    # Configs for API Server Ingress TLS (deprecated, use `ingress.apiServer.hosts[*].tls` instead)
    tls:
      # Enable TLS termination for the API Server Ingress
      enabled: false
      # The name of a pre-created Secret containing a TLS private key and certificate
      secretName: ""

    # HTTP paths to add to the API Server Ingress before the default path
    precedingPaths: []

    # HTTP paths to add to the API Server Ingress after the default path
    succeedingPaths: []

  # Configs for the Ingress of the web Service (Airflow <3.0.0)
  web:
    # Enable web ingress resource
    enabled: false

    # Annotations for the web Ingress
    annotations: {}

    # The path for the web Ingress
    path: "/"

    # The pathType for the above path
    pathType: "ImplementationSpecific"

    # The hostname for the web Ingress (deprecated, use `ingress.web.hosts` instead)
    host: ""

    # The hostnames or hosts configuration for the web Ingress (templated)
    hosts: []
    # - name: ""
    #   # Configs for web Ingress TLS
    #   tls:
    #     # Enable TLS termination for the web Ingress
    #     enabled: false
    #     # The name of a pre-created Secret containing a TLS private key and certificate
    #     secretName: ""

    # The Ingress Class for the web Ingress
    ingressClassName: ""

    # Configs for web Ingress TLS (deprecated, use `ingress.web.hosts[*].tls` instead)
    tls:
      # Enable TLS termination for the web Ingress
      enabled: false
      # The name of a pre-created Secret containing a TLS private key and certificate
      secretName: ""

    # HTTP paths to add to the web Ingress before the default path
    precedingPaths: []

    # HTTP paths to add to the web Ingress after the default path
    succeedingPaths: []

  # Configs for the Ingress of the flower Service
  flower:
    # Enable web ingress resource
    enabled: false

    # Annotations for the flower Ingress
    annotations: {}

    # The path for the flower Ingress
    path: "/"

    # The pathType for the above path
    pathType: "ImplementationSpecific"

    # The hostname for the flower Ingress (deprecated, use `ingress.flower.hosts` instead)
    host: ""

    # The hostnames or hosts configuration for the flower Ingress (templated)
    hosts: []
    # - name: ""
    #   tls:
    #     # Enable TLS termination for the flower Ingress
    #     enabled: false
    #     # The name of a pre-created Secret containing a TLS private key and certificate
    #     secretName: ""

    # The Ingress Class for the flower Ingress
    ingressClassName: ""

    # Configs for flower Ingress TLS (deprecated, use `ingress.flower.hosts[*].tls` instead)
    tls:
      # Enable TLS termination for the flower Ingress
      enabled: false
      # The name of a pre-created Secret containing a TLS private key and certificate
      secretName: ""

  # Configs for the Ingress of the StatsD Service
  statsd:
    # Enable web ingress resource
    enabled: false

    # Annotations for the StatsD Ingress
    annotations: {}

    # The path for the StatsD Ingress
    path: "/metrics"

    # The pathType for the above path
    pathType: "ImplementationSpecific"

    # The hostname for the StatsD Ingress (deprecated, use `ingress.statsd.hosts` instead)
    host: ""

    # The hostnames or hosts configuration for the StatsD Ingress (templated)
    hosts: []
    # - name: ""
    #   tls:
    #     # Enable TLS termination for the StatsD Ingress
    #     enabled: false
    #     # The name of a pre-created Secret containing a TLS private key and certificate
    #     secretName: ""

    # The Ingress Class for the StatsD Ingress
    ingressClassName: ""

  # Configs for the Ingress of the PgBouncer Service
  pgbouncer:
    # Enable web ingress resource
    enabled: false

    # Annotations for the PgBouncer Ingress
    annotations: {}

    # The path for the PgBouncer Ingress
    path: "/metrics"

    # The pathType for the above path
    pathType: "ImplementationSpecific"

    # The hostname for the PgBouncer Ingress (deprecated, use `ingress.pgbouncer.hosts` instead)
    host: ""

    # The hostnames or hosts configuration for the PgBouncer Ingress (templated)
    hosts: []
    # - name: ""
    #   tls:
    #     # Enable TLS termination for the PgBouncer Ingress
    #     enabled: false
    #     # The name of a pre-created Secret containing a TLS private key and certificate
    #     secretName: ""

    # The Ingress Class for the PgBouncer Ingress
    ingressClassName: ""

# Network policy configuration
networkPolicies:
  # Enabled network policies
  enabled: false

# Extra annotations to apply to all Airflow pods (templated)
airflowPodAnnotations: {}

# Extra annotations to apply to main Airflow ConfigMap
airflowConfigAnnotations: {}

# 'airflow_local_settings' file as a string (templated)
airflowLocalSettings: |-
  {{- if semverCompare "<3.0.0" .Values.airflowVersion }}
  {{- if not (or .Values.webserverSecretKey .Values.webserverSecretKeySecretName) }}
  from airflow.www.utils import UIAlert

  DASHBOARD_UIALERTS = [
    UIAlert(
      'Usage of a dynamic webserver secret key detected. We recommend a static webserver secret key instead.'
      ' See the <a href='
      '"https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#webserver-secret-key" '
      'target="_blank" rel="noopener noreferrer">'
      'Helm Chart Production Guide</a> for more details.',
      category="warning",
      roles=["Admin"],
      html=True,
    )
  ]
  {{- end }}
  {{- end }}

# Enable RBAC (default on most clusters these days)
rbac:
  # Specifies whether RBAC resources should be created
  create: true
  createSCCRoleBinding: false

# Airflow executor
# One or multiple of: LocalExecutor, CeleryExecutor, KubernetesExecutor
# For Airflow <3.0, LocalKubernetesExecutor and CeleryKubernetesExecutor are supported.
# Specify executors in a prioritized list to leverage multiple execution environments as needed:
# https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/executor/index.html#using-multiple-executors-concurrently
executor: "CeleryExecutor"

# If this is true and using LocalExecutor/KubernetesExecutor/CeleryKubernetesExecutor, the scheduler's
# Service Account will have access to communicate with the api-server and launch pods/jobs.
# If this is true and using CeleryExecutor/KubernetesExecutor/CeleryKubernetesExecutor, the workers
# will be able to launch pods/jobs.
allowPodLaunching: true
allowJobLaunching: false

# Environment variables for all Airflow containers
env: []
# - name: ""
#   value: ""

# Volumes for all Airflow containers
volumes: []

# VolumeMounts for all Airflow containers
volumeMounts: []

# Secrets for all Airflow containers
secret: []
# - envName: ""
#   secretName: ""
#   secretKey: ""

# Enables selected built-in secrets that are set via environment variables by default.
# Those secrets are provided by the Helm Chart secrets by default but in some cases you
# might want to provide some of those variables with _CMD or _SECRET variable, and you should
# in this case disable setting of those variables by setting the relevant configuration to 'false'.
enableBuiltInSecretEnvVars:
  AIRFLOW__CORE__FERNET_KEY: true
  AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: true
  AIRFLOW_CONN_AIRFLOW_DB: true
  AIRFLOW__API__SECRET_KEY: true
  AIRFLOW__API_AUTH__JWT_SECRET: true
  AIRFLOW__WEBSERVER__SECRET_KEY: true
  AIRFLOW__CELERY__RESULT_BACKEND: true
  AIRFLOW__CELERY__BROKER_URL: true
  AIRFLOW__ELASTICSEARCH__HOST: true
  AIRFLOW__OPENSEARCH__HOST: true

# Priority Classes that will be installed by charts.
# Ideally, there should be an entry for dagProcessor, flower,
#   pgbouncer, scheduler, statsd, triggerer, webserver/api-server, worker.
# The format for priorityClasses is an array with each element having:
#   * name is the name of the priorityClass. Ensure the same name is given to the respective section as well
#   * preemptionPolicy for the priorityClass
#   * value is the preemption value for the priorityClass
priorityClasses: []
#  - name: class1 (if this is for dagProcessor, ensure overriding `dagProcessor.priorityClass` too)
#    preemptionPolicy: PreemptLowerPriority
#    value: 10000
#  - name: class2
#    preemptionPolicy: Never
#    value: 100000

# Extra secrets that will be managed by the chart
# (You can use them with `extraEnv` or `extraEnvFrom` or some of the `extraVolumes` values).
# The format for secret data is "key/value" where
#    * key (templated) is the name of the secret that will be created
#    * value: an object with the standard 'data' or 'stringData' key (or both).
#          The value associated with those keys must be a string (templated)
extraSecrets: {}
# extraSecrets:
#   '{{ .Release.Name }}-airflow-connections':
#     type: 'Opaque'
#     labels:
#       my.custom.label/v1: my_custom_label_value_1
#     data: |
#       AIRFLOW_CONN_GCP: 'base64_encoded_gcp_conn_string'
#       AIRFLOW_CONN_AWS: 'base64_encoded_aws_conn_string'
#     stringData: |
#       AIRFLOW_CONN_OTHER: 'other_conn'
#   '{{ .Release.Name }}-other-secret-name-suffix':
#     data: |
#        ...
#   'proxy-config':
#     stringData: |
#        HTTP_PROXY: http://proxy_user:proxy_password@192.168.0.10:2080
#        HTTPS_PROXY: http://proxy_user:proxy_password@192.168.0.10:2080
#        NO_PROXY: "localhost,127.0.0.1,.svc.cluster.local,kubernetes.default.svc"

# Extra ConfigMaps that will be managed by the chart
# (You can use them with `extraEnv` or `extraEnvFrom` or some of the `extraVolumes` values).
# The format for ConfigMap data is "key/value" where
#    * key (templated) is the name of the ConfigMap that will be created
#    * value: an object with the standard 'data' key.
#          The value associated with this keys must be a string (templated)
extraConfigMaps: {}
# extraConfigMaps:
#   '{{ .Release.Name }}-airflow-variables':
#     labels:
#       my.custom.label/v2: my_custom_label_value_2
#     data: |
#       AIRFLOW_VAR_HELLO_MESSAGE: "Hi!"
#       AIRFLOW_VAR_KUBERNETES_NAMESPACE: "{{ .Release.Namespace }}"

# Extra env 'items' that will be added to the definition of Airflow containers
# a string is expected (templated).
# TODO: difference from `env`? This is a templated string. Probably should template `env` and remove this.
extraEnv: ~
# extraEnv: |
#   - name: AIRFLOW__CORE__LOAD_EXAMPLES
#     value: 'True'

# Extra envFrom 'items' that will be added to the definition of Airflow containers
# A string is expected (templated).
extraEnvFrom: ~
# extraEnvFrom: |
#   - secretRef:
#       name: '{{ .Release.Name }}-airflow-connections'
#   - configMapRef:
#       name: '{{ .Release.Name }}-airflow-variables'

# Airflow database & redis config
data:
  # If secret name is provided, secret itself has to be created manually with 'connection' key like:
  #
  # kind: Secret
  # apiVersion: v1
  # metadata:
  #   name: custom-airflow-metadata-secret
  # type: Opaque
  # data:
  #   connection: base64_encoded_connection_string
  #
  # The 'connection' key is base64-encoded SQLAlchemy connection string, e.g.:
  #   postgresql+psycopg2://airflow:password@postgres/airflow
  metadataSecretName: ~

  # If not set, falls back to metadataSecretName. The secret must contain 'connection' key which is
  # a base64-encoded connection string, e.g.:
  #   postgresql+psycopg2://user:password@host/db
  resultBackendSecretName: ~

  brokerUrlSecretName: ~

  # If `metadataSecretName` is not specified, pass connection values below
  metadataConnection:
    user: postgres
    pass: postgres
    protocol: postgresql
    host: ~
    port: 5432
    db: postgres
    sslmode: disable
    # Add custom annotations to the metadata connection secret
    secretAnnotations: {}

  # `resultBackendConnection` defaults to the same database as metadataConnection
  resultBackendConnection: ~
  # or, you can use a different database like:
  # resultBackendConnection:
  #   user: postgres
  #   pass: postgres
  #   protocol: postgresql
  #   host: ~
  #   port: 5432
  #   db: postgres
  #   sslmode: disable

  # Add custom annotations to the result backend connection secret
  resultBackendConnectionSecretAnnotations: {}

  # Note: `brokerUrl` can only be set during 'helm install', not 'helm upgrade' command
  brokerUrl: ~

  # Add custom annotations to the broker url secret
  brokerUrlSecretAnnotations: {}

# Fernet key settings
# Note: `fernetKey` can only be set during 'helm install', not 'helm upgrade' command
fernetKey: ~

# If set, the secret must contain a 'fernet-key' key with a base64-encoded key value
fernetKeySecretName: ~
# Fernet key secret example:
#  kind: Secret
#  apiVersion: v1
#  metadata:
#    name: custom-fernet-key-secret
#  type: Opaque
#  data:
#    fernet-key: <base64_encoded_fernet_key>

# Add custom annotations to the fernet key secret
fernetKeySecretAnnotations: {}

# Flask secret key for Airflow 3+ Api: '[api] secret_key' in airflow.cfg
apiSecretKey: ~

# Add custom annotations to the api secret
apiSecretAnnotations: {}

# If set, the secret must contain a key 'api-secret-key' with a base64-encoded key value
apiSecretKeySecretName: ~
# API secret key example:
#  kind: Secret
#  apiVersion: v1
#  metadata:
#    name: custom-api-secret
#  type: Opaque
#  data:
#    api-secret-key: <base64_encoded_api_secret_key>

# Secret key used to encode and decode JWTs: '[api_auth] jwt_secret' in airflow.cfg
# Note: It is not advised to use in production as during helm upgrade it will be changed
# which can cause dag failures during component rollouts
jwtSecret: ~

# Add custom annotations to the JWT secret
jwtSecretAnnotations: {}

# If set, the secret must contain a key 'jwt-secret' with a base64-encoded key value
jwtSecretName: ~
# JWT secret example:
#  kind: Secret
#  apiVersion: v1
#  metadata:
#    name: custom-jwt-secret
#  type: Opaque
#  data:
#    jwt-secret: <base64_encoded_jwt_secret>

# Flask secret key for Airflow <3 Webserver: '[webserver] secret_key' in airflow.cfg
# (deprecated, use `apiSecretKey` instead (Airflow 3+))
webserverSecretKey: ~

# Add custom annotations to the webserver secret
# (deprecated, use `apiSecretAnnotations` instead (Airflow 3+))
webserverSecretAnnotations: {}

# If set, the secret must contain a key 'webserver-secret-key' with a base64-encoded key value
# (deprecated, use `apiSecretKeySecretName` instead (Airflow 3+))
webserverSecretKeySecretName: ~
# Webserver secret key secret example:
#  kind: Secret
#  apiVersion: v1
#  metadata:
#    name: custom-webserver-secret
#  type: Opaque
#  data:
#    webserver-secret-key: <base64_encoded_secret_key>

# In order to use kerberos you need to create secret containing the keytab file.
# The secret name should follow naming convention of the application where resources are
# name '{{ .Release.Name }}-<postfix>'. In case of the keytab file, the '<postfix>' is "kerberos-keytab".
# If your release is named "my-release" the name of the secret should be "my-release-kerberos-keytab".
#
# The Keytab content should be available in the "kerberos.keytab" key of the secret.
#  apiVersion: v1
#  kind: Secret
#  data:
#    kerberos.keytab: <base64_encoded keytab file content>
#  type: Opaque
#
#  If you have keytab file you can do it with similar:
#   kubectl create secret generic {{ .Release.Name }}-kerberos-keytab --from-file=kerberos.keytab
#
#  Alternatively, instead of manually creating the secret, it is possible to specify
#  `kerberos.keytabBase64Content` parameter. This parameter should contain base64 encoded keytab.
kerberos:
  enabled: false
  ccacheMountPath: /var/kerberos-ccache
  ccacheFileName: cache
  configPath: /etc/krb5.conf
  keytabBase64Content: ~
  keytabPath: /etc/airflow.keytab
  principal: airflow@FOO.COM
  reinitFrequency: 3600
  config: |
    # This is an example config showing how you can use templating and how "example" config
    # might look like. It works with the test kerberos server that we are using during integration
    # testing at Apache Airflow (see 'scripts/ci/docker-compose/integration-kerberos.yml' but in
    # order to make it production-ready you must replace it with your own configuration that
    # Matches your kerberos deployment. Administrators of your Kerberos instance should
    # provide the right configuration.

    [logging]
    default = "FILE:{{ template "airflow_logs_no_quote" . }}/kerberos_libs.log"
    kdc = "FILE:{{ template "airflow_logs_no_quote" . }}/kerberos_kdc.log"
    admin_server = "FILE:{{ template "airflow_logs_no_quote" . }}/kadmind.log"

    [libdefaults]
    default_realm = FOO.COM
    ticket_lifetime = 10h
    renew_lifetime = 7d
    forwardable = true

    [realms]
    FOO.COM = {
      kdc = kdc-server.foo.com
      admin_server = admin_server.foo.com
    }

# Airflow Worker Config
workers:
  # Number of Airflow Celery workers (deprecated, use `workers.celery.replicas` instead)
  replicas: 1

  # Max number of old Airflow Celery workers ReplicaSets to retain
  # (deprecated, use `workers.celery.revisionHistoryLimit` instead)
  revisionHistoryLimit: ~

  # Command to use when running Airflow Celery workers and using pod-template-file (templated)
  # (deprecated, use `workers.celery.command` and/or `workers.kubernetes.command` instead)
  command: ~

  # Args to use when running Airflow Celery workers (templated)
  # (deprecated, use `workers.celery.args` instead)
  args:
    - "bash"
    - "-c"
    # The format below is necessary to get `helm lint` happy
    - |-
      exec \
      airflow celery worker
      {{- if and .Values.workers.queue (ne .Values.workers.queue "default") }}
      {{- " -q " }}{{ .Values.workers.queue }}
      {{- end }}

  # If the Airflow Celery worker stops responding for 5 minutes (5*60s)
  # kill the worker and let Kubernetes restart it
  # (deprecated, use `workers.celery.livenessProbe` section instead)
  livenessProbe:
    # (deprecated, use `workers.celery.livenessProbe.enabled` instead)
    enabled: true
    # (deprecated, use `workers.celery.livenessProbe.initialDelaySeconds` instead)
    initialDelaySeconds: 10
    # (deprecated, use `workers.celery.livenessProbe.timeoutSeconds` instead)
    timeoutSeconds: 20
    # (deprecated, use `workers.celery.livenessProbe.failureThreshold` instead)
    failureThreshold: 5
    # (deprecated, use `workers.celery.livenessProbe.periodSeconds` instead)
    periodSeconds: 60
    # (deprecated, use `workers.celery.livenessProbe.command` instead)
    command: ~

  # Update Strategy when Airflow Celery worker is deployed as a StatefulSet
  # (deprecated, use `workers.celery.updateStrategy` instead)
  updateStrategy: ~
  # Update Strategy when Airflow Celery worker is deployed as a Deployment
  # (deprecated, use `workers.celery.strategy` instead)
  strategy:
    rollingUpdate:
      maxSurge: "100%"
      maxUnavailable: "50%"

  # Allow relaxing ordering guarantees for Airflow Celery worker while preserving its uniqueness and identity
  # (deprecated, use `workers.celery.podManagementPolicy` instead)
  # podManagementPolicy: Parallel

  # When not set, the values defined in the global securityContext will
  # be used in Airflow Celery workers and pod-template-file
  # (deprecated, use `workers.celery.securityContexts` and/or `workers.kubernetes.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for the
  # Airflow Celery workers and pod-template-file on container and pod level
  # (deprecated, use `workers.celery.securityContexts` and/or `workers.kubernetes.securityContexts` instead)
  securityContexts:
    # (deprecated, use
    #   `workers.celery.securityContexts.pod` and/or
    #   `workers.kubernetes.securityContexts.pod`
    # instead)
    pod: {}
    # (deprecated, use
    #   `workers.celery.securityContexts.container` and/or
    #   `workers.kubernetes.securityContexts.container`
    # instead)
    container: {}

  # Container level Lifecycle Hooks definition for
  # Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use
  #   `workers.celery.containerLifecycleHooks` and/or
  #   `workers.kubernetes.containerLifecycleHooks`
  # instead)
  containerLifecycleHooks: {}

  # Airflow Celery workers pod disruption budget
  # (deprecated, use `workers.celery.podDisruptionBudget` instead)
  podDisruptionBudget:
    # (deprecated, use `workers.celery.podDisruptionBudget.enabled` instead)
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    # (deprecated, use `workers.celery.podDisruptionBudget.config` instead)
    config:
      # (deprecated, use `workers.celery.podDisruptionBudget.config.maxUnavailable` instead)
      maxUnavailable: 1

      # (deprecated, use `workers.celery.podDisruptionBudget.config.minAvailable` instead)
      # minAvailable: 1

  # Create Service Account for Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use `workers.celery.serviceAccount` and/or `workers.kubernetes.serviceAccount` instead)
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    # (deprecated, use
    #   `workers.celery.serviceAccount.automountServiceAccountToken` and/or
    #   `workers.kubernetes.serviceAccount.automountServiceAccountToken`
    # instead)
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    # (deprecated, use
    #   `workers.celery.serviceAccount.create` and/or
    #   `workers.kubernetes.serviceAccount.create`
    # instead)
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    # (deprecated, use
    #   `workers.celery.serviceAccount.name` and/or
    #   `workers.kubernetes.serviceAccount.name`
    # instead)
    name: ~

    # Annotations to add to worker Kubernetes Service Account.
    # (deprecated, use
    #   `workers.celery.serviceAccount.annotations` and/or
    #   `workers.kubernetes.serviceAccount.annotations`
    # instead)
    annotations: {}

  # Allow KEDA autoscaling for Airflow Celery workers
  # (deprecated, use `workers.celery.keda` instead)
  keda:
    # (deprecated, use `workers.celery.keda.enabled` instead)
    enabled: false

    # (deprecated, use `workers.celery.keda.namespaceLabels` instead)
    namespaceLabels: {}

    # How often KEDA polls the Airflow DB to report new scale requests to the HPA
    # (deprecated, use `workers.celery.keda.pollingInterval` instead)
    pollingInterval: 5

    # How many seconds KEDA will wait before scaling to zero.
    # Note: HPA has a separate cooldown period for scale-downs
    # (deprecated, use `workers.celery.keda.cooldownPeriod` instead)
    cooldownPeriod: 30

    # Minimum number of Airflow Celery workers created by keda
    # (deprecated, use `workers.celery.keda.minReplicaCount` instead)
    minReplicaCount: 0

    # Maximum number of Airflow Celery workers created by keda
    # (deprecated, use `workers.celery.keda.maxReplicaCount` instead)
    maxReplicaCount: 10

    # Specify HPA related options
    # (deprecated, use `workers.celery.keda.advanced` instead)
    advanced: {}
    # horizontalPodAutoscalerConfig:
    #   behavior:
    #     scaleDown:
    #       stabilizationWindowSeconds: 300
    #       policies:
    #         - type: Percent
    #           value: 100
    #           periodSeconds: 15

    # Query to use for KEDA autoscaling. Must return a single integer.
    # (deprecated, use `workers.celery.keda.query` instead)
    query: >-
      SELECT ceil(COUNT(*)::decimal / {{ .Values.config.celery.worker_concurrency }})
      FROM task_instance
      WHERE (state='running' OR state='queued')
      AND queue IN (
      {{- range $i, $q := splitList "," .Values.workers.queue -}}
      {{- if $i }},{{ end }}'{{ $q | trim }}'
      {{- end -}}
      )
      {{- if contains "CeleryKubernetesExecutor" .Values.executor }}
      AND queue != '{{ .Values.config.celery_kubernetes_executor.kubernetes_queue }}'
      {{- else if contains "KubernetesExecutor" .Values.executor }}
      AND executor IS DISTINCT FROM 'KubernetesExecutor'
      {{- else if contains "airflow.providers.edge3.executors.EdgeExecutor" .Values.executor }}
      AND executor IS DISTINCT FROM 'EdgeExecutor'
      {{- end }}

    # Weather to use PGBouncer to connect to the database or not when it is enabled
    # This configuration will be ignored if PGBouncer is not enabled
    # (deprecated, use `workers.celery.keda.usePgbouncer` instead)
    usePgbouncer: true

  # Allow HPA for Airflow Celery workers (KEDA must be disabled)
  # (deprecated, use `workers.celery.hpa` instead)
  hpa:
    # (deprecated, use `workers.celery.hpa.enabled` instead)
    enabled: false

    # Minimum number of Airflow Celery workers created by HPA
    # (deprecated, use `workers.celery.hpa.minReplicaCount` instead)
    minReplicaCount: 0

    # Maximum number of Airflow Celery workers created by HPA
    # (deprecated, use `workers.celery.hpa.maxReplicaCount` instead)
    maxReplicaCount: 5

    # Specifications for which to use to calculate the desired replica count
    # (deprecated, use `workers.celery.hpa.metrics` instead)
    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 80

    # Scaling behavior of the target in both Up and Down directions
    # (deprecated, use `workers.celery.hpa.behavior` instead)
    behavior: {}

  # Persistence volume configuration for Airflow Celery workers
  # (deprecated, use `workers.celery.persistence` instead)
  persistence:
    # Enable persistent volumes (deprecated, use `workers.celery.persistence.enabled` instead)
    enabled: true

    # This policy determines whether PVCs should be deleted when StatefulSet is scaled down or removed
    # (deprecated, use `workers.celery.persistence.persistentVolumeClaimRetentionPolicy` instead)
    persistentVolumeClaimRetentionPolicy: ~
    # persistentVolumeClaimRetentionPolicy:
    #   whenDeleted: Delete
    #   whenScaled: Delete

    # Volume size for Airflow Celery worker StatefulSet
    # (deprecated, use `workers.celery.persistence.size` instead)
    size: 100Gi

    # If using a custom storageClass, pass name ref to all StatefulSets here
    # (deprecated, use `workers.celery.persistence.storageClassName` instead)
    storageClassName:

    # Execute init container to chown log directory.
    # This is currently only needed in kind, due to usage
    # of local-path provisioner.
    # (deprecated, use `workers.celery.persistence.fixPermissions` instead)
    fixPermissions: false

    # Annotations to add to Airflow Celery worker volumes
    # (deprecated, use `workers.celery.persistence.annotations` instead)
    annotations: {}

    # Detailed default security context for persistence on container level
    # (deprecated, use `workers.celery.persistence.securityContexts` instead)
    securityContexts:
      # (deprecated, use `workers.celery.persistence.securityContexts.container` instead)
      container: {}

  # Kerberos sidecar configuration for Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use `workers.celery.kerberosSidecar` and/or `workers.kubernetes.kerberosSidecar` instead)
  kerberosSidecar:
    # Enable kerberos sidecar
    # (deprecated, use
    #   `workers.celery.kerberosSidecar.enabled` and/or
    #   `workers.kubernetes.kerberosSidecar.enabled`
    # instead)
    enabled: false

    # (deprecated, use
    #   `workers.celery.kerberosSidecar.resources` and/or
    #   `workers.kubernetes.kerberosSidecar.resources`
    # instead)
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Detailed default security context for kerberos sidecar on container level
    # (deprecated, use
    #   `workers.celery.kerberosSidecar.securityContexts` and/or
    #   `workers.kubernetes.kerberosSidecar.securityContexts`
    # instead)
    securityContexts:
      # (deprecated, use
      #   `workers.celery.kerberosSidecar.securityContexts.container` and/or
      #   `workers.kubernetes.kerberosSidecar.securityContexts.container`
      # instead)
      container: {}

    # Container level lifecycle hooks
    # (deprecated, use
    #   `workers.celery.kerberosSidecar.containerLifecycleHooks` and/or
    #   `workers.kubernetes.kerberosSidecar.containerLifecycleHooks`
    # instead)
    containerLifecycleHooks: {}

  # Kerberos init container configuration for Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use
  #   `workers.celery.kerberosInitContainer` and/or
  #   `workers.kubernetes.kerberosInitContainer`
  # instead)
  kerberosInitContainer:
    # Enable kerberos init container
    # (deprecated, use
    #   `workers.celery.kerberosInitContainer.enabled` and/or
    #   `workers.kubernetes.kerberosInitContainer.enabled`
    # instead)
    enabled: false

    # (deprecated, use
    #   `workers.celery.kerberosInitContainer.resources` and/or
    #   `workers.kubernetes.kerberosInitContainer.resources`
    # instead)
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Detailed default security context for kerberos init container
    # (deprecated, use
    #   `workers.celery.kerberosInitContainer.securityContexts` and/or
    #   `workers.kubernetes.kerberosInitContainer.securityContexts`
    # instead)
    securityContexts:
      # (deprecated, use
      #   `workers.celery.kerberosInitContainer.securityContexts.container` and/or
      #   `workers.kubernetes.kerberosInitContainer.securityContexts.container`
      # instead)
      container: {}

    # Container level lifecycle hooks
    # (deprecated, use
    #   `workers.celery.kerberosInitContainer.containerLifecycleHooks` and/or
    #   `workers.kubernetes.kerberosInitContainer.containerLifecycleHooks`
    # instead)
    containerLifecycleHooks: {}

  # Resource configuration for Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use `workers.celery.resources` and/or `workers.kubernetes.resources` instead)
  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Grace period for tasks to finish after SIGTERM is sent from Kubernetes.
  # It is used by Airflow Celery workers and pod-template-file.
  # (deprecated, use
  #   `workers.celery.terminationGracePeriodSeconds` and/or
  #   `workers.kubernetes.terminationGracePeriodSeconds`
  # instead)
  terminationGracePeriodSeconds: 600

  # This setting tells Kubernetes that its ok to evict when it wants to scale a node down.
  # It is used by Airflow Celery workers and pod-template-file.
  # (deprecated, use
  #   `workers.celery.safeToEvict` and/or
  #   `workers.kubernetes.safeToEvict`
  # instead)
  safeToEvict: false

  # Launch additional containers into Airflow Celery worker
  # and pods created with pod-template-file (templated).
  # (deprecated, use
  #   `workers.celery.extraContainers` and/or
  #   `workers.kubernetes.extraContainers`
  # instead)
  # Note: If used with KubernetesExecutor, you are responsible for signaling sidecars to exit when the main
  # container finishes so Airflow can continue the worker shutdown process!
  extraContainers: []

  # Add additional init containers into Airflow Celery workers
  # and pods created with pod-template-file (templated).
  # (deprecated, use
  #   `workers.celery.extraInitContainers` and/or
  #   `workers.kubernetes.extraInitContainers`
  # instead)
  extraInitContainers: []

  # Additional volumes attached to the Airflow Celery workers
  # and pods created with pod-template-file
  # (deprecated, use `workers.celery.extraVolumes` and/or `workers.kubernetes.extraVolumes` instead)
  extraVolumes: []
  # Mount additional volumes into workers pods. It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true

  # Additional volume mounts attached to the Airflow Celery workers
  # and pods created with pod-template-file
  # (deprecated, use
  #   `workers.celery.extraVolumeMounts` and/or
  #   `workers.kubernetes.extraVolumeMounts`
  # instead)
  extraVolumeMounts: []
  # Mount additional volumes into workers pods. It can be templated like in the following example:
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Expose additional ports of Airflow Celery workers. These can be used for additional metric collection.
  # (deprecated, use `workers.celery.extraPorts` instead)
  extraPorts: []

  # Select certain nodes for Airflow Celery worker pods and pods created with pod-template-file
  # (deprecated, use `workers.celery.nodeSelector` and/or `workers.kubernetes.nodeSelector` instead)
  nodeSelector: {}

  # (deprecated, use `workers.celery.runtimeClassName` and/or `workers.kubernetes.runtimeClassName` instead)
  runtimeClassName: ~

  # (deprecated, use `workers.celery.priorityClassName` and/or `workers.kubernetes.priorityClassName` instead)
  priorityClassName: ~

  # (deprecated, use `workers.celery.affinity` and/or `workers.kubernetes.affinity` instead)
  affinity: {}
  # Default Airflow Celery worker affinity is:
  #  podAntiAffinity:
  #    preferredDuringSchedulingIgnoredDuringExecution:
  #    - podAffinityTerm:
  #        labelSelector:
  #          matchLabels:
  #            component: worker
  #        topologyKey: kubernetes.io/hostname
  #      weight: 100

  # (deprecated, use `workers.celery.tolerations` and/or `workers.kubernetes.tolerations` instead)
  tolerations: []

  # (deprecated, use
  #   `workers.celery.topologySpreadConstraints` and/or
  #   `workers.kubernetes.topologySpreadConstraints`
  # instead)
  topologySpreadConstraints: []

  # hostAliases to use in Airflow Celery worker pods and pods created with pod-template-file
  # (deprecated, use `workers.celery.hostAliases` and/or `workers.kubernetes.hostAliases` instead)
  # See:
  # https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
  hostAliases: []
  # - ip: "127.0.0.2"
  #   hostnames:
  #   - "test.hostname.one"
  # - ip: "127.0.0.3"
  #   hostnames:
  #   - "test.hostname.two"

  # Annotations for the Airflow Celery worker resource
  # (deprecated, use `workers.celery.annotations` instead)
  annotations: {}

  # Pod annotations for the Airflow Celery workers and pods created with pod-template-file (templated)
  # (deprecated, use `workers.celery.podAnnotations` and/or `workers.kubernetes.podAnnotations` instead)
  podAnnotations: {}

  # Labels specific to Airflow Celery workers objects and pods created with pod-template-file
  # (deprecated, use `workers.celery.labels` and/or `workers.kubernetes.labels` instead)
  labels: {}

  # Log groomer configuration for Airflow Celery workers
  # (deprecated, use `workers.celery.logGroomerSidecar` instead)
  logGroomerSidecar:
    # Whether to deploy the Airflow Celery worker log groomer sidecar
    # (deprecated, use `workers.celery.logGroomerSidecar.enabled` instead)
    enabled: true

    # Command to use when running the Airflow Celery worker log groomer sidecar (templated)
    # (deprecated, use `workers.celery.logGroomerSidecar.command` instead)
    command: ~

    # Args to use when running the Airflow Celery worker log groomer sidecar (templated)
    # (deprecated, use `workers.celery.logGroomerSidecar.args` instead)
    args: ["bash", "/clean-logs"]

    # Number of days to retain logs
    # (deprecated, use `workers.celery.logGroomerSidecar.retentionDays` instead)
    retentionDays: 15

    # Number of minutes to retain logs.
    # This can be used for finer granularity than days.
    # Total retention is `retentionDays` + `retentionMinutes`.
    # (deprecated, use `workers.celery.logGroomerSidecar.retentionMinutes` instead)
    retentionMinutes: 0

    # Frequency to attempt to groom logs (in minutes)
    # (deprecated, use `workers.celery.logGroomerSidecar.frequencyMinutes` instead)
    frequencyMinutes: 15

    # Max size of logs in bytes. 0 = disabled
    # (deprecated, use `workers.celery.logGroomerSidecar.maxSizeBytes` instead)
    maxSizeBytes: 0

    # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if `maxSizeBytes` is set.
    # (deprecated, use `workers.celery.logGroomerSidecar.maxSizePercent` instead)
    maxSizePercent: 0

    # (deprecated, use `workers.celery.logGroomerSidecar.resources` instead)
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Detailed default security context for `logGroomerSidecar` for container level
    # (deprecated, use `workers.celery.logGroomerSidecar.securityContexts` instead)
    securityContexts:
      # (deprecated, use `workers.celery.logGroomerSidecar.securityContexts.container` instead)
      container: {}

    # (deprecated, use `workers.celery.logGroomerSidecar.env` instead)
    env: []

    # Container level lifecycle hooks
    # (deprecated, use `workers.celery.logGroomerSidecar.containerLifecycleHooks` instead)
    containerLifecycleHooks: {}

  # Configuration of wait-for-airflow-migration init container for Airflow Celery workers
  # (deprecated, use `workers.celery.waitForMigrations` instead)
  waitForMigrations:
    # Whether to create init container to wait for db migrations
    # (deprecated, use `workers.celery.waitForMigrations.enabled` instead)
    enabled: true

    # (deprecated, use `workers.celery.waitForMigrations.env` instead)
    env: []

    # Detailed default security context for wait-for-airflow-migrations container
    # (deprecated, use `workers.celery.waitForMigrations.securityContexts` instead)
    securityContexts:
      # (deprecated, use `workers.celery.waitForMigrations.securityContexts.container` instead)
      container: {}

  # Additional env variable configuration for Airflow Celery workers and pods created with pod-template-file
  # (deprecated, use `workers.celery.env` and/or `workers.kubernetes.env` instead)
  env: []

  # Additional volume claim templates for Airflow Celery workers.
  # Requires mounting of specified volumes under extraVolumeMounts.
  # (deprecated, use `workers.celery.volumeClaimTemplates` instead)
  volumeClaimTemplates: []
  # Volume Claim Templates example:
  # volumeClaimTemplates:
  #   - metadata:
  #       name: data-volume-1
  #     spec:
  #       storageClassName: "storage-class-1"
  #       accessModes:
  #         - "ReadWriteOnce"
  #       resources:
  #         requests:
  #           storage: "10Gi"
  #   - metadata:
  #       name: data-volume-2
  #     spec:
  #       storageClassName: "storage-class-2"
  #       accessModes:
  #         - "ReadWriteOnce"
  #       resources:
  #         requests:
  #           storage: "20Gi"

  # (deprecated, use `workers.celery.schedulerName` and/or `workers.kubernetes.schedulerName` instead)
  schedulerName: ~

  celery:
    # Number of Airflow Celery workers
    replicas: ~

    # Max number of old Airflow Celery workers ReplicaSets to retain
    revisionHistoryLimit: ~

    # Command to use when running Airflow Celery workers (templated)
    command: ~

    # Args to use when running Airflow Celery workers (templated)
    args: ~

    # If the Airflow Celery worker stops responding for 5 minutes (5*60s)
    # kill the worker and let Kubernetes restart it
    livenessProbe:
      enabled: ~
      initialDelaySeconds: ~
      timeoutSeconds: ~
      failureThreshold: ~
      periodSeconds: ~
      command: ~

    # Enable the default workers defined by the root `workers` and `workers.celery`
    # configurations to be created.
    # If false, only dedicated workers defined in 'sets' will be created.
    enableDefault: true

    # Queue name for the default workers
    queue: "default"

    # List of worker sets. Each item can overwrite values from the parent `workers` and `workers.celery`
    # section.
    sets: []
    # sets:
    #   - name: highcpu
    #     replicas: 2
    #     queue: "highcpu"
    #     resources:
    #       requests:
    #         memory: "2Gi"
    #         cpu: "4000m"
    #       limits:
    #         memory: "4Gi"
    #         cpu: "8000m"
    #   - name: highmem
    #     replicas: 2
    #     queue: "highmem"
    #     resources:
    #       requests:
    #         memory: "4Gi"
    #         cpu: "2000m"
    #       limits:
    #         memory: "8Gi"
    #         cpu: "4000m"

    # Update Strategy when Airflow Celery worker is deployed as a StatefulSet
    updateStrategy: ~
    # Update Strategy when Airflow Celery worker is deployed as a Deployment
    strategy: ~

    # Allow relaxing ordering guarantees for Airflow Celery worker
    # while preserving its uniqueness and identity
    # podManagementPolicy: Parallel

    # Detailed default security context for Airflow Celery workers for container and pod level
    # If not set, the values from `workers.securityContexts` section will be used.
    securityContexts:
      pod: {}
      container: {}

    # Container level Lifecycle Hooks definition for Airflow Celery workers
    containerLifecycleHooks: {}

    # Airflow Celery workers pod disruption budget
    podDisruptionBudget:
      enabled: ~

      # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
      config:
        maxUnavailable: ~
        # minAvailable: ~

    # Create Service Account for Airflow Celery workers
    serviceAccount:
      # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
      automountServiceAccountToken: ~

      # Specifies whether a Service Account should be created
      create: ~

      # The name of the Service Account to use.
      # If not set and `create` is 'true', a name is generated using the release name
      name: ~

      # Annotations to add to worker Kubernetes Service Account.
      annotations: {}

    # Allow KEDA autoscaling for Airflow Celery workers
    keda:
      enabled: ~

      namespaceLabels: {}

      # How often KEDA polls the airflow DB to report new scale requests to the HPA
      pollingInterval: ~

      # How many seconds KEDA will wait before scaling to zero.
      # Note: HPA has a separate cooldown period for scale-downs
      cooldownPeriod: ~

      # Minimum number of Airflow Celery workers created by KEDA
      minReplicaCount: ~

      # Maximum number of Airflow Celery workers created by KEDA
      maxReplicaCount: ~

      # Specify HPA related options
      advanced: {}
      # horizontalPodAutoscalerConfig:
      #   behavior:
      #     scaleDown:
      #       stabilizationWindowSeconds: 300
      #       policies:
      #         - type: Percent
      #           value: 100
      #           periodSeconds: 15

      # Query to use for KEDA autoscaling. Must return a single integer
      query: ~

      # Weather to use PGBouncer to connect to the database or not when it is enabled
      # This configuration will be ignored if PGBouncer is not enabled
      usePgbouncer: ~

    # Allow HPA for Airflow Celery workers (KEDA must be disabled)
    hpa:
      enabled: ~

      # Minimum number of Airflow Celery workers created by HPA
      minReplicaCount: ~

      # Maximum number of Airflow Celery workers created by HPA
      maxReplicaCount: ~

      # Specifications for which to use to calculate the desired replica count
      metrics: ~

      # Scaling behavior of the target in both Up and Down directions
      behavior: {}

    # Persistence volume configuration for Airflow Celery workers
    persistence:
      # Enable persistent volumes
      enabled: ~

      # This policy determines whether PVCs should be deleted when StatefulSet is scaled down or removed
      persistentVolumeClaimRetentionPolicy: ~
      # persistentVolumeClaimRetentionPolicy:
      #   whenDeleted: Delete
      #   whenScaled: Delete

      # Volume size for Airflow Celery worker StatefulSet
      size: ~

      # If using a custom storageClass, pass name ref to all StatefulSets here
      storageClassName:

      # Execute init container to chown log directory.
      # This is currently only needed in kind, due to usage
      # of local-path provisioner.
      fixPermissions: ~

      # Annotations to add to Airflow Celery worker volumes
      annotations: {}

      # Detailed default security context for persistence on container level
      securityContexts:
        container: {}

    # Kerberos sidecar configuration for Airflow Celery workers
    kerberosSidecar:
      # Enable kerberos sidecar
      enabled: ~

      resources: {}
      #  limits:
      #   cpu: 100m
      #   memory: 128Mi
      #  requests:
      #   cpu: 100m
      #   memory: 128Mi

      # Detailed default security context for kerberos sidecar on container level
      securityContexts:
        container: {}

      # Container level lifecycle hooks
      containerLifecycleHooks: {}

    # Kerberos init container configuration for Airflow Celery workers
    # If not set, the values from `workers.kerberosInitContainer` section will be used.
    kerberosInitContainer:
      # Enable kerberos init container
      # If `workers.kerberosInitContainer.enabled` is set to True, this flag has no effect
      enabled: ~

      resources: {}
      #  limits:
      #   cpu: 100m
      #   memory: 128Mi
      #  requests:
      #   cpu: 100m
      #   memory: 128Mi

      # Detailed default security context for kerberos init container
      securityContexts:
        container: {}

      # Container level lifecycle hooks
      containerLifecycleHooks: {}

    # Resource configuration for Airflow Celery workers
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Grace period for tasks to finish after SIGTERM is sent from Kubernetes
    terminationGracePeriodSeconds: ~

    # This setting tells Kubernetes that its ok to evict when it wants to scale a node down
    safeToEvict: ~

    # Launch additional containers into Airflow Celery worker (templated)
    extraContainers: []

    # Add additional init containers into Airflow Celery workers (templated)
    extraInitContainers: []

    # Additional volumes attached to the Airflow Celery workers
    extraVolumes: []
    # Mount additional volumes into workers pods. It can be templated like in the following example:
    #  extraVolumes:
    #    - name: my-templated-extra-volume
    #      secret:
    #         secretName: '{{ include "my_secret_template" . }}'
    #         defaultMode: 0640
    #         optional: true

    # Additional volume mounts attached to the Airflow Celery workers
    extraVolumeMounts: []
    # Mount additional volumes into workers pods. It can be templated like in the following example:
    #  extraVolumeMounts:
    #    - name: my-templated-extra-volume
    #      mountPath: "{{ .Values.my_custom_path }}"
    #      readOnly: true

    # Expose additional ports of Airflow Celery workers. These can be used for additional metric collection.
    extraPorts: []

    # Select certain nodes for Airflow Celery worker pods
    nodeSelector: {}

    runtimeClassName: ~

    priorityClassName: ~

    affinity: {}
    # Default Airflow Celery worker affinity is:
    #  podAntiAffinity:
    #    preferredDuringSchedulingIgnoredDuringExecution:
    #    - podAffinityTerm:
    #        labelSelector:
    #          matchLabels:
    #            component: worker
    #        topologyKey: kubernetes.io/hostname
    #      weight: 100

    tolerations: []

    topologySpreadConstraints: []

    # hostAliases to use in Airflow Celery worker pods
    # See:
    # https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
    hostAliases: []
    # - ip: "127.0.0.2"
    #   hostnames:
    #   - "test.hostname.one"
    # - ip: "127.0.0.3"
    #   hostnames:
    #   - "test.hostname.two"

    # Annotations for the Airflow Celery worker resource
    annotations: {}

    # Pod annotations for the Airflow Celery workers (templated)
    podAnnotations: {}

    # Labels specific to Airflow Celery workers objects
    labels: {}

    # Log groomer configuration for Airflow Celery workers
    logGroomerSidecar:
      # Whether to deploy the Airflow Celery worker log groomer sidecar
      enabled: ~

      # Command to use when running the Airflow Celery worker log groomer sidecar (templated)
      command: ~

      # Args to use when running the Airflow Celery worker log groomer sidecar (templated)
      args: []

      # Number of days to retain logs
      retentionDays: ~

      # Number of minutes to retain logs.
      # This can be used for finer granularity than days.
      # Total retention is `retentionDays` + `retentionMinutes`.
      retentionMinutes: ~

      # Frequency to attempt to groom logs (in minutes)
      frequencyMinutes: ~

      # Max size of logs in bytes. 0 = disabled
      maxSizeBytes: ~

      # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if `maxSizeBytes` is set.
      maxSizePercent: ~

      resources: {}
      #  limits:
      #   cpu: 100m
      #   memory: 128Mi
      #  requests:
      #   cpu: 100m
      #   memory: 128Mi

      # Detailed default security context for `logGroomerSidecar` for container level
      securityContexts:
        container: {}

      env: []

      # Container level lifecycle hooks
      containerLifecycleHooks: {}

    # Configuration of wait-for-airflow-migration init container for Airflow Celery workers
    waitForMigrations:
      # Whether to create init container to wait for db migrations
      enabled: ~

      env: []

      # Detailed default security context for wait-for-airflow-migrations container
      securityContexts:
        container: {}

    # Additional env variable configuration for Airflow Celery workers
    env: []

    # Additional volume claim templates for Airflow Celery workers.
    # Requires mounting of specified volumes under extraVolumeMounts.
    volumeClaimTemplates: []
    # Volume Claim Templates example:
    # volumeClaimTemplates:
    #   - metadata:
    #       name: data-volume-1
    #     spec:
    #       storageClassName: "storage-class-1"
    #       accessModes:
    #         - "ReadWriteOnce"
    #       resources:
    #         requests:
    #           storage: "10Gi"
    #   - metadata:
    #       name: data-volume-2
    #     spec:
    #       storageClassName: "storage-class-2"
    #       accessModes:
    #         - "ReadWriteOnce"
    #       resources:
    #         requests:
    #           storage: "20Gi"

    schedulerName: ~

  kubernetes:
    # Command to use in pod-template-file (templated)
    command: ~

    # Detailed default security context for pod-template-file for container and pod level
    # If not set, the values from `workers.securityContexts` section will be used.
    securityContexts:
      pod: {}
      container: {}

    # Container level Lifecycle Hooks definition for pods created with pod-template-file
    containerLifecycleHooks: {}

    # Create Service Account for pods created with pod-template-file
    # When this section is specified, the Service Account is created from
    # 'templates/workers/worker-kubernetes-serviceaccount.yaml' file
    serviceAccount:
      # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
      # If not specified, the `workers.serviceAccount.automountServiceAccountToken` value will be taken
      automountServiceAccountToken: ~

      # Specifies whether a Service Account should be created.
      # If not specified, the Service Account will be generated and used from
      # 'templates/workers/worker-serviceaccount.yaml' file if `workers.serviceAccount.create`
      # will be 'true'
      create: ~

      # The name of the Service Account to use.
      # If not set and `create` is 'true', a name is generated using the release name
      # with Kubernetes dedicated name
      name: ~

      # Annotations to add to worker Kubernetes Service Account.
      # If not specified, the `workers.serviceAccount.annotations` value will be taken
      annotations: {}

    # Kerberos sidecar configuration for pods created with pod-template-file
    kerberosSidecar:
      # Enable kerberos sidecar
      enabled: ~

      resources: {}
      #  limits:
      #   cpu: 100m
      #   memory: 128Mi
      #  requests:
      #   cpu: 100m
      #   memory: 128Mi

      # Detailed default security context for kerberos sidecar on container level
      securityContexts:
        container: {}

      # Container level lifecycle hooks
      containerLifecycleHooks: {}

    # Kerberos init container configuration for pods created with pod-template-file
    # If not set, the values from `workers.kerberosInitContainer` section will be used.
    kerberosInitContainer:
      # Enable kerberos init container
      # If `workers.kerberosInitContainer.enabled` is set to True, this flag has no effect
      enabled: ~

      resources: {}
      #  limits:
      #   cpu: 100m
      #   memory: 128Mi
      #  requests:
      #   cpu: 100m
      #   memory: 128Mi

      # Detailed default security context for kerberos init container
      securityContexts:
        container: {}

      # Container level lifecycle hooks
      containerLifecycleHooks: {}

    # Resource configuration for pods created with pod-template-file
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Grace period for tasks to finish after SIGTERM is sent from Kubernetes
    terminationGracePeriodSeconds: ~

    # This setting tells Kubernetes that its ok to evict when it wants to scale a node down
    safeToEvict: ~

    # Launch additional containers into pods created with pod-template-file (templated).
    # Note: You are responsible for signaling sidecars to exit when the main
    # container finishes so Airflow can continue the worker shutdown process!
    extraContainers: []

    # Add additional init containers into pods created with pod-template-file (templated)
    extraInitContainers: []

    # Additional volumes attached to the pods created with pod-template-file
    extraVolumes: []
    # Mount additional volumes into workers pods. It can be templated like in the following example:
    #  extraVolumes:
    #    - name: my-templated-extra-volume
    #      secret:
    #         secretName: '{{ include "my_secret_template" . }}'
    #         defaultMode: 0640
    #         optional: true

    # Additional volume mounts attached to the pods created with pod-template-file
    extraVolumeMounts: []
    # Mount additional volumes into workers pods. It can be templated like in the following example:
    #  extraVolumeMounts:
    #    - name: my-templated-extra-volume
    #      mountPath: "{{ .Values.my_custom_path }}"
    #      readOnly: true

    # Select certain nodes for pods created with pod-template-file
    nodeSelector: {}

    runtimeClassName: ~

    priorityClassName: ~

    affinity: {}

    tolerations: []

    topologySpreadConstraints: []

    # hostAliases to use in pods created with pod-template-file
    # See:
    # https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
    hostAliases: []
    # - ip: "127.0.0.2"
    #   hostnames:
    #   - "test.hostname.one"
    # - ip: "127.0.0.3"
    #   hostnames:
    #   - "test.hostname.two"

    # Pod annotations for the pods created with pod-template-file (templated)
    podAnnotations: {}

    # Labels specific to pods created with pod-template-file
    labels: {}

    # Additional env variable configuration for pods created with pod-template-file
    env: []

    schedulerName: ~

# Airflow scheduler settings
scheduler:
  enabled: true
  #  hostAliases for the scheduler pod
  hostAliases: []
  #  - ip: "127.0.0.1"
  #    hostnames:
  #      - "foo.local"
  #  - ip: "10.1.2.3"
  #    hostnames:
  #      - "foo.remote"

  # If the scheduler stops heartbeating for 5 minutes (5*60s) kill the
  # scheduler and let Kubernetes restart it
  livenessProbe:
    initialDelaySeconds: 10
    timeoutSeconds: 20
    failureThreshold: 5
    periodSeconds: 60
    command: ~

  # Wait for at most 1 minute (6*10s) for the scheduler container to startup.
  # LivenessProbe kicks in after the first successful startupProbe
  startupProbe:
    initialDelaySeconds: 0
    failureThreshold: 6
    periodSeconds: 10
    timeoutSeconds: 20
    command: ~

  # Amount of scheduler replicas
  replicas: 1
  # Max number of old replicasets to retain
  revisionHistoryLimit: ~

  # Command to use when running the Airflow scheduler (templated).
  command: ~
  # Args to use when running the Airflow scheduler (templated).
  args: ["bash", "-c", "exec airflow scheduler"]

  # Update Strategy when scheduler is deployed as a StatefulSet
  # (when using LocalExecutor and `workers.persistence`)
  updateStrategy: ~
  # Update Strategy when scheduler is deployed as a Deployment
  # (when not using LocalExecutor and `workers.persistence`)
  strategy: ~

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `scheduler.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for scheduler Deployments for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Grace period for tasks to finish after SIGTERM is sent from Kubernetes
  terminationGracePeriodSeconds: 10

  # Create Service Account
  serviceAccount:
    # Affects all executors that launch pods
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to scheduler Kubernetes Service Account.
    annotations: {}

    # Service Account Token Volume configuration
    # This is only used when `automountServiceAccountToken` is 'false'
    # and allows manual configuration of the Service Account token volume
    serviceAccountTokenVolume:
      # Enable manual Service Account token volume configuration
      enabled: false

      # Path where the Service Account token should be mounted
      mountPath: /var/run/secrets/kubernetes.io/serviceaccount

      # Name of the volume
      volumeName: kube-api-access

      # Token expiration in seconds
      expirationSeconds: 3600

      # Audience for the token
      audience: ~

  # Scheduler pod disruption budget
  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # This setting tells Kubernetes that its ok to evict
  # when it wants to scale a node down.
  safeToEvict: true

  # Launch additional containers into scheduler (templated).
  extraContainers: []
  # Add additional init containers into scheduler (templated).
  extraInitContainers: []

  # Mount additional volumes into scheduler.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Select certain nodes for Airflow scheduler pods.
  nodeSelector: {}
  affinity: {}
  # default scheduler affinity is:
  #  podAntiAffinity:
  #    preferredDuringSchedulingIgnoredDuringExecution:
  #    - podAffinityTerm:
  #        labelSelector:
  #          matchLabels:
  #            component: scheduler
  #        topologyKey: kubernetes.io/hostname
  #      weight: 100

  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  # Annotations for scheduler Deployment
  annotations: {}

  # Pod annotations for scheduler pods (templated)
  podAnnotations: {}

  # Labels specific to scheduler objects and pods
  labels: {}

  logGroomerSidecar:
    # Whether to deploy the Airflow scheduler log groomer sidecar.
    enabled: true

    # Command to use when running the Airflow scheduler log groomer sidecar (templated).
    command: ~

    # Args to use when running the Airflow scheduler log groomer sidecar (templated).
    args: ["bash", "/clean-logs"]

    # Number of days to retain logs
    retentionDays: 15

    # Number of minutes to retain logs.
    # This can be used for finer granularity than days.
    # Total retention is `retentionDays` + `retentionMinutes`.
    retentionMinutes: 0

    # Frequency to attempt to groom logs, in minutes
    frequencyMinutes: 15

    # Max size of logs in bytes. 0 = disabled
    maxSizeBytes: 0

    # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if `maxSizeBytes` is set.
    maxSizePercent: 0

    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Detailed default security context for `logGroomerSidecar` for container level
    securityContexts:
      container: {}

    # Container level lifecycle hooks
    containerLifecycleHooks: {}

    env: []

  waitForMigrations:
    # Whether to create init container to wait for db migrations
    enabled: true

    env: []

    # Detailed default security context for waitForMigrations for container level
    securityContexts:
      container: {}

  env: []

# Airflow create user job settings
createUserJob:
  # Whether the create user job should be created
  enabled: true

  # Create initial user.
  defaultUser:
    role: Admin
    username: admin
    email: admin@example.com
    firstName: admin
    lastName: user
    password: admin

  # Limit the lifetime of the job object after it finished execution.
  ttlSecondsAfterFinished: 300

  # Command to use when running the create user job (templated).
  command: ~

  # Args to use when running the create user job (templated).
  args:
    - "bash"
    - "-c"
    # The format below is necessary to get `helm lint` happy
    - |-
      exec \
      airflow users create "$@"
    - --
    # yamllint disable rule:line-length
    - "-r"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.role }}{{ else }}{{ .Values.createUserJob.defaultUser.role }}{{ end }}"
    - "-u"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.username }}{{ else }}{{ .Values.createUserJob.defaultUser.username }}{{ end }}"
    - "-e"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.email }}{{ else }}{{ .Values.createUserJob.defaultUser.email }}{{ end }}"
    - "-f"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.firstName }}{{ else }}{{ .Values.createUserJob.defaultUser.firstName }}{{ end }}"
    - "-l"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.lastName }}{{ else }}{{ .Values.createUserJob.defaultUser.lastName }}{{ end }}"
    - "-p"
    - "{{ if .Values.webserver.defaultUser }}{{ .Values.webserver.defaultUser.password }}{{ else }}{{ .Values.createUserJob.defaultUser.password }}{{ end }}"

  # Annotations on the create user job pod (templated)
  annotations: {}

  # `jobAnnotations` are annotations on the create user job
  jobAnnotations: {}

  restartPolicy: OnFailure

  # Labels specific to `createUserJob` objects and pods
  labels: {}

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `createUserJob.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for `createUserJob` for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to create user Kubernetes Service Account.
    annotations: {}

  # Launch additional containers into user creation job
  extraContainers: []

  # Add additional init containers into user creation job (templated).
  extraInitContainers: []

  # Mount additional volumes into user creation job.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []
  priorityClassName: ~

  # In case you need to disable the helm hooks that create the jobs after install.
  # Disable this if you are e.g. using ArgoCD
  useHelmHooks: true

  applyCustomEnv: true

  env: []

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

# Airflow database migration job settings
migrateDatabaseJob:
  enabled: true

  # Limit the lifetime of the job object after it finished execution.
  ttlSecondsAfterFinished: 300

  # Command to use when running the migrate database job (templated).
  command: ~

  # Args to use when running the migrate database job (templated).
  args:
    - "bash"
    - "-c"
    - >-
      exec \

      airflow db migrate

  # Annotations on the database migration pod (templated)
  annotations: {}

  # `jobAnnotations` are annotations on the database migration job
  jobAnnotations: {}

  restartPolicy: OnFailure

  # Labels specific to migrate database job objects and pods
  labels: {}

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `migrateDatabaseJob.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for `migrateDatabaseJob` for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to migrate database job Kubernetes Service Account.
    annotations: {}

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Launch additional containers into database migration job
  extraContainers: []

  # Add additional init containers into migrate database job (templated).
  extraInitContainers: []

  # Mount additional volumes into database migration job.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #   extraVolumes:
  #     - name: my-templated-extra-volume
  #       secret:
  #          secretName: '{{ include "my_secret_template" . }}'
  #          defaultMode: 0640
  #          optional: true
  #
  #   extraVolumeMounts:
  #     - name: my-templated-extra-volume
  #       mountPath: "{{ .Values.my_custom_path }}"
  #       readOnly: true

  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []
  priorityClassName: ~

  # In case you need to disable the helm hooks that create the jobs after install.
  # Disable this if you are using ArgoCD for example
  useHelmHooks: true

  applyCustomEnv: true
  env: []

apiServer:
  enabled: true

  # Number of Airflow API servers in the Deployment.
  # Omitted from the Deployment, when HPA is enabled.
  replicas: 1

  # Max number of old ReplicaSets to retain
  revisionHistoryLimit: ~

  # Labels specific to Airflow API server objects and pods
  labels: {}

  # Command to use when running the Airflow API server (templated).
  command: ~

  # Args to use when running the Airflow API server (templated).
  args: ["bash", "-c", "exec airflow api-server"]
  # Example: To enable proxy headers support when running behind a reverse proxy:
  # args: ["bash", "-c", "exec airflow api-server --proxy-headers"]

  allowPodLogReading: true

  # Environment variables for the Airflow API server.
  env: []
  # Example: To configure FORWARDED_ALLOW_IPS when running behind a reverse proxy:
  # env:
  #   - name: FORWARDED_ALLOW_IPS
  #     value: "*"  # Use "*" for trusted environments, or specify proxy IP ranges for production

  # Allow Horizontal Pod Autoscaler (HPA) configuration for api-server. (optional)
  # HPA automatically scales the number of api-server pods based on observed metrics.
  # HPA automatically adjusts api-server replicas between `minReplicaCount` and `maxReplicaCount` based on metrics.
  hpa:
    enabled: false

    # Minimum number of api-servers created by HPA
    minReplicaCount: 1

    # Maximum number of api-servers created by HPA
    maxReplicaCount: 5

    # Specifications for which to use to calculate the desired replica count
    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50

    # Scaling behavior of the target in both Up and Down directions
    behavior: {}

  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to Airflow API server Kubernetes Service Account.
    annotations: {}

  service:
    type: ClusterIP

    # Service annotations
    annotations: {}

    ports:
      - name: api-server
        port: "{{ .Values.ports.apiServer }}"

    loadBalancerIP: ~

    # Limit load balancer source ips to list of CIDRs
    loadBalancerSourceRanges: []
    # loadBalancerSourceRanges:
    #   - "10.123.0.0/16"

  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  # Allow overriding Update Strategy for API server
  strategy: ~

  # Detailed default security contexts for Airflow API server Deployments for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  waitForMigrations:
    # Whether to create init container to wait for db migrations
    enabled: true

    env: []

    # Detailed default security context for waitForMigrations for container level
    securityContexts:
      container: {}

  # Launch additional containers into the Airflow API server pods.
  extraContainers: []

  # Add additional init containers into API server (templated).
  extraInitContainers: []

  # Mount additional volumes into API server.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Select certain nodes for Airflow API server pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  # hostAliases for API server pod
  hostAliases: []

  # Annotations for Airflow API server Deployment
  annotations: {}

  # Pod annotations for API server pods (templated)
  podAnnotations: {}

  networkPolicy:
    ingress:
      # Peers for Airflow API server NetworkPolicy ingress
      from: []

      # Ports for Airflow API server NetworkPolicy ingress (if `from` is set)
      ports:
        - port: "{{ .Values.ports.apiServer }}"

  resources: {}
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Add custom annotations to the `apiServer` ConfigMap
  configMapAnnotations: {}

  # This string (templated) will be mounted into the Airflow API Server
  # as a custom webserver_config.py. You can bake a webserver_config.py into
  # your image instead or specify a ConfigMap containing the
  # webserver_config.py.
  apiServerConfig: ~
  # apiServerConfig: |
  #   from airflow import configuration as conf

  #   # The SQLAlchemy connection string.
  #   SQLALCHEMY_DATABASE_URI = conf.get('database', 'SQL_ALCHEMY_CONN')

  #   # Flask-WTF flag for CSRF
  #   CSRF_ENABLED = True

  apiServerConfigConfigMapName: ~

  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
    failureThreshold: 5
    periodSeconds: 10
    scheme: HTTP

  readinessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
    failureThreshold: 5
    periodSeconds: 10
    scheme: HTTP

  startupProbe:
    initialDelaySeconds: 0
    timeoutSeconds: 20
    failureThreshold: 6
    periodSeconds: 10
    scheme: HTTP

# Airflow webserver settings (only Airflow<3.0)
webserver:
  enabled: true

  # Add custom annotations to the webserver ConfigMap
  configMapAnnotations: {}

  # hostAliases for the webserver pod
  hostAliases: []
  #  - ip: "127.0.0.1"
  #    hostnames:
  #      - "foo.local"
  #  - ip: "10.1.2.3"
  #    hostnames:
  #      - "foo.remote"

  allowPodLogReading: true

  livenessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
    failureThreshold: 5
    periodSeconds: 10
    scheme: HTTP

  readinessProbe:
    initialDelaySeconds: 15
    timeoutSeconds: 5
    failureThreshold: 5
    periodSeconds: 10
    scheme: HTTP

  # Wait for at most 1 minute (6*10s) for the webserver container to startup.
  # LivenessProbe kicks in after the first successful startupProbe
  startupProbe:
    initialDelaySeconds: 0
    timeoutSeconds: 20
    failureThreshold: 6
    periodSeconds: 10
    scheme: HTTP

  # Number of webservers
  replicas: 1

  # Max number of old replicasets to retain
  revisionHistoryLimit: ~

  # Command to use when running the Airflow webserver (templated).
  command: ~

  # Args to use when running the Airflow webserver (templated).
  args: ["bash", "-c", "exec airflow webserver"]

  # Grace period for webserver to finish after SIGTERM is sent from Kubernetes
  terminationGracePeriodSeconds: 30

  # Allow HPA
  hpa:
    enabled: false

    # Minimum number of webservers created by HPA
    minReplicaCount: 1

    # Maximum number of webservers created by HPA
    maxReplicaCount: 5

    # Specifications for which to use to calculate the desired replica count
    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 80

    # Scaling behavior of the target in both Up and Down directions
    behavior: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to webserver Kubernetes Service Account.
    annotations: {}

  # Webserver pod disruption budget
  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  # Allow overriding Update Strategy for Webserver
  strategy: ~

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `webserver.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security contexts for webserver Deployments for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Additional network policies as needed (deprecated, use `webserver.networkPolicy.ingress.from` instead)
  extraNetworkPolicies: []
  networkPolicy:
    ingress:
      # Peers for webserver NetworkPolicy ingress
      from: []

      # Ports for webserver NetworkPolicy ingress (if `from` is set)
      ports:
        - port: "{{ .Values.ports.airflowUI }}"

  resources: {}
  #   limits:
  #     cpu: 100m
  #     memory: 128Mi
  #   requests:
  #     cpu: 100m
  #     memory: 128Mi

  # Create initial user. (deprecated, use `createUserJob` section instead)
  # defaultUser:
  #   enabled: true
  #   role: Admin
  #   username: admin
  #   email: admin@example.com
  #   firstName: admin
  #   lastName: user
  #   password: admin

  # Launch additional containers into webserver (templated).
  extraContainers: []

  # Add additional init containers into webserver (templated).
  extraInitContainers: []

  # Mount additional volumes into webserver.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # This string (templated) will be mounted into the Airflow Webserver
  # as a custom webserver_config.py. You can bake a webserver_config.py into
  # your image instead or specify a ConfigMap containing the
  # webserver_config.py.
  webserverConfig: ~
  # webserverConfig: |
  #   from airflow import configuration as conf

  #   # The SQLAlchemy connection string.
  #   SQLALCHEMY_DATABASE_URI = conf.get('database', 'SQL_ALCHEMY_CONN')

  #   # Flask-WTF flag for CSRF
  #   CSRF_ENABLED = True

  webserverConfigConfigMapName: ~

  service:
    type: ClusterIP

    # Service annotations
    annotations: {}

    ports:
      - name: airflow-ui
        port: "{{ .Values.ports.airflowUI }}"
    # To change the port used to access the webserver:
    #  ports:
    #    - name: airflow-ui
    #      port: 80
    #      targetPort: airflow-ui
    # To only expose a sidecar, not the webserver directly:
    #  ports:
    #    - name: only_sidecar
    #      port: 80
    #      targetPort: 8888
    # If you have a public IP, set NodePort to set an external port.
    # Service type must be 'NodePort':
    #  ports:
    #    - name: airflow-ui
    #      port: 8080
    #      targetPort: 8080
    #      nodePort: 31151

    loadBalancerIP: ~

    # Limit load balancer source ips to list of CIDRs
    loadBalancerSourceRanges: []
    # loadBalancerSourceRanges:
    #   - "10.123.0.0/16"

  # Select certain nodes for Airflow webserver pods.
  nodeSelector: {}
  priorityClassName: ~

  affinity: {}
  # default webserver affinity is:
  #  podAntiAffinity:
  #    preferredDuringSchedulingIgnoredDuringExecution:
  #    - podAffinityTerm:
  #        labelSelector:
  #          matchLabels:
  #            component: webserver
  #        topologyKey: kubernetes.io/hostname
  #      weight: 100

  tolerations: []
  topologySpreadConstraints: []

  # Annotations for webserver Deployment
  annotations: {}

  # Pod annotations for webserver pods (templated)
  podAnnotations: {}

  # Labels specific webserver app
  labels: {}

  waitForMigrations:
    # Whether to create init container to wait for db migrations
    enabled: true

    env: []

    # Detailed default security context for waitForMigrations for container level
    securityContexts:
      container: {}

  env: []

# Airflow Triggerer Config
triggerer:
  enabled: true

  # Number of Airflow triggerers in the Deployment
  replicas: 1

  # Max number of old replicasets to retain
  revisionHistoryLimit: ~

  # Command to use when running Airflow triggerers (templated).
  command: ~
  # Args to use when running Airflow triggerer (templated).
  args: ["bash", "-c", "exec airflow triggerer"]

  # Update Strategy when triggerer is deployed as a StatefulSet
  updateStrategy: ~
  # Update Strategy when triggerer is deployed as a Deployment
  strategy:
    rollingUpdate:
      maxSurge: "100%"
      maxUnavailable: "50%"

  # If the triggerer stops heartbeating for 5 minutes (5*60s) kill the
  # triggerer and let Kubernetes restart it
  livenessProbe:
    initialDelaySeconds: 10
    timeoutSeconds: 20
    failureThreshold: 5
    periodSeconds: 60
    command: ~

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to triggerer Kubernetes Service Account.
    annotations: {}

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `triggerer.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for triggerer for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  persistence:
    # Enable persistent volumes
    enabled: true

    # This policy determines whether PVCs should be deleted when StatefulSet is scaled down or removed.
    persistentVolumeClaimRetentionPolicy: ~

    # Volume size for triggerer StatefulSet
    size: 100Gi

    # If using a custom storageClass, pass name ref to all statefulSets here
    storageClassName:

    # Execute init container to chown log directory.
    # This is currently only needed in kind, due to usage
    # of local-path provisioner.
    fixPermissions: false

    # Annotations to add to triggerer volumes
    annotations: {}

  # Triggerer pod disruption budget
  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Grace period for triggerer to finish after SIGTERM is sent from Kubernetes
  terminationGracePeriodSeconds: 60

  # This setting tells Kubernetes that its ok to evict
  # when it wants to scale a node down.
  safeToEvict: true

  # Launch additional containers into triggerer (templated).
  extraContainers: []

  # Add additional init containers into triggerers (templated).
  extraInitContainers: []

  # Mount additional volumes into triggerer.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #   extraVolumes:
  #     - name: my-templated-extra-volume
  #       secret:
  #          secretName: '{{ include "my_secret_template" . }}'
  #          defaultMode: 0640
  #          optional: true
  #
  #   extraVolumeMounts:
  #     - name: my-templated-extra-volume
  #       mountPath: "{{ .Values.my_custom_path }}"
  #       readOnly: true

  # Select certain nodes for Airflow triggerer pods.
  nodeSelector: {}

  affinity: {}
  # default triggerer affinity is:
  #  podAntiAffinity:
  #    preferredDuringSchedulingIgnoredDuringExecution:
  #    - podAffinityTerm:
  #        labelSelector:
  #          matchLabels:
  #            component: triggerer
  #        topologyKey: kubernetes.io/hostname
  #      weight: 100

  tolerations: []
  topologySpreadConstraints: []

  # hostAliases for the triggerer pod
  hostAliases: []
  # - ip: "127.0.0.1"
  #   hostnames:
  #     - "foo.local"
  # - ip: "10.1.2.3"
  #   hostnames:
  #     - "foo.remote"

  priorityClassName: ~

  # Annotations for the triggerer Deployment
  annotations: {}

  # Pod annotations for triggerer pods (templated)
  podAnnotations: {}

  # Labels specific to triggerer objects and pods
  labels: {}

  logGroomerSidecar:
    # Whether to deploy the Airflow triggerer log groomer sidecar.
    enabled: true

    # Command to use when running the Airflow triggerer log groomer sidecar (templated).
    command: ~

    # Args to use when running the Airflow triggerer log groomer sidecar (templated).
    args: ["bash", "/clean-logs"]

    # Number of days to retain logs
    retentionDays: 15

    # Number of minutes to retain logs.
    # This can be used for finer granularity than days.
    # Total retention is `retentionDays` + `retentionMinutes`.
    retentionMinutes: 0

    # frequency to attempt to groom logs, in minutes
    frequencyMinutes: 15

    # Max size of logs in bytes. 0 = disabled
    maxSizeBytes: 0

    # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if `maxSizeBytes` is set.
    maxSizePercent: 0

    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    # Detailed default security context for `logGroomerSidecar` for container level
    securityContexts:
      container: {}

    # Container level lifecycle hooks
    containerLifecycleHooks: {}

    env: []

  waitForMigrations:
    # Whether to create init container to wait for db migrations
    enabled: true

    env: []

    # Detailed default security context for waitForMigrations for container level
    securityContexts:
      container: {}

  env: []

  # Allow KEDA autoscaling.
  keda:
    enabled: false
    namespaceLabels: {}

    # How often KEDA polls the Airflow DB to report new scale requests to the HPA
    pollingInterval: 5

    # How many seconds KEDA will wait before scaling to zero.
    # Note that HPA has a separate cooldown period for scale-downs
    cooldownPeriod: 30

    # Minimum number of triggerers created by keda
    minReplicaCount: 0

    # Maximum number of triggerers created by keda
    maxReplicaCount: 10

    # Specify HPA related options
    advanced: {}
    # horizontalPodAutoscalerConfig:
    #   behavior:
    #     scaleDown:
    #       stabilizationWindowSeconds: 300
    #       policies:
    #         - type: Percent
    #           value: 100
    #           periodSeconds: 15

    # Query to use for KEDA autoscaling. Must return a single integer.
    query: >-
      SELECT ceil(COUNT(*)::decimal / {{ include "triggerer.capacity" . }})
      FROM trigger

    # Whether to use PGBouncer to connect to the database or not when it is enabled
    # This configuration will be ignored if PGBouncer is not enabled
    usePgbouncer: false

# Airflow Dag Processor Config
dagProcessor:
  enabled: ~

  # Dag Bundle Configuration
  # Define Dag bundles in a structured YAML format. This will be automatically
  # converted to JSON string format for `config.dag_processor.dag_bundle_config_list`.
  dagBundleConfigList:
    - name: dags-folder
      classpath: "airflow.dag_processing.bundles.local.LocalDagBundle"
      kwargs: {}
  # Example:
  # dagBundleConfigList:
  #   - name: bundle1
  #     classpath: "airflow.providers.git.bundles.git.GitDagBundle"
  #     kwargs:
  #       git_conn_id: "GITHUB__repo1"
  #       subdir: "dags"
  #       tracking_ref: "main"
  #       refresh_interval: 60
  #   - name: bundle2
  #     classpath: "airflow.providers.git.bundles.git.GitDagBundle"
  #     kwargs:
  #       git_conn_id: "GITHUB__repo2"
  #       subdir: "dags"
  #       tracking_ref: "develop"
  #       refresh_interval: 120
  #   - name: dags-folder
  #     classpath: "airflow.dag_processing.bundles.local.LocalDagBundle"
  #     kwargs: {}

  # Number of Airflow dag processors in the Deployment
  replicas: 1

  # Max number of old ReplicaSets to retain
  revisionHistoryLimit: ~

  # Command to use when running Airflow dag processors (templated).
  command: ~

  # Args to use when running Airflow dag processor (templated).
  args: ["bash", "-c", "exec airflow dag-processor"]

  # Update Strategy for dag processors
  strategy:
    rollingUpdate:
      maxSurge: "100%"
      maxUnavailable: "50%"

  # If the dag processor stops heartbeating for 5 minutes (5*60s) kill the
  # dag processor and let Kubernetes restart it
  livenessProbe:
    initialDelaySeconds: 10
    timeoutSeconds: 20
    failureThreshold: 5
    periodSeconds: 60
    command: ~

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to dag processor Kubernetes Service Account.
    annotations: {}

  # Dag processor pod disruption budget
  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `dagProcessor.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for dagProcessor for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Grace period for dag processor to finish after SIGTERM is sent from Kubernetes
  terminationGracePeriodSeconds: 60

  # This setting tells Kubernetes that its ok to evict
  # when it wants to scale a node down.
  safeToEvict: true

  # Launch additional containers into dag processor (templated).
  extraContainers: []

  # Add additional init containers into dag processors (templated).
  extraInitContainers: []

  # Mount additional volumes into dag processor.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Select certain nodes for Airflow dag processor pods.
  nodeSelector: {}

  affinity: {}
  # Default dag processor affinity is:
  #  podAntiAffinity:
  #    preferredDuringSchedulingIgnoredDuringExecution:
  #    - podAffinityTerm:
  #        labelSelector:
  #          matchLabels:
  #            component: dag-processor
  #        topologyKey: kubernetes.io/hostname
  #      weight: 100

  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  # Annotations for the dag processor Deployment
  annotations: {}

  # Pod annotations for dag processor pods (templated)
  podAnnotations: {}

  logGroomerSidecar:
    # Whether to deploy the Airflow dag processor log groomer sidecar.
    enabled: true

    # Command to use when running the Airflow dag processor log groomer sidecar (templated).
    command: ~

    # Args to use when running the Airflow dag processor log groomer sidecar (templated).
    args: ["bash", "/clean-logs"]

    # Number of days to retain logs
    retentionDays: 15

    # Number of minutes to retain logs.
    # This can be used for finer granularity than days.
    # Total retention is `retentionDays` + `retentionMinutes`.
    retentionMinutes: 0

    # frequency to attempt to groom logs, in minutes
    frequencyMinutes: 15

    # Max size of logs in bytes. 0 = disabled
    maxSizeBytes: 0

    # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if `maxSizeBytes` is set.
    maxSizePercent: 0

    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

    securityContexts:
      container: {}

    env: []

  waitForMigrations:
    # Whether to create init container to wait for db migrations
    enabled: true

    env: []

    # Detailed default security context for waitForMigrations for container level
    securityContexts:
      container: {}

  # Labels specific to dag processor objects
  labels: {}

  # Environment variables to add to dag processor container
  env: []

# Flower settings
flower:
  # Enable flower.
  # If True, and using CeleryExecutor/CeleryKubernetesExecutor, will deploy flower app.
  enabled: false

  livenessProbe:
    initialDelaySeconds: 10
    timeoutSeconds: 5
    failureThreshold: 10
    periodSeconds: 5

  readinessProbe:
    initialDelaySeconds: 10
    timeoutSeconds: 5
    failureThreshold: 10
    periodSeconds: 5

  # Wait for at most 1 minute (6*10s) for the flower container to startup.
  # LivenessProbe kicks in after the first successful StartupProbe
  startupProbe:
    initialDelaySeconds: 0
    timeoutSeconds: 20
    failureThreshold: 6
    periodSeconds: 10

  # Max number of old ReplicaSets to retain
  revisionHistoryLimit: ~

  # Command to use when running flower (templated).
  command: ~

  # Args to use when running flower (templated).
  args:
    - "bash"
    - "-c"
    # The format below is necessary to get `helm lint` happy
    - |-
      exec \
      airflow celery flower

  # Additional network policies as needed (deprecated, use `flower.networkPolicy.ingress.from` instead)
  extraNetworkPolicies: []
  networkPolicy:
    ingress:
      # Peers for flower NetworkPolicy ingress
      from: []

      # Ports for flower NetworkPolicy ingress (if `from` is set)
      ports:
        - port: "{{ .Values.ports.flowerUI }}"

  resources: {}
  #   limits:
  #     cpu: 100m
  #     memory: 128Mi
  #   requests:
  #     cpu: 100m
  #     memory: 128Mi

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `flower.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for flower for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to worker Kubernetes Service Account.
    annotations: {}


  # If set, the secret must contain a base64-encoded 'connection' key with
  # a Flower basic auth connection string user:password.
  secretName: ~
  # Example secret:
  #  kind: Secret
  #  apiVersion: v1
  #  metadata:
  #    name: custom-flower-secret
  #  type: Opaque
  #  data:
  #    connection: <base64_encoded_user_password>

  # Add custom annotations to the flower secret
  secretAnnotations: {}

  # If `secretName` is not specified, set username and password (secret will be created automatically)
  username: ~
  password: ~

  service:
    type: ClusterIP

    # Service annotations
    annotations: {}

    ports:
      - name: flower-ui
        port: "{{ .Values.ports.flowerUI }}"
    # To change the port used to access flower:
    # ports:
    #   - name: flower-ui
    #     port: 8080
    #     targetPort: flower-ui

    loadBalancerIP: ~

    # Limit load balancer source ips to list of CIDRs
    loadBalancerSourceRanges: []
    # loadBalancerSourceRanges:
    #   - "10.123.0.0/16"

  # Launch additional containers into the flower pods.
  extraContainers: []

  # Mount additional volumes into the flower pods.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Select certain nodes for Airflow flower pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  # Annotations for the flower Deployment
  annotations: {}

  # Pod annotations for flower pods (templated)
  podAnnotations: {}

  # Labels specific to flower objects and pods
  labels: {}

  env: []

# StatsD settings
statsd:
  # Add custom annotations to the StatsD ConfigMap
  configMapAnnotations: {}

  enabled: true

  # Max number of old ReplicaSets to retain
  revisionHistoryLimit: ~

  # Arguments for StatsD exporter command.
  # By default contains path in the container to the mapping config file.
  args: ["--statsd.mapping-config=/etc/statsd-exporter/mappings.yml"]
  # If you ever need to fully override the entire `args` list, you can
  # supply your own array here; if set, all below flag-specific values
  # under `statsd.cache` section are ignored.
  # args:
  #  - "--statsd.cache-size=1000"
  #  - "--statsd.cache-type=random"
  #  - "--ttl=10m"

  cache:
    # Maximum number of metric‐mapping entries to keep in cache.
    # When you send more distinct metric names than this, older entries
    # will be evicted according to cacheType.
    size: 1000

    # Metrics Eviction policy for the mapping cache.
    #  - lru    → Least‐Recently‐Used eviction
    #  - random → Random eviction
    type: lru

    # Per‐metric time‐to‐live. When set to a non‐zero duration, any metric
    # series that hasn't received an update in this interval will be dropped
    # from the exported '/metrics' output.
    # Format: Go duration string (e.g. "30s", "5m", "1h")
    # Default: "0s" (disabled, never expires)
    ttl: "0s"

  # Annotations to add to the StatsD Deployment.
  annotations: {}

  # Grace period for StatsD to finish after SIGTERM is sent from Kubernetes
  terminationGracePeriodSeconds: 30

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to worker Kubernetes Service Account.
    annotations: {}

  uid: 65534

  # (deprecated, use `statsd.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 65534
  #  fsGroup: 0
  #  runAsGroup: 0

  # Detailed default security context for StatsD Deployments for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Additional network policies as needed
  extraNetworkPolicies: []

  resources: {}
  #   limits:
  #     cpu: 100m
  #     memory: 128Mi
  #   requests:
  #     cpu: 100m
  #     memory: 128Mi

  service:
    extraAnnotations: {}

  # Select certain nodes for StatsD pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  # Additional mappings for StatsD exporter.
  # If set, will merge default mapping and extra mappings, where default mapping has higher priority.
  # If you want to change some default mapping, please use `overrideMappings` setting.
  extraMappings: []

  # Override mappings for StatsD exporter.
  # If set, will ignore setting item in default and `extraMappings`.
  # If you use it, ensure that it contains all mapping items.
  overrideMappings: []

  # Pod annotations for StatsD pods (templated)
  podAnnotations: {}

  # Labels specific to StatsD objects and pods
  labels: {}

  # Environment variables to add to StatsD container
  env: []

# PgBouncer settings
pgbouncer:
  # Enable PgBouncer
  enabled: false

  # Number of PgBouncer replicas to run in Deployment
  replicas: 1

  # Max number of old replicasets to retain
  revisionHistoryLimit: ~

  # Command to use for PgBouncer (templated).
  command: ["pgbouncer", "-u", "nobody", "/etc/pgbouncer/pgbouncer.ini"]

  # Args to use for PgBouncer (templated).
  args: ~

  auth_type: scram-sha-256
  auth_file: /etc/pgbouncer/users.txt

  # Whether to mount the config secret files at a default location (/etc/pgbouncer/*).
  # Can be skipped to allow for other means to get the values, e.g. secrets provider class.
  mountConfigSecret: true

  # Annotations to be added to the PgBouncer Deployment
  annotations: {}

  # Pod annotations for PgBouncer pods (templated)
  podAnnotations: {}

  # Add custom annotations to the PgBouncer certificates secret
  certificatesSecretAnnotations: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to worker Kubernetes Service Account.
    annotations: {}

  # Additional network policies as needed
  extraNetworkPolicies: []

  # Pool sizes
  metadataPoolSize: 10
  resultBackendPoolSize: 5

  # Maximum clients that can connect to PgBouncer (higher = more file descriptors)
  maxClientConn: 100

  # Supply the name of existing secret with 'pgbouncer.ini' and 'users.txt' defined
  configSecretName: ~
  # Secret example:
  #  apiVersion: v1
  #  kind: Secret
  #  metadata:
  #    name: pgbouncer-config-secret
  #  data:
  #     pgbouncer.ini: <base64_encoded pgbouncer.ini file content>
  #     users.txt: <base64_encoded users.txt file content>
  #  type: Opaque

  # Add custom annotations to the PgBouncer config secret
  configSecretAnnotations: {}

  # PgBouncer pod disruption budget
  podDisruptionBudget:
    enabled: false

    # PDB configuration (`minAvailable` and `maxUnavailable` are mutually exclusive)
    config:
      maxUnavailable: 1
      # minAvailable: 1

  resources: {}
  # resource:
  #   limits:
  #     cpu: 100m
  #     memory: 128Mi
  #   requests:
  #     cpu: 100m
  #     memory: 128Mi

  service:
    extraAnnotations: {}
    clusterIp: ~

  # https://www.pgbouncer.org/config.html
  verbose: 0
  logDisconnections: 0
  logConnections: 0

  sslmode: "prefer"
  ciphers: "normal"

  ssl:
    ca: ~
    cert: ~
    key: ~

  # Add extra PgBouncer ini configuration in the databases section:
  # https://www.pgbouncer.org/config.html#section-databases
  extraIniMetadata: ~
  extraIniResultBackend: ~

  # Add extra general PgBouncer ini configuration: https://www.pgbouncer.org/config.html
  extraIni: ~

  # Mount additional volumes into PgBouncer.
  # Volumes apply to all PgBouncer containers, while volume mounts apply to the PgBouncer
  # container itself. Metrics exporter container has its own mounts.
  extraVolumes: []
  extraVolumeMounts: []
  # It can be templated like in the following example:
  #  extraVolumes:
  #    - name: my-templated-extra-volume
  #      secret:
  #         secretName: '{{ include "my_secret_template" . }}'
  #         defaultMode: 0640
  #         optional: true
  #
  #  extraVolumeMounts:
  #    - name: my-templated-extra-volume
  #      mountPath: "{{ .Values.my_custom_path }}"
  #      readOnly: true

  # Launch additional containers into PgBouncer pod.
  extraContainers: []

  # Select certain nodes for PgBouncer pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []

  priorityClassName: ~

  uid: 65534

  # Detailed default security context for PgBouncer for container level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks:
    preStop:
      exec:
        # Allow existing queries clients to complete within 120 seconds
        command: ["/bin/sh", "-c", "killall -INT pgbouncer && sleep 120"]

  metricsExporterSidecar:
    resources: {}
    # limits:
    #  cpu: 100m
    #  memory: 128Mi
    # requests:
    #  cpu: 100m
    #  memory: 128Mi

    sslmode: "disable"

    # Supply the name of existing secret with PGBouncer connection URI containing
    # stats user and password, where 'connection' key is base64-encoded value.
    statsSecretName: ~
    # Secret example:
    #  apiVersion: v1
    #  kind: Secret
    #  metadata:
    #    name: pgbouncer-stats-secret
    #  data:
    #     connection: postgresql://<stats user>:<password>@127.0.0.1:6543/pgbouncer?<connection params>
    #  type: Opaque

    # Key containing the PGBouncer connection URI, defaults to 'connection' if not defined
    statsSecretKey: ~

    # Add custom annotations to the PgBouncer stats secret
    statsSecretAnnotations: {}

    # Detailed default security context for metricsExporterSidecar for container level
    securityContexts:
      container: {}

    # Container level lifecycle hooks
    containerLifecycleHooks: {}

    livenessProbe:
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 1

    readinessProbe:
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 1

    # Mount additional volumes into the metrics exporter.
    extraVolumeMounts: []
    # It can be templated like in the following example:
    #   extraVolumeMounts:
    #     - name: my-templated-extra-volume
    #       mountPath: "{{ .Values.my_custom_path }}"
    #       readOnly: true

  # Labels specific to PgBouncer objects and pods
  labels: {}

  # Environment variables to add to PgBouncer container
  env: []

# Configuration for the redis provisioned by the chart
redis:
  enabled: true
  terminationGracePeriodSeconds: 600

  # Annotations for Redis Statefulset
  annotations: {}

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to worker Kubernetes Service Account.
    annotations: {}

  service:
    # Service type
    type: "ClusterIP"

    # If using ClusterIP service type, custom IP address can be specified
    clusterIP:

    # If using NodePort service type, custom node port can be specified
    nodePort:

  persistence:
    # Enable persistent volumes
    enabled: true

    # Volume size for worker StatefulSet
    size: 1Gi

    # If using a custom storageClass, pass name ref to all statefulSets here
    storageClassName:

    # Annotations to add to redis volumes
    annotations: {}

    # The name of an existing PVC to use
    existingClaim:

    persistentVolumeClaimRetentionPolicy: ~
    # persistentVolumeClaimRetentionPolicy:
    #   whenDeleted: Delete
    #   whenScaled: Delete

  # Configuration for empty dir volume (if `redis.persistence.enabled` == 'false')
  # emptyDirConfig:
  #   sizeLimit: 1Gi
  #   medium: Memory

  resources: {}
  # limits:
  #  cpu: 100m
  #  memory: 128Mi
  # requests:
  #  cpu: 100m
  #  memory: 128Mi

  # If set use as redis secret. Make sure to also set `data.brokerUrlSecretName` value.
  passwordSecretName: ~

  # If `passwordSecretName` is not specified, set `password` field.
  # Otherwise a new password will be generated on install
  # Note: password can only be set during 'helm install', not 'helm upgrade'.
  password: ~

  # Add custom annotations to the redis password secret
  passwordSecretAnnotations: {}

  # This setting tells Kubernetes that its ok to evict
  # when it wants to scale a node down.
  safeToEvict: true

  # Select certain nodes for redis pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []
  priorityClassName: ~

  # Set to 0 for backwards-compatibility
  uid: 0

  # (deprecated, use `redis.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 999
  #  runAsGroup: 0

  # Detailed default security context for redis for container and pod level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Labels specific to redis objects and pods
  labels: {}

  # Pod annotations for Redis pods (templated)
  podAnnotations: {}

# Auth secret for a private registry (deprecated, use `imagePullSecrets` instead)
# This is used if pulling Airflow images from a private registry
registry:
  # Name of the Kubernetes secret containing Base64 encoded credentials to connect to a private registry
  # (deprecated, use `imagePullSecrets` instead).
  secretName: ~

  # Credentials to connect to a private registry, these will get Base64 encoded and stored in a secret
  # (deprecated, use `imagePullSecrets` instead - requires manual secret creation).
  connection: {}
  # Example:
  # connection:
  #   user: ~
  #   pass: ~
  #   host: ~
  #   email: ~

# Elasticsearch logging configuration
elasticsearch:
  # Enable elasticsearch task logging
  enabled: false

  # A secret containing the connection
  secretName: ~

  # Object representing the connection, if `secretName` not specified
  connection: {}
  # Example:
  # connection:
  #   scheme: ~
  #   user: ~
  #   pass: ~
  #   host: ~
  #   port: ~

  # Add custom annotations to the elasticsearch secret
  secretAnnotations: {}

# OpenSearch logging configuration
opensearch:
  # Enable opensearch task logging
  enabled: false

  # A secret containing the connection
  secretName: ~

  # Object representing the connection, if `secretName` not specified
  connection: {}
  # Example:
  #  connection:
  #   scheme: ~
  #   user: ~
  #   pass: ~
  #   host: ~
  #   port: ~

# All ports used by chart
ports:
  flowerUI: 5555
  airflowUI: 8080
  workerLogs: 8793
  triggererLogs: 8794
  redisDB: 6379
  statsdIngest: 9125
  statsdScrape: 9102
  pgbouncer: 6543
  pgbouncerScrape: 9127
  apiServer: 8080

# Define any ResourceQuotas for namespace
quotas: {}

# Define default/max/min values for pods and containers in namespace
limits: []

# This runs as a CronJob to cleanup old pods spawned by the KubernetesExecutor.
# It is required to have KubernetesExecutor enabled.
cleanup:
  enabled: false

  # Run every 15 minutes (templated).
  schedule: "*/15 * * * *"
  # To select a random-ish, deterministic starting minute between 3 and 12 inclusive for each release:
  #  schedule: '{{- add 3 (regexFind ".$" (adler32sum .Release.Name)) -}}-59/15 * * * *'
  # To select the last digit of unix epoch time as the starting minute on each deploy:
  #  schedule: '{{- now | unixEpoch | trunc -1 -}}-59/* * * * *'

  # Command to use when running the cleanup CronJob (templated).
  command: ~

  # Args to use when running the cleanup CronJob (templated).
  args: ["bash", "-c", "exec airflow kubernetes cleanup-pods --namespace={{ .Release.Namespace }}"]

  # `jobAnnotations` are annotations on the cleanup CronJob
  jobAnnotations: {}

  # Select certain nodes for Airflow cleanup pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []
  priorityClassName: ~

  # Pod annotations for cleanup pods (templated)
  podAnnotations: {}

  # Labels specific to cleanup objects and pods
  labels: {}

  resources: {}
  #  limits:
  #   cpu: 100m
  #   memory: 128Mi
  #  requests:
  #   cpu: 100m
  #   memory: 128Mi

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to cleanup CronJob Kubernetes Service Account.
    annotations: {}

  # When not set, the values defined in the global `securityContext` will be used
  # (deprecated, use `cleanup.securityContexts` instead)
  securityContext: {}
  #  runAsUser: 50000
  #  runAsGroup: 0

  env: []

  # Detailed default security context for cleanup for container level
  securityContexts:
    pod: {}
    container: {}

  # container level lifecycle hooks
  containerLifecycleHooks: {}

  # Specify history limit
  # When set, overwrite the default k8s number of successful and failed CronJob executions that are saved.
  failedJobsHistoryLimit: ~
  successfulJobsHistoryLimit: ~

# This runs as a CronJob to cleanup database for old entries.
databaseCleanup:
  enabled: false
  applyCustomEnv: true

  # Run every week on Sunday at midnight (templated).
  schedule: "0 0 * * 0"

  # Command to use when running the database cleanup CronJob (templated).
  command: ~

  # Args to use when running the database cleanup CronJob (templated).
  args:
    - "bash"
    - "-c"
    - >-
      CLEAN_TS=$(date -d "-{{ .Values.databaseCleanup.retentionDays }} days" +"%Y-%m-%dT%H:%M:%S");
      echo "Cleaning up metadata DB entries older than ${CLEAN_TS}";
      exec airflow db clean --clean-before-timestamp "${CLEAN_TS}" --yes
      {{- if .Values.databaseCleanup.skipArchive }} --skip-archive{{ end }}
      {{- if .Values.databaseCleanup.verbose }} --verbose{{ end }}
      {{- with .Values.databaseCleanup.batchSize }} --batch-size {{ . }}{{ end }}
      {{- with .Values.databaseCleanup.tables }} --tables {{ . | join "," }}{{ end }}

  # Number of days to retain entries in the metadata database.
  retentionDays: 90

  # Don't preserve purged records in an archive table
  skipArchive: false

  # Table names to perform maintenance on. Supported values in:
  # https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#clean
  tables: []

  # Maximum number of rows to delete or archive in a single transaction
  batchSize: ~

  # Make logging output more verbose
  verbose: true

  # `jobAnnotations` are annotations on the database cleanup CronJob
  jobAnnotations: {}

  # Select certain nodes for Airflow database cleanup pods.
  nodeSelector: {}
  affinity: {}
  tolerations: []
  topologySpreadConstraints: []
  priorityClassName: ~

  # Pod annotations for database cleanup pods (templated)
  podAnnotations: {}

  # Labels specific to database cleanup objects and pods
  labels: {}

  resources: {}
  # limits:
  #  cpu: 100m
  #  memory: 128Mi
  # requests:
  #  cpu: 100m
  #  memory: 128Mi

  # Create Service Account
  serviceAccount:
    # ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    automountServiceAccountToken: true

    # Specifies whether a Service Account should be created
    create: true

    # The name of the Service Account to use.
    # If not set and `create` is 'true', a name is generated using the release name
    name: ~

    # Annotations to add to database cleanup CronJob Kubernetes Service Account.
    annotations: {}

  env: []

  # Detailed default security context for database cleanup for container level
  securityContexts:
    pod: {}
    container: {}

  # Container level lifecycle hooks
  containerLifecycleHooks: {}

  # Specify history limit
  # When set, overwrite the default k8s number of successful and failed CronJob executions that are saved.
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 1

  # Time to live (in seconds) for Jobs created by this CronJob after they finish.
  ttlSecondsAfterFinished: ~

# Configuration for postgresql subchart
# Uses bitnamilegacy images to avoid Bitnami licensing restrictions
# Not recommended for production - use external database instead
postgresql:
  enabled: true
  image:
    repository: bitnamilegacy/postgresql
    tag: "16.1.0-debian-11-r15"
  auth:
    enablePostgresUser: true
    postgresPassword: postgres
    username: ""
    password: ""

# Config settings to go into the mounted airflow.cfg
#
# Please note that these values are passed through the `tpl` function, so are
# all subject to being rendered as go templates. If you need to include a
# literal `{{` in a value, it must be expressed like this:
#    a: '{{ "{{ not a template }}" }}'
#
# Do not set config containing secrets via plain text values, use Env Var or k8s secret object
# yamllint disable rule:line-length
config:
  core:
    dags_folder: '{{ include "airflow_dags" . }}'
    # This is ignored when used with the official Docker image
    load_examples: 'False'
    executor: '{{ .Values.executor }}'
    auth_manager: "airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager"
  logging:
    remote_logging: '{{- ternary "True" "False" (or .Values.elasticsearch.enabled .Values.opensearch.enabled) }}'
    colored_console_log: 'False'
  metrics:
    statsd_on: '{{ ternary "True" "False" .Values.statsd.enabled }}'
    statsd_port: 9125
    statsd_prefix: airflow
    statsd_host: '{{ printf "%s-statsd" (include "airflow.fullname" .) }}'
  fab:
    enable_proxy_fix: 'True'
  webserver:
    # For Airflow 2.X
    enable_proxy_fix: 'True'
  celery:
    flower_url_prefix: '{{ ternary "" .Values.ingress.flower.path (eq .Values.ingress.flower.path "/") }}'
    worker_concurrency: 16
    sync_parallelism: '{{ include "cpu_count" (((.Values.scheduler).resources).limits).cpu }}'
  scheduler:
    standalone_dag_processor: '{{ ternary "True" "False" (or (semverCompare ">=3.0.0" .Values.airflowVersion) (.Values.dagProcessor.enabled | default false)) }}'
  dag_processor:
    # This value is generated by default from `.Values.dagProcessor.dagBundleConfigList` using the `dag_bundle_config_list` helper function.
    # It is recommended to configure this via `dagProcessor.dagBundleConfigList` rather than overriding `config.dag_processor.dag_bundle_config_list` directly.
    dag_bundle_config_list: '{{ include "dag_bundle_config_list" . }}'
  elasticsearch:
    json_format: 'True'
    log_id_template: "{dag_id}-{task_id}-{run_id}-{map_index}-{try_number}"
  elasticsearch_configs:
    max_retries: 3
    timeout: 30
    retry_timeout: 'True'
  kerberos:
    keytab: '{{ .Values.kerberos.keytabPath }}'
    reinit_frequency: '{{ .Values.kerberos.reinitFrequency }}'
    principal: '{{ .Values.kerberos.principal }}'
    ccache: '{{ .Values.kerberos.ccacheMountPath }}/{{ .Values.kerberos.ccacheFileName }}'
  celery_kubernetes_executor:
    kubernetes_queue: 'kubernetes'
  kubernetes_executor:
    namespace: '{{ .Release.Namespace }}'
    pod_template_file: '{{ include "airflow_pod_template_file" . }}/pod_template_file.yaml'
    worker_container_repository: '{{ .Values.images.airflow.repository | default .Values.defaultAirflowRepository }}'
    worker_container_tag: '{{ .Values.images.airflow.tag | default .Values.defaultAirflowTag }}'
    multi_namespace_mode: '{{ ternary "True" "False" .Values.multiNamespaceMode }}'

# yamllint enable rule:line-length

# Whether Airflow can launch workers and/or pods in multiple namespaces
# If true, it creates ClusterRole/ClusterRolebinding (with access to entire cluster)
multiNamespaceMode: false

# `podTemplate` is a templated string which overwrites the content of `pod_template_file.yaml` used by
# KubernetesExecutor. The default `podTemplate` will use `workers` configuration parameters
# (e.g. `workers.resources`). As such, you normally won't need to override this directly, however,
# you can still provide a completely custom `pod_template_file.yaml` if desired.
# If not set, a default one is created using `files/pod-template-file.kubernetes-helm-yaml`.
podTemplate: ~
# The following example is NOT functional, but meant to be illustrative of how you can provide a custom
# `pod_template_file`. You're better off starting with the default in
# `files/pod-template-file.kubernetes-helm-yaml` and modifying from there.
# We will set `priorityClassName` in this example:
# podTemplate: |
#   apiVersion: v1
#   kind: Pod
#   metadata:
#     name: placeholder-name
#     labels:
#       tier: airflow
#       component: worker
#       release: {{ .Release.Name }}
#   spec:
#     priorityClassName: high-priority
#     containers:
#       - name: base
#         ...

dags:
  # Where dags volume will be mounted. Works for both persistence and gitSync.
  # If not specified, dags mount path will be set to $AIRFLOW_HOME/dags
  mountPath: ~
  persistence:
    # Annotations for dags PVC
    annotations: {}

    # Enable persistent volume for storing dags
    enabled: false

    # Volume size for dags
    size: 1Gi

    # If using a custom storageClass, pass name here
    storageClassName:

    # Access mode of the persistent volume
    accessMode: ReadWriteOnce

    # The name of an existing PVC to use
    existingClaim:

    # Optional subpath for dag volume mount
    subPath: ~

  gitSync:
    enabled: false

    # Git repo clone url
    repo: https://github.com/apache/airflow.git
    # SSH example: git@github.com:apache/airflow.git
    # HTTPS example: https://github.com/apache/airflow.git

    branch: v2-2-stable
    rev: HEAD

    # The git revision (branch, tag, or hash) to check out, v4 only
    ref: v2-2-stable

    depth: 1

    # The number of consecutive failures allowed before aborting
    maxFailures: 0

    # Subpath within the repo where dags are located.
    # Should be "" if dags are at repo root
    subPath: "tests/dags"

    # If your repo needs a username/password, you can load them to a k8s secret
    #
    # credentialsSecret: git-credentials
    #
    # Secret example:
    #  apiVersion: v1
    #  kind: Secret
    #  metadata:
    #    name: git-credentials
    #  data:
    #    # For git-sync v3
    #    GIT_SYNC_USERNAME: <base64_encoded_git_username>
    #    GIT_SYNC_PASSWORD: <base64_encoded_git_password>
    #    # For git-sync v4
    #    GITSYNC_USERNAME: <base64_encoded_git_username>
    #    GITSYNC_PASSWORD: <base64_encoded_git_password>

    # If you are using an ssh clone url, you can load the ssh private key to a k8s secret
    #
    # sshKeySecret: airflow-ssh-secret
    #
    # Secret example:
    #  apiVersion: v1
    #  kind: Secret
    #  metadata:
    #    name: airflow-ssh-secret
    #  data:
    #    gitSshKey: <base64_encoded_data>

    # If `sshKeySecret` is not specified, you can set `sshKey`
    # sshKey: |
    #   -----BEGIN {OPENSSH PRIVATE KEY}-----
    #   ...
    #   -----END {OPENSSH PRIVATE KEY}-----

    # If you are using an ssh private key, you can additionally
    # specify the content of your known_hosts file
    # knownHosts: |
    #    <host1>,<ip1> <key1>
    #    <host2>,<ip2> <key2>

    # Interval between git sync attempts in seconds.
    # High values are more likely to cause DAGs to become out of sync between different components.
    # Low values cause more traffic to the remote git repository.
    # Go-style duration string (e.g. "100ms" or "0.1s" = 100ms).
    # For backwards compatibility, wait will be used if it is specified.
    period: 5s
    wait: ~

    # Add variables from secret into gitSync containers, such proxy-config
    envFrom: ~
    # envFrom: |
    #   - secretRef:
    #       name: 'proxy-config'

    containerName: git-sync
    uid: 65533

    # When not set, the values defined in the global `securityContext` will be used
    # (deprecated, use `dags.gitSync.securityContexts` instead)
    securityContext: {}
    #  runAsUser: 65533
    #  runAsGroup: 0

    securityContexts:
      container: {}

    # Container level lifecycle hooks
    containerLifecycleHooks: {}

    # Git-Sync liveness service HTTP bind port
    httpPort: 1234

    # Setting this to true, will remove readinessProbe usage and configure livenessProbe to
    # use a dedicated Git-Sync liveness service. In future, behaviour with value true will be
    # default one and old one will be removed
    recommendedProbeSetting: false

    startupProbe:
      enabled: true
      timeoutSeconds: 1
      initialDelaySeconds: 0
      periodSeconds: 5
      failureThreshold: 10

    # As Git-Sync is not service-type object, the usage of this section will be removed.
    # By setting `dags.gitSync.recommendedProbeSetting` to 'true', you will enable future behaviour.
    readinessProbe: {}

    # The behaviour of the LivenessProbe will change with the next release of Helm Chart.
    # To enable future behaviour set `dags.gitSync.recommendedProbeSetting` to 'true'.
    # New behaviour uses the recommended liveness configuration by using Git-Sync built-in
    # liveness service
    livenessProbe: {}
    #  enabled: true
    #  timeoutSeconds: 1
    #  initialDelaySeconds: 0
    #  periodSeconds: 5
    #  failureThreshold: 10

    # Mount additional volumes into git-sync.
    extraVolumeMounts: []
    # It can be templated like in the following example:
    #  extraVolumeMounts:
    #    - name: my-templated-extra-volume
    #      mountPath: "{{ .Values.my_custom_path }}"
    #      readOnly: true

    # Supported env vars for gitsync can be found at https://github.com/kubernetes/git-sync
    env: []
    # - name: ""
    #   value: ""

    # Configuration for empty dir volume
    # emptyDirConfig:
    #   sizeLimit: 1Gi
    #   medium: Memory

    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

logs:
  # Configuration for empty dir volume (if `logs.persistence.enabled` == 'false')
  # emptyDirConfig:
  #   sizeLimit: 1Gi
  #   medium: Memory

  persistence:
    # Enable persistent volume for storing logs
    enabled: false

    # Volume size for logs
    size: 100Gi

    # Annotations for the logs PVC
    annotations: {}

    # If using a custom storageClass, pass name here
    storageClassName:

    # The name of an existing PVC to use
    existingClaim:

    # The subpath of the existing PVC to use
    subPath:
