This is an automated email from the ASF dual-hosted git repository.
jscheffl pushed a commit to branch chart/v1-2x-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/chart/v1-2x-test by this push:
new 3329cb0cef0 [chart/v1-2x-test] Add workers.celery.logGroomerSidecar
section (#65033) (#65083)
3329cb0cef0 is described below
commit 3329cb0cef043b9438fb7cdea7515c383a63c4de
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sun Apr 12 14:40:20 2026 +0200
[chart/v1-2x-test] Add workers.celery.logGroomerSidecar section (#65033)
(#65083)
* Add workers.celery.logGroomerSidecar section
* Add newsfragment
* Fix spellcheck & tests
(cherry picked from commit 556380f86e463b1a118f0db85a37e578343ea996)
Co-authored-by: Przemysław Mirowski
<[email protected]>
---
chart/docs/setting-resources-for-containers.rst | 2 +-
chart/newsfragments/65033.significant.rst | 1 +
chart/templates/NOTES.txt | 96 +++++++
chart/values.schema.json | 313 ++++++++++++++++++++-
chart/values.yaml | 74 ++++-
helm-tests/tests/chart_utils/log_groomer.py | 145 ++++++----
.../airflow_aux/test_container_lifecycle.py | 71 ++++-
.../tests/helm_tests/airflow_core/test_worker.py | 7 +
.../helm_tests/security/test_security_context.py | 25 +-
9 files changed, 661 insertions(+), 73 deletions(-)
diff --git a/chart/docs/setting-resources-for-containers.rst
b/chart/docs/setting-resources-for-containers.rst
index 600b690778d..1402d465d79 100644
--- a/chart/docs/setting-resources-for-containers.rst
+++ b/chart/docs/setting-resources-for-containers.rst
@@ -31,7 +31,7 @@ Possible containers where resources can be configured include:
* Main Airflow containers and their sidecars. You can add the resources for
these containers through the following parameters:
* ``workers.resources``
- * ``workers.logGroomerSidecar.resources``
+ * ``workers.celery.logGroomerSidecar.resources``
* ``workers.kerberosSidecar.resources``
* ``workers.kerberosInitContainer.resources``
* ``scheduler.resources``
diff --git a/chart/newsfragments/65033.significant.rst
b/chart/newsfragments/65033.significant.rst
new file mode 100644
index 00000000000..ee4ec2bfd20
--- /dev/null
+++ b/chart/newsfragments/65033.significant.rst
@@ -0,0 +1 @@
+``workers.logGroomerSidecar`` section is now deprecated in favor of
``workers.celery.logGroomerSidecar``. Please update your configuration
accordingly.
diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt
index baee62cb881..205fd39ec19 100644
--- a/chart/templates/NOTES.txt
+++ b/chart/templates/NOTES.txt
@@ -829,6 +829,102 @@ DEPRECATION WARNING:
{{- end }}
+{{- if not .Values.workers.logGroomerSidecar.enabled }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.enabled` has been renamed to
`workers.celery.logGroomerSidecar.enabled`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if not (empty .Values.workers.logGroomerSidecar.command) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.command` has been renamed to
`workers.celery.logGroomerSidecar.command`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (.Values.workers.logGroomerSidecar.args | toJson) (list "bash"
"/clean-logs" | toJson) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.args` has been renamed to
`workers.celery.logGroomerSidecar.args`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (int .Values.workers.logGroomerSidecar.retentionDays) 15 }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.retentionDays` has been renamed to
`workers.celery.logGroomerSidecar.retentionDays`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (int .Values.workers.logGroomerSidecar.retentionMinutes) 0 }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.retentionMinutes` has been renamed to
`workers.celery.logGroomerSidecar.retentionMinutes`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (int .Values.workers.logGroomerSidecar.frequencyMinutes) 15 }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.frequencyMinutes` has been renamed to
`workers.celery.logGroomerSidecar.frequencyMinutes`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (int .Values.workers.logGroomerSidecar.maxSizeBytes) 0 }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.maxSizeBytes` has been renamed to
`workers.celery.logGroomerSidecar.maxSizeBytes`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if ne (int .Values.workers.logGroomerSidecar.maxSizePercent) 0 }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.maxSizePercent` has been renamed to
`workers.celery.logGroomerSidecar.maxSizePercent`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if not (empty .Values.workers.logGroomerSidecar.resources) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.resources` has been renamed to
`workers.celery.logGroomerSidecar.resources`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if not (empty
.Values.workers.logGroomerSidecar.securityContexts.container) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.securityContexts.container` has been renamed to
`workers.celery.logGroomerSidecar.securityContexts.container`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if not (empty .Values.workers.logGroomerSidecar.env) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.env` has been renamed to
`workers.celery.logGroomerSidecar.env`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
+{{- if not (empty .Values.workers.logGroomerSidecar.containerLifecycleHooks) }}
+
+ DEPRECATION WARNING:
+ `workers.logGroomerSidecar.containerLifecycleHooks` has been renamed to
`workers.celery.logGroomerSidecar.containerLifecycleHooks`.
+ Please change your values as support for the old name will be dropped in a
future release.
+
+{{- end }}
+
{{- if not .Values.workers.waitForMigrations.enabled }}
DEPRECATION WARNING:
diff --git a/chart/values.schema.json b/chart/values.schema.json
index 8d152146ca1..984149f26b2 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -2436,8 +2436,150 @@
}
},
"logGroomerSidecar": {
- "$ref": "#/definitions/logGroomerConfigType",
- "description": "Configuration for Airflow Celery worker
log groomer sidecar"
+ "description": "Configuration for Airflow Celery worker
log groomer sidecar (deprecated, use ``workers.celery.logGroomerSidecar``
instead).",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "enabled": {
+ "description": "Whether to deploy the Airflow log
groomer sidecar (deprecated, use ``workers.celery.logGroomerSidecar.enabled``
instead).",
+ "type": "boolean",
+ "default": true
+ },
+ "command": {
+ "description": "Command to use when running the
Airflow log groomer sidecar (templated) (deprecated, use
``workers.celery.logGroomerSidecar.command`` instead).",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "string"
+ },
+ "default": null
+ },
+ "args": {
+ "description": "Args to use when running the
Airflow log groomer sidecar (templated) (deprecated, use
``workers.celery.logGroomerSidecar.args`` instead).",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "string"
+ },
+ "default": [
+ "bash",
+ "/clean-logs"
+ ]
+ },
+ "retentionDays": {
+ "description": "Number of days to retain the logs
when running the Airflow log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.retentionDays`` instead). Total retention
time is ``retentionDays`` + ``retentionMinutes``.",
+ "type": "integer",
+ "default": 15
+ },
+ "retentionMinutes": {
+ "description": "Number of minutes to retain the
logs when running the Airflow log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.retentionMinutes`` instead). Total retention
time is ``retentionDays`` + ``retentionMinutes``.",
+ "type": "integer",
+ "default": 0
+ },
+ "frequencyMinutes": {
+ "description": "Number of minutes between attempts
to groom the Airflow logs in log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.frequencyMinutes`` instead).",
+ "type": "integer",
+ "default": 15
+ },
+ "maxSizeBytes": {
+ "description": "Max size of logs directory in
bytes (deprecated, use ``workers.celery.logGroomerSidecar.maxSizeBytes``
instead). When exceeded, the log groomer reduces retention until size is under
limit. 0 = disabled.",
+ "type": "integer",
+ "default": 0,
+ "minimum": 0
+ },
+ "maxSizePercent": {
+ "description": "Max size of logs as a percentage
of total disk space (deprecated, use
``workers.celery.logGroomerSidecar.maxSizePercent`` instead). When exceeded,
the log groomer reduces retention until size is under limit. 0 = disabled.
Ignored if ``maxSizeBytes`` is set.",
+ "type": "integer",
+ "default": 0,
+ "minimum": 0,
+ "maximum": 100
+ },
+ "env": {
+ "description": "Add additional env vars to log
groomer sidecar container (templated) (deprecated, use
``workers.celery.logGroomerSidecar.env`` instead).",
+ "items": {
+ "$ref":
"#/definitions/io.k8s.api.core.v1.EnvVar"
+ },
+ "type": "array",
+ "default": [],
+ "x-kubernetes-patch-merge-key": "name",
+ "x-kubernetes-patch-strategy": "merge"
+ },
+ "resources": {
+ "description": "Resources for Airflow log groomer
sidecar (deprecated, use ``workers.celery.logGroomerSidecar.resources``
instead).",
+ "type": "object",
+ "default": {},
+ "examples": [
+ {
+ "limits": {
+ "cpu": "100m",
+ "memory": "128Mi"
+ },
+ "requests": {
+ "cpu": "100m",
+ "memory": "128Mi"
+ }
+ }
+ ],
+ "$ref":
"#/definitions/io.k8s.api.core.v1.ResourceRequirements"
+ },
+ "containerLifecycleHooks": {
+ "description": "Container Lifecycle Hooks
definition for the log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.containerLifecycleHooks`` instead). If not
set, the values from global `containerLifecycleHooks` will be used.",
+ "type": "object",
+ "$ref":
"#/definitions/io.k8s.api.core.v1.Lifecycle",
+ "default": {},
+ "x-docsSection": "Kubernetes",
+ "examples": [
+ {
+ "postStart": {
+ "exec": {
+ "command": [
+ "/bin/sh",
+ "-c",
+ "echo postStart handler >
/usr/share/message"
+ ]
+ }
+ },
+ "preStop": {
+ "exec": {
+ "command": [
+ "/bin/sh",
+ "-c",
+ "echo preStop handler >
/usr/share/message"
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "securityContexts": {
+ "description": "Security context definition for
the log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.securityContexts`` instead). If not set, the
values from global `securityContexts` will be used.",
+ "type": "object",
+ "x-docsSection": "Kubernetes",
+ "properties": {
+ "container": {
+ "description": "Container security context
definition for the log groomer sidecar (deprecated, use
``workers.celery.logGroomerSidecar.securityContexts.container`` instead).",
+ "type": "object",
+ "$ref":
"#/definitions/io.k8s.api.core.v1.SecurityContext",
+ "default": {},
+ "x-docsSection": "Kubernetes",
+ "examples": [
+ {
+ "allowPrivilegeEscalation": false,
+ "capabilities": {
+ "drop": [
+ "ALL"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
},
"securityContext": {
"description": "Security context for the Airflow Celery
worker pods and pods created with pod-template-file (deprecated, use
``workers.celery.securityContexts`` and/or
``workers.kubernetes.securityContexts`` instead). If not set, the values from
`securityContext` will be used.",
@@ -3506,6 +3648,167 @@
"type": "string"
}
},
+ "logGroomerSidecar": {
+ "description": "Configuration for Airflow Celery
worker log groomer sidecar.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "enabled": {
+ "description": "Whether to deploy the
Airflow log groomer sidecar.",
+ "type": [
+ "boolean",
+ "null"
+ ],
+ "default": null
+ },
+ "command": {
+ "description": "Command to use when
running the Airflow log groomer sidecar (templated).",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "string"
+ },
+ "default": null
+ },
+ "args": {
+ "description": "Args to use when running
the Airflow log groomer sidecar (templated).",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "string"
+ },
+ "default": []
+ },
+ "retentionDays": {
+ "description": "Number of days to retain
the logs when running the Airflow log groomer sidecar. Total retention time is
``retentionDays`` + ``retentionMinutes``.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "default": null
+ },
+ "retentionMinutes": {
+ "description": "Number of minutes to
retain the logs when running the Airflow log groomer sidecar. Total retention
time is ``retentionDays`` + ``retentionMinutes``.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "default": null
+ },
+ "frequencyMinutes": {
+ "description": "Number of minutes between
attempts to groom the Airflow logs in log groomer sidecar.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "default": null
+ },
+ "maxSizeBytes": {
+ "description": "Max size of logs directory
in bytes. When exceeded, the log groomer reduces retention until size is under
limit. 0 = disabled.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "default": null,
+ "minimum": 0
+ },
+ "maxSizePercent": {
+ "description": "Max size of logs as a
percentage of total disk space. When exceeded, the log groomer reduces
retention until size is under limit. 0 = disabled. Ignored if ``maxSizeBytes``
is set.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "default": null,
+ "minimum": 0,
+ "maximum": 100
+ },
+ "env": {
+ "description": "Add additional env vars to
log groomer sidecar container (templated).",
+ "items": {
+ "$ref":
"#/definitions/io.k8s.api.core.v1.EnvVar"
+ },
+ "type": "array",
+ "default": [],
+ "x-kubernetes-patch-merge-key": "name",
+ "x-kubernetes-patch-strategy": "merge"
+ },
+ "resources": {
+ "description": "Resources for Airflow log
groomer sidecar.",
+ "type": "object",
+ "default": {},
+ "examples": [
+ {
+ "limits": {
+ "cpu": "100m",
+ "memory": "128Mi"
+ },
+ "requests": {
+ "cpu": "100m",
+ "memory": "128Mi"
+ }
+ }
+ ],
+ "$ref":
"#/definitions/io.k8s.api.core.v1.ResourceRequirements"
+ },
+ "containerLifecycleHooks": {
+ "description": "Container Lifecycle Hooks
definition for the log groomer sidecar. If not set, the values from
``workers.containerLifecycleHooks`` will be used.",
+ "type": "object",
+ "$ref":
"#/definitions/io.k8s.api.core.v1.Lifecycle",
+ "default": {},
+ "x-docsSection": "Kubernetes",
+ "examples": [
+ {
+ "postStart": {
+ "exec": {
+ "command": [
+ "/bin/sh",
+ "-c",
+ "echo postStart
handler > /usr/share/message"
+ ]
+ }
+ },
+ "preStop": {
+ "exec": {
+ "command": [
+ "/bin/sh",
+ "-c",
+ "echo preStop handler
> /usr/share/message"
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "securityContexts": {
+ "description": "Security context
definition for the log groomer sidecar. If not set, the values from
``workers.securityContexts`` will be used.",
+ "type": "object",
+ "x-docsSection": "Kubernetes",
+ "properties": {
+ "container": {
+ "description": "Container security
context definition for the log groomer sidecar.",
+ "type": "object",
+ "$ref":
"#/definitions/io.k8s.api.core.v1.SecurityContext",
+ "default": {},
+ "x-docsSection": "Kubernetes",
+ "examples": [
+ {
+
"allowPrivilegeEscalation": false,
+ "capabilities": {
+ "drop": [
+ "ALL"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
"waitForMigrations": {
"description": "Configuration of
wait-for-airflow-migration init container for Airflow Celery workers.",
"type": "object",
@@ -14698,12 +15001,12 @@
]
},
"retentionDays": {
- "description": "Number of days to retain the logs when
running the Airflow log groomer sidecar. Total retention time is retentionDays
+ retentionMinutes.",
+ "description": "Number of days to retain the logs when
running the Airflow log groomer sidecar. Total retention time is
``retentionDays`` + ``retentionMinutes``.",
"type": "integer",
"default": 15
},
"retentionMinutes": {
- "description": "Number of minutes to retain the logs when
running the Airflow log groomer sidecar. Total retention time is retentionDays
+ retentionMinutes.",
+ "description": "Number of minutes to retain the logs when
running the Airflow log groomer sidecar. Total retention time is
``retentionDays`` + ``retentionMinutes``.",
"type": "integer",
"default": 0
},
@@ -14719,7 +15022,7 @@
"minimum": 0
},
"maxSizePercent": {
- "description": "Max size of logs as a percentage of total
disk space. When exceeded, the log groomer reduces retention until size is
under limit. 0 = disabled. Ignored if maxSizeBytes is set.",
+ "description": "Max size of logs as a percentage of total
disk space. When exceeded, the log groomer reduces retention until size is
under limit. 0 = disabled. Ignored if ``maxSizeBytes`` is set.",
"type": "integer",
"default": 0,
"minimum": 0,
diff --git a/chart/values.yaml b/chart/values.yaml
index 8a3290df5aa..fa56e57bebc 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -1142,33 +1142,43 @@ workers:
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.
+ # 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.
+ # 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
@@ -1177,12 +1187,19 @@ workers:
# cpu: 100m
# memory: 128Mi
- # Detailed default security context for logGroomerSidecar for container
level
+ # 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:
@@ -1533,6 +1550,51 @@ workers:
# Pod annotations for the Airflow Celery workers (templated)
podAnnotations: {}
+ # 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
@@ -1911,7 +1973,7 @@ scheduler:
# 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.
+ # Max size of logs as a percent of disk usage. 0 = disabled. Ignored if
`maxSizeBytes` is set.
maxSizePercent: 0
resources: {}
@@ -1922,7 +1984,7 @@ scheduler:
# cpu: 100m
# memory: 128Mi
- # Detailed default security context for logGroomerSidecar for container
level
+ # Detailed default security context for `logGroomerSidecar` for container
level
securityContexts:
container: {}
@@ -2845,7 +2907,7 @@ triggerer:
# cpu: 100m
# memory: 128Mi
- # Detailed default security context for logGroomerSidecar for container
level
+ # Detailed default security context for `logGroomerSidecar` for container
level
securityContexts:
container: {}
diff --git a/helm-tests/tests/chart_utils/log_groomer.py
b/helm-tests/tests/chart_utils/log_groomer.py
index 4d88c7da947..36a2c1eb7ae 100644
--- a/helm-tests/tests/chart_utils/log_groomer.py
+++ b/helm-tests/tests/chart_utils/log_groomer.py
@@ -26,18 +26,27 @@ class LogGroomerTestBase:
obj_name: str = ""
folder: str = ""
+ def get_show_only(self):
+ if self.obj_name == "workers-celery":
+ return [f"templates/{self.folder}/worker-deployment.yaml"]
+
+ return [f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
+
def test_log_groomer_collector_default_enabled(self):
if self.obj_name == "dag-processor":
values = {"dagProcessor": {"enabled": True}}
else:
values = None
- docs = render_chart(
- values=values,
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
- )
+ if self.obj_name == "workers-celery":
+ container_name = "worker-log-groomer"
+ else:
+ container_name = f"{self.obj_name}-log-groomer"
+
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert len(jmespath.search("spec.template.spec.containers", docs[0]))
== 2
- assert f"{self.obj_name}-log-groomer" in [
+ assert container_name in [
c["name"] for c in
jmespath.search("spec.template.spec.containers", docs[0])
]
@@ -49,14 +58,18 @@ class LogGroomerTestBase:
"logGroomerSidecar": {"enabled": False},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {
+ "workers": {
+ "celery": {
+ "logGroomerSidecar": {"enabled": False},
+ }
+ }
+ }
else:
values = {f"{self.folder}": {"logGroomerSidecar": {"enabled":
False}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
-
+ docs = render_chart(values=values, show_only=self.get_show_only())
actual = jmespath.search("spec.template.spec.containers", docs[0])
assert len(actual) == 1
@@ -67,9 +80,7 @@ class LogGroomerTestBase:
else:
values = None
- docs = render_chart(
- values=values,
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert jmespath.search("spec.template.spec.containers[1].command",
docs[0]) is None
assert jmespath.search("spec.template.spec.containers[1].args",
docs[0]) == ["bash", "/clean-logs"]
@@ -80,9 +91,7 @@ class LogGroomerTestBase:
else:
values = None
- docs = render_chart(
- values=values,
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert {"name": "AIRFLOW__LOG_RETENTION_DAYS", "value": "15"} in
jmespath.search(
"spec.template.spec.containers[1].env", docs[0]
@@ -96,6 +105,8 @@ class LogGroomerTestBase:
if self.obj_name == "dag-processor":
values = {"dagProcessor": {"enabled": True, "logGroomerSidecar":
{"env": env}}}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar": {"env":
env}}}}
else:
values = {
"workers": {"logGroomerSidecar": {"env": env}},
@@ -103,9 +114,7 @@ class LogGroomerTestBase:
"triggerer": {"logGroomerSidecar": {"env": env}},
}
- docs = render_chart(
- values=values,
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert {"name": "APP_RELEASE_NAME", "value": "release-name-airflow"}
in jmespath.search(
"spec.template.spec.containers[1].env", docs[0]
@@ -124,16 +133,22 @@ class LogGroomerTestBase:
"logGroomerSidecar": {"command": command, "args": args},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar": {"command":
command, "args": args}}}}
else:
values = {f"{self.folder}": {"logGroomerSidecar": {"command":
command, "args": args}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert command ==
jmespath.search("spec.template.spec.containers[1].command", docs[0])
- assert args ==
jmespath.search("spec.template.spec.containers[1].args", docs[0])
+
+ if self.obj_name == "workers-celery" and args is None:
+ assert jmespath.search("spec.template.spec.containers[1].args",
docs[0]) == [
+ "bash",
+ "/clean-logs",
+ ]
+ else:
+ assert args ==
jmespath.search("spec.template.spec.containers[1].args", docs[0])
def test_log_groomer_command_and_args_overrides_are_templated(self):
if self.obj_name == "dag-processor":
@@ -146,6 +161,17 @@ class LogGroomerTestBase:
},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {
+ "workers": {
+ "celery": {
+ "logGroomerSidecar": {
+ "command": ["{{ .Release.Name }}"],
+ "args": ["{{ .Release.Service }}"],
+ }
+ }
+ }
+ }
else:
values = {
f"{self.folder}": {
@@ -156,10 +182,7 @@ class LogGroomerTestBase:
}
}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert jmespath.search("spec.template.spec.containers[1].command",
docs[0]) == ["release-name"]
assert jmespath.search("spec.template.spec.containers[1].args",
docs[0]) == ["Helm"]
@@ -170,13 +193,12 @@ class LogGroomerTestBase:
values = {
"dagProcessor": {"enabled": True, "logGroomerSidecar":
{"retentionDays": retention_days}}
}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar":
{"retentionDays": retention_days}}}}
else:
values = {f"{self.folder}": {"logGroomerSidecar":
{"retentionDays": retention_days}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
if retention_result:
assert (
@@ -186,6 +208,15 @@ class LogGroomerTestBase:
)
== retention_result
)
+ elif self.obj_name == "workers-celery" and retention_result is None:
+ # Testing backward compatibility of move from workers to
workers.celery
+ assert (
+ jmespath.search(
+
"spec.template.spec.containers[1].env[?name=='AIRFLOW__LOG_RETENTION_DAYS'].value
| [0]",
+ docs[0],
+ )
+ == "15"
+ )
else:
assert len(jmespath.search("spec.template.spec.containers[1].env",
docs[0])) == 2
@@ -198,13 +229,12 @@ class LogGroomerTestBase:
"logGroomerSidecar": {"frequencyMinutes":
frequency_minutes},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar":
{"frequencyMinutes": frequency_minutes}}}}
else:
values = {f"{self.folder}": {"logGroomerSidecar":
{"frequencyMinutes": frequency_minutes}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
if frequency_result:
assert (
@@ -214,6 +244,15 @@ class LogGroomerTestBase:
)
== frequency_result
)
+ elif self.obj_name == "workers-celery" and frequency_result is None:
+ # Testing backward compatibility of move from workers to
workers.celery
+ assert (
+ jmespath.search(
+
"spec.template.spec.containers[1].env[?name=='AIRFLOW__LOG_RETENTION_DAYS'].value
| [0]",
+ docs[0],
+ )
+ == "15"
+ )
else:
assert len(jmespath.search("spec.template.spec.containers[1].env",
docs[0])) == 2
@@ -228,13 +267,12 @@ class LogGroomerTestBase:
"logGroomerSidecar": {"maxSizeBytes": max_size_bytes},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar":
{"maxSizeBytes": max_size_bytes}}}}
else:
values = {f"{self.folder}": {"logGroomerSidecar": {"maxSizeBytes":
max_size_bytes}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
if max_size_result:
assert (
@@ -262,13 +300,12 @@ class LogGroomerTestBase:
"logGroomerSidecar": {"maxSizePercent": max_size_percent},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {"workers": {"celery": {"logGroomerSidecar":
{"maxSizePercent": max_size_percent}}}}
else:
values = {f"{self.folder}": {"logGroomerSidecar":
{"maxSizePercent": max_size_percent}}}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
if max_size_result:
assert (
@@ -300,6 +337,19 @@ class LogGroomerTestBase:
},
}
}
+ elif self.obj_name == "workers-celery":
+ values = {
+ "workers": {
+ "celery": {
+ "logGroomerSidecar": {
+ "resources": {
+ "requests": {"memory": "2Gi", "cpu": "1"},
+ "limits": {"memory": "3Gi", "cpu": "2"},
+ }
+ }
+ }
+ }
+ }
else:
values = {
f"{self.folder}": {
@@ -312,10 +362,7 @@ class LogGroomerTestBase:
}
}
- docs = render_chart(
- values=values,
-
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"],
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert jmespath.search("spec.template.spec.containers[1].resources",
docs[0]) == {
"limits": {
@@ -334,9 +381,7 @@ class LogGroomerTestBase:
else:
values = None
- docs = render_chart(
- values=values,
show_only=[f"templates/{self.folder}/{self.obj_name}-deployment.yaml"]
- )
+ docs = render_chart(values=values, show_only=self.get_show_only())
assert (
jmespath.search("spec.template.spec.containers[1].env[?name=='AIRFLOW_HOME'].name
| [0]", docs[0])
diff --git
a/helm-tests/tests/helm_tests/airflow_aux/test_container_lifecycle.py
b/helm-tests/tests/helm_tests/airflow_aux/test_container_lifecycle.py
index 04bef2de7df..f701e3f9ba8 100644
--- a/helm-tests/tests/helm_tests/airflow_aux/test_container_lifecycle.py
+++ b/helm-tests/tests/helm_tests/airflow_aux/test_container_lifecycle.py
@@ -265,25 +265,78 @@ class TestContainerLifecycleHooks:
# Test container lifecycle hooks for log-groomer-sidecar main container
@pytest.mark.parametrize("hook_type", ["preStop", "postStart"])
- def test_log_groomer_sidecar_container_setting(self, hook_type):
+ def test_log_groomer_sidecar_container_setting_scheduler(self, hook_type):
docs = render_chart(
name=RELEASE_NAME,
values={
"scheduler": {
"logGroomerSidecar": {"containerLifecycleHooks":
{hook_type: LIFECYCLE_TEMPLATE}}
},
- "workers": {
- "logGroomerSidecar": {"containerLifecycleHooks":
{hook_type: LIFECYCLE_TEMPLATE}}
- },
},
show_only=[
"templates/scheduler/scheduler-deployment.yaml",
+ ],
+ )
+
+ assert (
+
jmespath.search(f"spec.template.spec.containers[1].lifecycle.{hook_type}",
docs[0])
+ == LIFECYCLE_PARSED
+ )
+
+ @pytest.mark.parametrize(
+ ("workers_values", "expected"),
+ [
+ (
+ {"logGroomerSidecar": {"containerLifecycleHooks": {"preStop":
LIFECYCLE_TEMPLATE}}},
+ {"preStop": LIFECYCLE_PARSED},
+ ),
+ (
+ {"logGroomerSidecar": {"containerLifecycleHooks":
{"postStart": LIFECYCLE_TEMPLATE}}},
+ {"postStart": LIFECYCLE_PARSED},
+ ),
+ (
+ {
+ "celery": {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"preStop": LIFECYCLE_TEMPLATE}}
+ }
+ },
+ {"preStop": LIFECYCLE_PARSED},
+ ),
+ (
+ {
+ "celery": {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"postStart": LIFECYCLE_TEMPLATE}}
+ }
+ },
+ {"postStart": LIFECYCLE_PARSED},
+ ),
+ (
+ {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"postStart": LIFECYCLE_TEMPLATE}},
+ "celery": {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"preStop": LIFECYCLE_TEMPLATE}}
+ },
+ },
+ {"preStop": LIFECYCLE_PARSED},
+ ),
+ (
+ {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"preStop": LIFECYCLE_TEMPLATE}},
+ "celery": {
+ "logGroomerSidecar": {"containerLifecycleHooks":
{"postStart": LIFECYCLE_TEMPLATE}}
+ },
+ },
+ {"postStart": LIFECYCLE_PARSED},
+ ),
+ ],
+ )
+ def test_log_groomer_sidecar_container_setting(self, workers_values,
expected):
+ docs = render_chart(
+ name=RELEASE_NAME,
+ values={"workers": workers_values},
+ show_only=[
"templates/workers/worker-deployment.yaml",
],
)
- for doc in docs:
- assert (
-
jmespath.search(f"spec.template.spec.containers[1].lifecycle.{hook_type}", doc)
- == LIFECYCLE_PARSED
- )
+ assert jmespath.search("spec.template.spec.containers[1].lifecycle",
docs[0]) == expected
diff --git a/helm-tests/tests/helm_tests/airflow_core/test_worker.py
b/helm-tests/tests/helm_tests/airflow_core/test_worker.py
index 38bba315458..376a2d30c08 100644
--- a/helm-tests/tests/helm_tests/airflow_core/test_worker.py
+++ b/helm-tests/tests/helm_tests/airflow_core/test_worker.py
@@ -2290,6 +2290,13 @@ class TestWorkerLogGroomer(LogGroomerTestBase):
folder = "workers"
+class TestWorkerCeleryLogGroomer(LogGroomerTestBase):
+ """Worker Celery groomer."""
+
+ obj_name = "workers-celery"
+ folder = "workers"
+
+
class TestWorkerKedaAutoScaler:
"""Tests worker keda auto scaler."""
diff --git a/helm-tests/tests/helm_tests/security/test_security_context.py
b/helm-tests/tests/helm_tests/security/test_security_context.py
index a5e9d70816b..39e9281d04b 100644
--- a/helm-tests/tests/helm_tests/security/test_security_context.py
+++ b/helm-tests/tests/helm_tests/security/test_security_context.py
@@ -554,13 +554,34 @@ class TestSecurityContext:
assert ctx_value ==
jmespath.search("spec.template.spec.containers[0].securityContext", doc)
# Test securityContexts for log-groomer-sidecar main container
- def test_log_groomer_sidecar_container_setting(self):
+ @pytest.mark.parametrize(
+ "workers_values",
+ [
+ {"logGroomerSidecar": {"securityContexts": {"container":
{"allowPrivilegeEscalation": False}}}},
+ {
+ "celery": {
+ "logGroomerSidecar": {
+ "securityContexts": {"container":
{"allowPrivilegeEscalation": False}}
+ }
+ }
+ },
+ {
+ "logGroomerSidecar": {"securityContexts": {"container":
{"runAsUser": 20}}},
+ "celery": {
+ "logGroomerSidecar": {
+ "securityContexts": {"container":
{"allowPrivilegeEscalation": False}}
+ }
+ },
+ },
+ ],
+ )
+ def test_log_groomer_sidecar_container_setting(self, workers_values):
ctx_value = {"allowPrivilegeEscalation": False}
spec = {"logGroomerSidecar": {"securityContexts": {"container":
ctx_value}}}
docs = render_chart(
values={
"scheduler": spec,
- "workers": spec,
+ "workers": workers_values,
"dagProcessor": spec,
"triggerer": spec,
},