This is an automated email from the ASF dual-hosted git repository.
bugraoz93 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 462aacb58bf Disable otel collector by default (#67575) (#67607)
462aacb58bf is described below
commit 462aacb58bfb8c7f620bb4874b7414c2b8651f18
Author: Przemysław Mirowski <[email protected]>
AuthorDate: Wed May 27 18:41:23 2026 +0200
Disable otel collector by default (#67575) (#67607)
* Disable otel collector by default
* Fix one test case in basic helm tests
* Remove redudant comments in tests
* Combine global vars
* Remove env helper functions
(cherry picked from commit 27295a30d0f134dcb9b940f75e97aa64c1ad56e6)
---
chart/values.schema.json | 2 +-
chart/values.yaml | 2 +-
.../helm_tests/airflow_aux/test_airflow_common.py | 12 -
.../airflow_aux/test_basic_helm_chart.py | 9 +-
.../otel_collector/test_labels_deployment.py | 5 -
.../otel_collector/test_labels_networkpolicy.py | 4 -
.../otel_collector/test_labels_service.py | 4 -
.../otel_collector/test_labels_serviceaccount.py | 4 -
.../otel_collector/test_otel_collector.py | 284 +++++++++++++--------
helm-tests/tests/helm_tests/security/test_rbac.py | 16 +-
10 files changed, 197 insertions(+), 145 deletions(-)
diff --git a/chart/values.schema.json b/chart/values.schema.json
index cadc5e9d75d..3ad6a95aa3f 100644
--- a/chart/values.schema.json
+++ b/chart/values.schema.json
@@ -9511,7 +9511,7 @@
"tracesEnabled": {
"description": "Send Airflow traces to the OTel Collector.
Sets `[traces] otel_on` in the rendered Airflow config and deploys the
collector when either `tracesEnabled` or `metricsEnabled` is true.",
"type": "boolean",
- "default": true
+ "default": false
},
"metricsEnabled": {
"description": "Send Airflow metrics to the OTel
Collector. Sets `[metrics] otel_on` in the rendered Airflow config and forces
`[metrics] statsd_on` to False because Airflow can only export metrics to one
backend at a time.",
diff --git a/chart/values.yaml b/chart/values.yaml
index 1fe6b159a29..c5e2446c206 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -3504,7 +3504,7 @@ statsd:
# OpenTelemetry Collector settings
otelCollector:
# Send Airflow traces to the OTel Collector (sets [traces] otel_on).
- tracesEnabled: true
+ tracesEnabled: false
# Send Airflow metrics to the OTel Collector (sets [metrics] otel_on and
disables statsd).
metricsEnabled: false
diff --git a/helm-tests/tests/helm_tests/airflow_aux/test_airflow_common.py
b/helm-tests/tests/helm_tests/airflow_aux/test_airflow_common.py
index 8fa844d781f..1e237572763 100644
--- a/helm-tests/tests/helm_tests/airflow_aux/test_airflow_common.py
+++ b/helm-tests/tests/helm_tests/airflow_aux/test_airflow_common.py
@@ -419,10 +419,6 @@ class TestAirflowCommon:
"AIRFLOW__CORE__FERNET_KEY",
"AIRFLOW_CONN_AIRFLOW_DB",
"AIRFLOW__CELERY__BROKER_URL",
- "OTEL_SERVICE_NAME",
- "OTEL_EXPORTER_OTLP_PROTOCOL",
- "OTEL_TRACES_EXPORTER",
- "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
]
expected_vars_in_worker = ["DUMB_INIT_SETSID"] + expected_vars
for doc in docs:
@@ -453,10 +449,6 @@ class TestAirflowCommon:
"AIRFLOW__API__SECRET_KEY",
"AIRFLOW__API_AUTH__JWT_SECRET",
"AIRFLOW__CELERY__BROKER_URL",
- "OTEL_SERVICE_NAME",
- "OTEL_EXPORTER_OTLP_PROTOCOL",
- "OTEL_TRACES_EXPORTER",
- "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
]
expected_vars_no_jwt = [
"AIRFLOW_HOME",
@@ -465,10 +457,6 @@ class TestAirflowCommon:
"AIRFLOW_CONN_AIRFLOW_DB",
"AIRFLOW__API__SECRET_KEY",
"AIRFLOW__CELERY__BROKER_URL",
- "OTEL_SERVICE_NAME",
- "OTEL_EXPORTER_OTLP_PROTOCOL",
- "OTEL_TRACES_EXPORTER",
- "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
]
for doc in docs:
component = doc["metadata"]["labels"]["component"]
diff --git a/helm-tests/tests/helm_tests/airflow_aux/test_basic_helm_chart.py
b/helm-tests/tests/helm_tests/airflow_aux/test_basic_helm_chart.py
index 5b073ce1e59..f6f3c31952b 100644
--- a/helm-tests/tests/helm_tests/airflow_aux/test_basic_helm_chart.py
+++ b/helm-tests/tests/helm_tests/airflow_aux/test_basic_helm_chart.py
@@ -33,7 +33,6 @@ OBJECTS_STD_NAMING = {
("ServiceAccount", "test-basic-airflow-redis"),
("ServiceAccount", "test-basic-airflow-scheduler"),
("ServiceAccount", "test-basic-airflow-statsd"),
- ("ServiceAccount", "test-basic-airflow-otel-collector"),
("ServiceAccount", "test-basic-airflow-triggerer"),
("ServiceAccount", "test-basic-airflow-worker"),
("Secret", "test-basic-airflow-metadata"),
@@ -43,21 +42,18 @@ OBJECTS_STD_NAMING = {
("Secret", "test-basic-postgresql"),
("ConfigMap", "test-basic-airflow-config"),
("ConfigMap", "test-basic-airflow-statsd"),
- ("ConfigMap", "test-basic-airflow-otel-collector"),
("Role", "test-basic-airflow-pod-launcher-role"),
("Role", "test-basic-airflow-pod-log-reader-role"),
("RoleBinding", "test-basic-airflow-pod-launcher-rolebinding"),
("RoleBinding", "test-basic-airflow-pod-log-reader-rolebinding"),
("Service", "test-basic-airflow-redis"),
("Service", "test-basic-airflow-statsd"),
- ("Service", "test-basic-airflow-otel-collector"),
("Service", "test-basic-airflow-triggerer"),
("Service", "test-basic-airflow-worker"),
("Service", "test-basic-postgresql"),
("Service", "test-basic-postgresql-hl"),
("Deployment", "test-basic-airflow-scheduler"),
("Deployment", "test-basic-airflow-statsd"),
- ("Deployment", "test-basic-airflow-otel-collector"),
("StatefulSet", "test-basic-airflow-redis"),
("StatefulSet", "test-basic-airflow-worker"),
("StatefulSet", "test-basic-airflow-triggerer"),
@@ -134,7 +130,6 @@ class TestBaseChartTest:
("ServiceAccount", "test-basic-redis"),
("ServiceAccount", "test-basic-scheduler"),
("ServiceAccount", "test-basic-statsd"),
- ("ServiceAccount", "test-basic-otel-collector"),
("ServiceAccount", "test-basic-triggerer"),
("ServiceAccount", "test-basic-worker"),
("Secret", "test-basic-metadata"),
@@ -144,7 +139,6 @@ class TestBaseChartTest:
("Secret", "test-basic-redis-password"),
("ConfigMap", "test-basic-config"),
("ConfigMap", "test-basic-statsd"),
- ("ConfigMap", "test-basic-otel-collector"),
("Role", "test-basic-pod-launcher-role"),
("Role", "test-basic-pod-log-reader-role"),
("RoleBinding", "test-basic-pod-launcher-rolebinding"),
@@ -153,12 +147,10 @@ class TestBaseChartTest:
("Service", "test-basic-postgresql"),
("Service", "test-basic-redis"),
("Service", "test-basic-statsd"),
- ("Service", "test-basic-otel-collector"),
("Service", "test-basic-triggerer"),
("Service", "test-basic-worker"),
("Deployment", "test-basic-scheduler"),
("Deployment", "test-basic-statsd"),
- ("Deployment", "test-basic-otel-collector"),
("StatefulSet", "test-basic-triggerer"),
("StatefulSet", "test-basic-postgresql"),
("StatefulSet", "test-basic-redis"),
@@ -340,6 +332,7 @@ class TestBaseChartTest:
"executor": executor,
"flower": {"enabled": True},
"pgbouncer": {"enabled": True},
+ "otelCollector": {"tracesEnabled": True},
},
version=airflow_version,
),
diff --git
a/helm-tests/tests/helm_tests/otel_collector/test_labels_deployment.py
b/helm-tests/tests/helm_tests/otel_collector/test_labels_deployment.py
index 40d2e7b33d6..2c4ff0fae43 100644
--- a/helm-tests/tests/helm_tests/otel_collector/test_labels_deployment.py
+++ b/helm-tests/tests/helm_tests/otel_collector/test_labels_deployment.py
@@ -26,7 +26,6 @@ class TestOtelCollectorDeployment:
TEMPLATE_FILE = "templates/otel-collector/otel-collector-deployment.yaml"
def test_should_add_global_labels_to_metadata(self):
- """Test adding only .Values.labels to metadata.labels."""
docs = render_chart(
values={
"otelCollector": {"tracesEnabled": True},
@@ -39,7 +38,6 @@ class TestOtelCollectorDeployment:
assert jmespath.search("metadata.labels",
docs[0])["test_global_label"] == "test_global_label_value"
def test_should_add_global_labels_to_pod_template(self):
- """Test adding only .Values.labels to spec.template.metadata.labels."""
docs = render_chart(
values={
"otelCollector": {"tracesEnabled": True},
@@ -55,7 +53,6 @@ class TestOtelCollectorDeployment:
)
def test_should_add_component_specific_labels_to_pod_template(self):
- """Test adding only .Values.otelCollector.labels to
spec.template.metadata.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -73,7 +70,6 @@ class TestOtelCollectorDeployment:
)
def
test_should_merge_global_and_component_specific_labels_in_pod_template(self):
- """Test adding both .Values.labels and .Values.otelCollector.labels to
spec.template.metadata.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -97,7 +93,6 @@ class TestOtelCollectorDeployment:
)
def test_component_specific_labels_should_override_global_labels(self):
- """Test that component-specific labels take precedence over global
labels with the same key."""
docs = render_chart(
values={
"otelCollector": {
diff --git
a/helm-tests/tests/helm_tests/otel_collector/test_labels_networkpolicy.py
b/helm-tests/tests/helm_tests/otel_collector/test_labels_networkpolicy.py
index 57595157cc1..e156fe48e6c 100644
--- a/helm-tests/tests/helm_tests/otel_collector/test_labels_networkpolicy.py
+++ b/helm-tests/tests/helm_tests/otel_collector/test_labels_networkpolicy.py
@@ -26,7 +26,6 @@ class TestOtelCollectorNetworkPolicy:
TEMPLATE_FILE =
"templates/otel-collector/otel-collector-networkpolicy.yaml"
def test_should_add_global_labels(self):
- """Test adding only .Values.labels."""
docs = render_chart(
values={
"otelCollector": {"tracesEnabled": True},
@@ -40,7 +39,6 @@ class TestOtelCollectorNetworkPolicy:
assert jmespath.search("metadata.labels",
docs[0])["test_global_label"] == "test_global_label_value"
def test_should_add_component_specific_labels(self):
- """Test adding only .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -59,7 +57,6 @@ class TestOtelCollectorNetworkPolicy:
)
def test_should_merge_global_and_component_specific_labels(self):
- """Test adding both .Values.labels and .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -81,7 +78,6 @@ class TestOtelCollectorNetworkPolicy:
)
def test_component_specific_labels_should_override_global_labels(self):
- """Test that component-specific labels take precedence over global
labels with the same key."""
docs = render_chart(
values={
"otelCollector": {
diff --git a/helm-tests/tests/helm_tests/otel_collector/test_labels_service.py
b/helm-tests/tests/helm_tests/otel_collector/test_labels_service.py
index f92abc10205..86b0023d801 100644
--- a/helm-tests/tests/helm_tests/otel_collector/test_labels_service.py
+++ b/helm-tests/tests/helm_tests/otel_collector/test_labels_service.py
@@ -26,7 +26,6 @@ class TestOtelCollectorService:
TEMPLATE_FILE = "templates/otel-collector/otel-collector-service.yaml"
def test_should_add_global_labels(self):
- """Test adding only .Values.labels."""
docs = render_chart(
values={
"otelCollector": {"tracesEnabled": True},
@@ -39,7 +38,6 @@ class TestOtelCollectorService:
assert jmespath.search("metadata.labels",
docs[0])["test_global_label"] == "test_global_label_value"
def test_should_add_component_specific_labels(self):
- """Test adding only .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -57,7 +55,6 @@ class TestOtelCollectorService:
)
def test_should_merge_global_and_component_specific_labels(self):
- """Test adding both .Values.labels and .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -78,7 +75,6 @@ class TestOtelCollectorService:
)
def test_component_specific_labels_should_override_global_labels(self):
- """Test that component-specific labels take precedence over global
labels with the same key."""
docs = render_chart(
values={
"otelCollector": {
diff --git
a/helm-tests/tests/helm_tests/otel_collector/test_labels_serviceaccount.py
b/helm-tests/tests/helm_tests/otel_collector/test_labels_serviceaccount.py
index c899670766f..9775676bfd6 100644
--- a/helm-tests/tests/helm_tests/otel_collector/test_labels_serviceaccount.py
+++ b/helm-tests/tests/helm_tests/otel_collector/test_labels_serviceaccount.py
@@ -26,7 +26,6 @@ class TestOtelCollectorServiceAccount:
TEMPLATE_FILE =
"templates/otel-collector/otel-collector-serviceaccount.yaml"
def test_should_add_global_labels(self):
- """Test adding only .Values.labels."""
docs = render_chart(
values={
"otelCollector": {"tracesEnabled": True},
@@ -39,7 +38,6 @@ class TestOtelCollectorServiceAccount:
assert jmespath.search("metadata.labels",
docs[0])["test_global_label"] == "test_global_label_value"
def test_should_add_component_specific_labels(self):
- """Test adding only .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -57,7 +55,6 @@ class TestOtelCollectorServiceAccount:
)
def test_should_merge_global_and_component_specific_labels(self):
- """Test adding both .Values.labels and .Values.otelCollector.labels."""
docs = render_chart(
values={
"otelCollector": {
@@ -78,7 +75,6 @@ class TestOtelCollectorServiceAccount:
)
def test_component_specific_labels_should_override_global_labels(self):
- """Test that component-specific labels take precedence over global
labels with the same key."""
docs = render_chart(
values={
"otelCollector": {
diff --git a/helm-tests/tests/helm_tests/otel_collector/test_otel_collector.py
b/helm-tests/tests/helm_tests/otel_collector/test_otel_collector.py
index 70ef3aec2fd..b7d84347fb9 100644
--- a/helm-tests/tests/helm_tests/otel_collector/test_otel_collector.py
+++ b/helm-tests/tests/helm_tests/otel_collector/test_otel_collector.py
@@ -22,16 +22,12 @@ import yaml
from chart_utils.helm_template_generator import render_chart
OTEL_TEMPLATES = [
- "templates/configmaps/otel-collector-configmap.yaml",
- "templates/otel-collector/otel-collector-deployment.yaml",
- "templates/otel-collector/otel-collector-service.yaml",
- "templates/otel-collector/otel-collector-serviceaccount.yaml",
+ (CONFIGMAP_TEMPLATE :=
"templates/configmaps/otel-collector-configmap.yaml"),
+ (DEPLOYMENT_TEMPLATE :=
"templates/otel-collector/otel-collector-deployment.yaml"),
+ (SERVICE_TEMPLATE :=
"templates/otel-collector/otel-collector-service.yaml"),
+ (SERVICE_ACCOUNT_TEMPLATE :=
"templates/otel-collector/otel-collector-serviceaccount.yaml"),
]
-DEPLOYMENT_TEMPLATE = "templates/otel-collector/otel-collector-deployment.yaml"
-SERVICE_TEMPLATE = "templates/otel-collector/otel-collector-service.yaml"
-CONFIGMAP_TEMPLATE = "templates/configmaps/otel-collector-configmap.yaml"
-SERVICE_ACCOUNT_TEMPLATE =
"templates/otel-collector/otel-collector-serviceaccount.yaml"
AIRFLOW_CONFIGMAP_TEMPLATE = "templates/configmaps/configmap.yaml"
AIRFLOW_POD_TEMPLATES = [
@@ -43,50 +39,50 @@ AIRFLOW_POD_TEMPLATES = [
]
-def _env_names(doc):
- """Return the list of env var names from the first container of a pod
spec."""
- env = jmespath.search("spec.template.spec.containers[0].env", doc) or []
- return [e["name"] for e in env]
-
+class TestOtelCollectorCommon:
+ def test_standard_naming(self):
+ docs = render_chart(
+ name="test-basic",
+ values={"useStandardNaming": True, "otelCollector":
{"tracesEnabled": True}},
+ show_only=OTEL_TEMPLATES,
+ )
-def _env_value(doc, name):
- env = jmespath.search("spec.template.spec.containers[0].env", doc) or []
- for entry in env:
- if entry["name"] == name:
- return entry.get("value")
- return None
+ assert len(docs) == 4
+ assert jmespath.search("[*].[kind, metadata.name]", docs) == [
+ ["ConfigMap", "test-basic-airflow-otel-collector"],
+ ["Deployment", "test-basic-airflow-otel-collector"],
+ ["Service", "test-basic-airflow-otel-collector"],
+ ["ServiceAccount", "test-basic-airflow-otel-collector"],
+ ]
class TestOtelCollectorResourceGating:
- """Resource emission depends on tracesEnabled / metricsEnabled."""
-
- def test_default_renders_all_resources(self):
+ def test_renders_default(self):
docs = render_chart(show_only=OTEL_TEMPLATES)
- kinds = {d["kind"] for d in docs}
- assert kinds == {"ConfigMap", "Deployment", "Service",
"ServiceAccount"}
+ assert len(docs) == 0
- def test_both_flags_disabled_renders_nothing(self):
+ @pytest.mark.parametrize("otel_field", ["tracesEnabled", "metricsEnabled"])
+ def test_should_render(self, otel_field):
+ docs = render_chart(values={"otelCollector": {otel_field: True}},
show_only=OTEL_TEMPLATES)
+
+ assert len(docs) == 4
+ assert jmespath.search("[*].kind", docs) == ["ConfigMap",
"Deployment", "Service", "ServiceAccount"]
+
+ def test_should_not_render(self):
docs = render_chart(
values={"otelCollector": {"tracesEnabled": False,
"metricsEnabled": False}},
show_only=OTEL_TEMPLATES,
)
- assert docs == []
- def test_metrics_only_renders_all_resources(self):
- docs = render_chart(
- values={"otelCollector": {"tracesEnabled": False,
"metricsEnabled": True}},
- show_only=OTEL_TEMPLATES,
- )
- kinds = {d["kind"] for d in docs}
- assert kinds == {"ConfigMap", "Deployment", "Service",
"ServiceAccount"}
+ assert docs == []
class TestOtelCollectorDefaultConfig:
"""The chart-rendered config.yml has the default config for the
otel-collector."""
@staticmethod
- def _get_config_yml(values=None):
- docs = render_chart(values=values or {},
show_only=[CONFIGMAP_TEMPLATE])
+ def _get_config_yml():
+ docs = render_chart(values={"otelCollector": {"tracesEnabled": True}},
show_only=[CONFIGMAP_TEMPLATE])
config_yml = jmespath.search('data."config.yml"', docs[0])
return yaml.safe_load(config_yml)
@@ -114,7 +110,7 @@ class TestOtelCollectorDefaultConfig:
class TestOtelCollectorConfigOverride:
"""`otelCollector.config` replaces the default and supports `tpl`."""
- def test_override_replaces_default(self):
+ def test_override_default(self):
override = (
"receivers:\n"
" otlp:\n"
@@ -130,16 +126,15 @@ class TestOtelCollectorConfigOverride:
" exporters: [logging]\n"
)
docs = render_chart(
- values={"otelCollector": {"config": override}},
+ values={"otelCollector": {"tracesEnabled": True, "config":
override}},
show_only=[CONFIGMAP_TEMPLATE],
)
rendered = yaml.safe_load(jmespath.search('data."config.yml"',
docs[0]))
- # The value is '0.0.0.0:9999' instead of the default '0.0.0.0:4318'.
assert rendered["receivers"]["otlp"]["protocols"]["http"]["endpoint"]
== "0.0.0.0:9999"
# default `health_check` extension is gone in the override
assert "extensions" not in rendered
- def test_tpl_resolves_chart_values(self):
+ def test_override_default_tpl(self):
override = (
"receivers:\n"
" otlp:\n"
@@ -148,7 +143,7 @@ class TestOtelCollectorConfigOverride:
" endpoint: 0.0.0.0:{{ .Values.ports.otelCollectorOtlpHttp
}}\n"
)
docs = render_chart(
- values={"otelCollector": {"config": override}},
+ values={"otelCollector": {"tracesEnabled": True, "config":
override}},
show_only=[CONFIGMAP_TEMPLATE],
)
rendered = yaml.safe_load(jmespath.search('data."config.yml"',
docs[0]))
@@ -156,10 +151,10 @@ class TestOtelCollectorConfigOverride:
class TestOtelCollectorDeployment:
- """Deployment-level configurability."""
-
def test_default_args(self):
- docs = render_chart(show_only=[DEPLOYMENT_TEMPLATE])
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[DEPLOYMENT_TEMPLATE]
+ )
assert jmespath.search("spec.template.spec.containers[0].args",
docs[0]) == [
"--config=/etc/otel-collector/config.yml"
]
@@ -167,88 +162,136 @@ class TestOtelCollectorDeployment:
def test_args_override(self):
custom = ["--config=/etc/otel-collector/config.yml",
"--feature-gates=+foo"]
docs = render_chart(
- values={"otelCollector": {"args": custom}},
+ values={"otelCollector": {"tracesEnabled": True, "args": custom}},
show_only=[DEPLOYMENT_TEMPLATE],
)
assert jmespath.search("spec.template.spec.containers[0].args",
docs[0]) == custom
def test_default_probes(self):
- docs = render_chart(show_only=[DEPLOYMENT_TEMPLATE])
- liveness =
jmespath.search("spec.template.spec.containers[0].livenessProbe", docs[0])
- readiness =
jmespath.search("spec.template.spec.containers[0].readinessProbe", docs[0])
- assert liveness["initialDelaySeconds"] == 10
- assert liveness["periodSeconds"] == 15
- assert liveness["httpGet"] == {"path": "/", "port": 13133}
- assert readiness["initialDelaySeconds"] == 10
- assert readiness["periodSeconds"] == 15
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[DEPLOYMENT_TEMPLATE]
+ )
+
+ assert
jmespath.search("spec.template.spec.containers[0].livenessProbe", docs[0]) == {
+ "initialDelaySeconds": 10,
+ "periodSeconds": 15,
+ "httpGet": {"path": "/", "port": 13133},
+ }
+
+ assert
jmespath.search("spec.template.spec.containers[0].readinessProbe", docs[0]) == {
+ "initialDelaySeconds": 10,
+ "periodSeconds": 15,
+ "httpGet": {"path": "/", "port": 13133},
+ }
def test_probe_overrides(self):
docs = render_chart(
values={
"otelCollector": {
+ "tracesEnabled": True,
"livenessProbe": {"initialDelaySeconds": 30,
"periodSeconds": 45},
"readinessProbe": {"initialDelaySeconds": 5,
"periodSeconds": 7},
}
},
show_only=[DEPLOYMENT_TEMPLATE],
)
- liveness =
jmespath.search("spec.template.spec.containers[0].livenessProbe", docs[0])
- readiness =
jmespath.search("spec.template.spec.containers[0].readinessProbe", docs[0])
- assert liveness["initialDelaySeconds"] == 30
- assert liveness["periodSeconds"] == 45
- assert readiness["initialDelaySeconds"] == 5
- assert readiness["periodSeconds"] == 7
+
+ assert
jmespath.search("spec.template.spec.containers[0].livenessProbe", docs[0]) == {
+ "initialDelaySeconds": 30,
+ "periodSeconds": 45,
+ "httpGet": {"path": "/", "port": 13133},
+ }
+
+ assert
jmespath.search("spec.template.spec.containers[0].readinessProbe", docs[0]) == {
+ "initialDelaySeconds": 5,
+ "periodSeconds": 7,
+ "httpGet": {"path": "/", "port": 13133},
+ }
def test_resources_default_empty(self):
- docs = render_chart(show_only=[DEPLOYMENT_TEMPLATE])
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[DEPLOYMENT_TEMPLATE]
+ )
assert jmespath.search("spec.template.spec.containers[0].resources",
docs[0]) == {}
def test_resources_configurable(self):
docs = render_chart(
values={
"otelCollector": {
+ "tracesEnabled": True,
"resources": {
"limits": {"cpu": "200m", "memory": "256Mi"},
"requests": {"cpu": "100m", "memory": "128Mi"},
- }
+ },
}
},
show_only=[DEPLOYMENT_TEMPLATE],
)
- resources =
jmespath.search("spec.template.spec.containers[0].resources", docs[0])
- assert resources == {
+
+ assert jmespath.search("spec.template.spec.containers[0].resources",
docs[0]) == {
"limits": {"cpu": "200m", "memory": "256Mi"},
"requests": {"cpu": "100m", "memory": "128Mi"},
}
+ def test_termination_grace_period_seconds_default(self):
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[DEPLOYMENT_TEMPLATE]
+ )
+ assert
jmespath.search("spec.template.spec.terminationGracePeriodSeconds", docs[0]) ==
30
+
+ def test_termination_grace_period_seconds_override(self):
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True,
"terminationGracePeriodSeconds": 1200}},
+ show_only=[DEPLOYMENT_TEMPLATE],
+ )
+ assert
jmespath.search("spec.template.spec.terminationGracePeriodSeconds", docs[0]) ==
1200
+
+ def test_revision_history_limit_default(self):
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[DEPLOYMENT_TEMPLATE]
+ )
+ assert jmespath.search("spec.revisionHistoryLimit", docs[0]) is None
+
+ def test_revision_history_limit_global_unset(self):
+ docs = render_chart(
+ values={"revisionHistoryLimit": None, "otelCollector":
{"tracesEnabled": True}},
+ show_only=[DEPLOYMENT_TEMPLATE],
+ )
+
+ assert jmespath.search("spec.revisionHistoryLimit", docs[0]) is None
+
+ def test_revision_history_limit_global(self):
+ docs = render_chart(
+ values={"revisionHistoryLimit": 8, "otelCollector":
{"tracesEnabled": True}},
+ show_only=[DEPLOYMENT_TEMPLATE],
+ )
+
+ assert jmespath.search("spec.revisionHistoryLimit", docs[0]) == 8
+
@pytest.mark.parametrize(
- ("values", "expected"),
+ ("local_limit", "global_limit"),
[
- ({}, 30),
- ({"otelCollector": {"terminationGracePeriodSeconds": 1200}}, 1200),
+ (8, 10),
+ (None, 8),
+ (8, None),
],
)
- def test_termination_grace_period_seconds(self, values, expected):
- docs = render_chart(values=values, show_only=[DEPLOYMENT_TEMPLATE])
- assert
jmespath.search("spec.template.spec.terminationGracePeriodSeconds", docs[0]) ==
expected
+ def test_revision_history_limit_overwrite(self, local_limit, global_limit):
+ docs = render_chart(
+ values={
+ "revisionHistoryLimit": global_limit,
+ "otelCollector": {"tracesEnabled": True,
"revisionHistoryLimit": local_limit},
+ },
+ show_only=[DEPLOYMENT_TEMPLATE],
+ )
- @pytest.mark.parametrize(
- ("component", "global_", "expected"),
- [(8, 10, 8), (10, 8, 10), (8, None, 8), (None, 10, 10), (0, 10, 0),
(None, 0, 0)],
- )
- def test_revision_history_limit(self, component, global_, expected):
- values = {"otelCollector": {}}
- if component is not None:
- values["otelCollector"]["revisionHistoryLimit"] = component
- if global_ is not None:
- values["revisionHistoryLimit"] = global_
- docs = render_chart(values=values, show_only=[DEPLOYMENT_TEMPLATE])
- assert jmespath.search("spec.revisionHistoryLimit", docs[0]) ==
expected
+ assert jmespath.search("spec.revisionHistoryLimit", docs[0]) == 8
def test_scheduling_constraints(self):
docs = render_chart(
values={
"otelCollector": {
+ "tracesEnabled": True,
"nodeSelector": {"diskType": "ssd"},
"tolerations": [{"key": "k", "operator": "Equal", "value":
"v", "effect": "NoSchedule"}],
"affinity": {
@@ -288,10 +331,11 @@ class TestOtelCollectorDeployment:
docs = render_chart(
values={
"otelCollector": {
+ "tracesEnabled": True,
"securityContexts": {
"pod": {"runAsUser": 2000, "fsGroup": 1000},
"container": {"allowPrivilegeEscalation": False,
"readOnlyRootFilesystem": True},
- }
+ },
}
},
show_only=[DEPLOYMENT_TEMPLATE],
@@ -309,6 +353,7 @@ class TestOtelCollectorDeployment:
docs = render_chart(
values={
"otelCollector": {
+ "tracesEnabled": True,
"annotations": {"deploy_anno": "deploy_value"},
"podAnnotations": {"pod_anno": "pod_value"},
}
@@ -327,7 +372,8 @@ class TestOtelCollectorDeployment:
"tag": "1.2.3",
"pullPolicy": "Always",
}
- }
+ },
+ "otelCollector": {"tracesEnabled": True},
},
show_only=[DEPLOYMENT_TEMPLATE],
)
@@ -338,45 +384,48 @@ class TestOtelCollectorDeployment:
class TestOtelCollectorService:
- """Service-level configurability."""
-
def test_service_annotations(self):
docs = render_chart(
- values={"otelCollector": {"service": {"annotations": {"some_anno":
"some_value"}}}},
+ values={
+ "otelCollector": {
+ "tracesEnabled": True,
+ "service": {"annotations": {"some_anno": "some_value"}},
+ }
+ },
show_only=[SERVICE_TEMPLATE],
)
assert jmespath.search("metadata.annotations.some_anno", docs[0]) ==
"some_value"
def test_service_no_annotations_block_when_unset(self):
- docs = render_chart(show_only=[SERVICE_TEMPLATE])
+ docs = render_chart(values={"otelCollector": {"tracesEnabled": True}},
show_only=[SERVICE_TEMPLATE])
assert "annotations" not in jmespath.search("metadata", docs[0])
class TestOtelCollectorServiceAccount:
- """ServiceAccount-level configurability."""
-
def test_default_create(self):
- docs = render_chart(show_only=[SERVICE_ACCOUNT_TEMPLATE])
+ docs = render_chart(
+ values={"otelCollector": {"tracesEnabled": True}},
show_only=[SERVICE_ACCOUNT_TEMPLATE]
+ )
assert docs[0]["kind"] == "ServiceAccount"
assert docs[0]["automountServiceAccountToken"] is False
def test_create_false_suppresses_sa(self):
docs = render_chart(
- values={"otelCollector": {"serviceAccount": {"create": False}}},
+ values={"otelCollector": {"tracesEnabled": True, "serviceAccount":
{"create": False}}},
show_only=[SERVICE_ACCOUNT_TEMPLATE],
)
assert docs == []
def test_create_false_deployment_uses_default_sa(self):
docs = render_chart(
- values={"otelCollector": {"serviceAccount": {"create": False}}},
+ values={"otelCollector": {"tracesEnabled": True, "serviceAccount":
{"create": False}}},
show_only=[DEPLOYMENT_TEMPLATE],
)
assert jmespath.search("spec.template.spec.serviceAccountName",
docs[0]) == "default"
def test_custom_sa_name_propagates_to_deployment(self):
docs = render_chart(
- values={"otelCollector": {"serviceAccount": {"name":
"my-custom-sa"}}},
+ values={"otelCollector": {"tracesEnabled": True, "serviceAccount":
{"name": "my-custom-sa"}}},
show_only=[DEPLOYMENT_TEMPLATE, SERVICE_ACCOUNT_TEMPLATE],
)
sa = next(d for d in docs if d["kind"] == "ServiceAccount")
@@ -386,14 +435,24 @@ class TestOtelCollectorServiceAccount:
def test_automount_token_override(self):
docs = render_chart(
- values={"otelCollector": {"serviceAccount":
{"automountServiceAccountToken": True}}},
+ values={
+ "otelCollector": {
+ "tracesEnabled": True,
+ "serviceAccount": {"automountServiceAccountToken": True},
+ }
+ },
show_only=[SERVICE_ACCOUNT_TEMPLATE],
)
assert docs[0]["automountServiceAccountToken"] is True
def test_sa_annotations(self):
docs = render_chart(
- values={"otelCollector": {"serviceAccount": {"annotations":
{"sa_anno": "sa_value"}}}},
+ values={
+ "otelCollector": {
+ "tracesEnabled": True,
+ "serviceAccount": {"annotations": {"sa_anno": "sa_value"}},
+ }
+ },
show_only=[SERVICE_ACCOUNT_TEMPLATE],
)
assert jmespath.search("metadata.annotations.sa_anno", docs[0]) ==
"sa_value"
@@ -404,12 +463,14 @@ class TestOtelCollectorAirflowEnvironment:
@pytest.mark.parametrize("template", AIRFLOW_POD_TEMPLATES)
def test_default_emits_traces_env_only(self, template):
- docs = render_chart(show_only=[template])
- names = _env_names(docs[0])
+ docs = render_chart(values={"otelCollector": {"tracesEnabled": True}},
show_only=[template])
+ names = jmespath.search("spec.template.spec.containers[0].env |
[*].name", docs[0])
+
assert "OTEL_SERVICE_NAME" in names
assert "OTEL_EXPORTER_OTLP_PROTOCOL" in names
assert "OTEL_TRACES_EXPORTER" in names
assert "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" in names
+
# Metrics env vars aren't present.
assert "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT" not in names
assert "OTEL_METRIC_EXPORT_INTERVAL" not in names
@@ -420,25 +481,42 @@ class TestOtelCollectorAirflowEnvironment:
values={"otelCollector": {"metricsEnabled": True}},
show_only=[template],
)
- names = _env_names(docs[0])
+ names = jmespath.search("spec.template.spec.containers[0].env |
[*].name", docs[0])
+
+ assert "OTEL_SERVICE_NAME" in names
+ assert "OTEL_EXPORTER_OTLP_PROTOCOL" in names
assert "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT" in names
assert "OTEL_METRIC_EXPORT_INTERVAL" in names
+ # Traces env vars aren't present.
+ assert "OTEL_TRACES_EXPORTER" not in names
+ assert "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" not in names
+
@pytest.mark.parametrize("template", AIRFLOW_POD_TEMPLATES)
def test_both_flags_off_emits_no_otel_env(self, template):
docs = render_chart(
values={"otelCollector": {"tracesEnabled": False,
"metricsEnabled": False}},
show_only=[template],
)
- names = _env_names(docs[0])
- assert not any(n.startswith("OTEL_") for n in names)
+
+ assert (
+
jmespath.search("spec.template.spec.containers[0].env[?name.starts_with(@,
'OTEL_')]", docs[0])
+ == []
+ )
def test_metric_export_interval_value(self):
docs = render_chart(
values={"otelCollector": {"metricsEnabled": True,
"metricExportIntervalMs": 12345}},
show_only=[AIRFLOW_POD_TEMPLATES[0]],
)
- assert _env_value(docs[0], "OTEL_METRIC_EXPORT_INTERVAL") == "12345"
+
+ assert (
+ jmespath.search(
+
"spec.template.spec.containers[0].env[?name=='OTEL_METRIC_EXPORT_INTERVAL'] |
[0].value",
+ docs[0],
+ )
+ == "12345"
+ )
class TestOtelCollectorAirflowConfig:
@@ -446,7 +524,7 @@ class TestOtelCollectorAirflowConfig:
@staticmethod
def _get_conf_section(cfg: str, name: str) -> str:
- """Return the body of the specified section (everything until the next
'[')."""
+ """Return the body of the specified section."""
return cfg.split(f"[{name}]")[1].split("[")[0]
@staticmethod
@@ -455,7 +533,9 @@ class TestOtelCollectorAirflowConfig:
return jmespath.search('data."airflow.cfg"', docs[0])
def test_default_traces_section_has_otel_on_true(self):
- traces = self._get_conf_section(self._get_airflow_conf(), "traces")
+ traces = self._get_conf_section(
+ self._get_airflow_conf({"otelCollector": {"tracesEnabled":
True}}), "traces"
+ )
assert "otel_on = True" in traces
def test_default_metrics_section_has_otel_off_and_statsd_on(self):
diff --git a/helm-tests/tests/helm_tests/security/test_rbac.py
b/helm-tests/tests/helm_tests/security/test_rbac.py
index 15df115a53c..eb781786bd1 100644
--- a/helm-tests/tests/helm_tests/security/test_rbac.py
+++ b/helm-tests/tests/helm_tests/security/test_rbac.py
@@ -180,7 +180,7 @@ class TestRBAC:
"workers": {"serviceAccount": {"create": False}},
"triggerer": {"serviceAccount": {"create": False}},
"statsd": {"serviceAccount": {"create": False}},
- "otelCollector": {"serviceAccount": {"create": False}},
+ "otelCollector": {"tracesEnabled": True, "serviceAccount":
{"create": False}},
"createUserJob": {"serviceAccount": {"create": False}},
"migrateDatabaseJob": {"serviceAccount": {"create":
False}},
"flower": {"enabled": True, "serviceAccount": {"create":
False}},
@@ -206,6 +206,7 @@ class TestRBAC:
"databaseCleanup": {"enabled": True},
"flower": {"enabled": True},
"pgbouncer": {"enabled": True},
+ "otelCollector": {"tracesEnabled": True},
},
version=version,
),
@@ -244,7 +245,7 @@ class TestRBAC:
"triggerer": {"serviceAccount": {"create": False}},
"flower": {"enabled": True, "serviceAccount": {"create":
False}},
"statsd": {"serviceAccount": {"create": False}},
- "otelCollector": {"serviceAccount": {"create": False}},
+ "otelCollector": {"tracesEnabled": True, "serviceAccount":
{"create": False}},
"redis": {"serviceAccount": {"create": False}},
"pgbouncer": {
"enabled": True,
@@ -276,6 +277,7 @@ class TestRBAC:
"databaseCleanup": {"enabled": True},
"flower": {"enabled": True},
"pgbouncer": {"enabled": True},
+ "otelCollector": {"tracesEnabled": True},
},
version=version,
),
@@ -335,7 +337,10 @@ class TestRBAC:
"triggerer": {"serviceAccount": {"name":
CUSTOM_TRIGGERER_NAME}},
"flower": {"enabled": True, "serviceAccount": {"name":
CUSTOM_FLOWER_NAME}},
"statsd": {"serviceAccount": {"name": CUSTOM_STATSD_NAME}},
- "otelCollector": {"serviceAccount": {"name":
CUSTOM_OTEL_COLLECTOR_NAME}},
+ "otelCollector": {
+ "tracesEnabled": True,
+ "serviceAccount": {"name": CUSTOM_OTEL_COLLECTOR_NAME},
+ },
"redis": {"serviceAccount": {"name": CUSTOM_REDIS_NAME}},
"postgresql": {"serviceAccount": {"create": True, "name":
CUSTOM_POSTGRESQL_NAME}},
"pgbouncer": {
@@ -394,7 +399,10 @@ class TestRBAC:
"triggerer": {"serviceAccount": {"name":
CUSTOM_TRIGGERER_NAME}},
"flower": {"enabled": True, "serviceAccount": {"name":
CUSTOM_FLOWER_NAME}},
"statsd": {"serviceAccount": {"name": CUSTOM_STATSD_NAME}},
- "otelCollector": {"serviceAccount": {"name":
CUSTOM_OTEL_COLLECTOR_NAME}},
+ "otelCollector": {
+ "tracesEnabled": True,
+ "serviceAccount": {"name": CUSTOM_OTEL_COLLECTOR_NAME},
+ },
"redis": {"serviceAccount": {"name": CUSTOM_REDIS_NAME}},
"postgresql": {"serviceAccount": {"name":
CUSTOM_POSTGRESQL_NAME}},
"pgbouncer": {