This is an automated email from the ASF dual-hosted git repository.
jscheffl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new bc6eaf2ceda More restrictive chart rendering logic (#63464)
bc6eaf2ceda is described below
commit bc6eaf2ceda51316c294bc3982c4b10213a590b5
Author: Przemysław Mirowski <[email protected]>
AuthorDate: Fri Mar 13 00:04:35 2026 +0100
More restrictive chart rendering logic (#63464)
* Fix api server hpa render
* Fix keda enabled if for pgbouncer network policy
* Fix rendering of flower-secret
* Fix pgbouncer certificate secret rendering
* Fix kerberos keytab secret rendering
* Refactor scc rolebinding tests
* Fix scc rolebanding rendering
---
chart/templates/api-server/api-server-hpa.yaml | 2 +-
.../pgbouncer/pgbouncer-networkpolicy.yaml | 2 +-
.../security-context-constraint-rolebinding.yaml | 13 +-
chart/templates/secrets/flower-secret.yaml | 2 +-
.../templates/secrets/kerberos-keytab-secret.yaml | 2 +-
.../secrets/pgbouncer-certificates-secret.yaml | 2 +-
helm-tests/tests/helm_tests/other/test_flower.py | 15 ++
.../tests/helm_tests/other/test_pgbouncer.py | 69 +++++--
.../tests/helm_tests/security/test_kerberos.py | 14 ++
.../helm_tests/security/test_scc_rolebinding.py | 208 ++++++++++++++++-----
10 files changed, 262 insertions(+), 67 deletions(-)
diff --git a/chart/templates/api-server/api-server-hpa.yaml
b/chart/templates/api-server/api-server-hpa.yaml
index b8830d4b9b1..ee714efd918 100644
--- a/chart/templates/api-server/api-server-hpa.yaml
+++ b/chart/templates/api-server/api-server-hpa.yaml
@@ -20,7 +20,7 @@
################################
## Airflow Api-Server HPA
#################################
-{{- if .Values.apiServer.hpa.enabled }}
+{{- if and .Values.apiServer.enabled .Values.apiServer.hpa.enabled
(semverCompare ">=3.0.0" .Values.airflowVersion) }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
diff --git a/chart/templates/pgbouncer/pgbouncer-networkpolicy.yaml
b/chart/templates/pgbouncer/pgbouncer-networkpolicy.yaml
index f80f3e1264d..8fd2a616f36 100644
--- a/chart/templates/pgbouncer/pgbouncer-networkpolicy.yaml
+++ b/chart/templates/pgbouncer/pgbouncer-networkpolicy.yaml
@@ -24,7 +24,7 @@
{{- if hasKey .Values.workers "celery" }}
{{- $kedaEnabled = or .Values.workers.celery.keda.enabled (and (not (has
.Values.workers.celery.keda.enabled (list true false)))
.Values.workers.keda.enabled) }}
{{- end }}
-{{- $workersKedaEnabled := and $kedaEnabled (has .Values.executor (list
"CeleryExecutor" "CeleryKubernetesExecutor")) }}
+{{- $workersKedaEnabled := and $kedaEnabled (or (contains "CeleryExecutor"
.Values.executor) (contains "CeleryKubernetesExecutor" .Values.executor)) }}
{{- $triggererEnabled := .Values.triggerer.enabled }}
{{- $triggererKedaEnabled := and $triggererEnabled
.Values.triggerer.keda.enabled }}
{{- if and .Values.pgbouncer.enabled .Values.networkPolicies.enabled }}
diff --git a/chart/templates/rbac/security-context-constraint-rolebinding.yaml
b/chart/templates/rbac/security-context-constraint-rolebinding.yaml
index 40055e8606c..45f95480cd7 100644
--- a/chart/templates/rbac/security-context-constraint-rolebinding.yaml
+++ b/chart/templates/rbac/security-context-constraint-rolebinding.yaml
@@ -21,7 +21,6 @@
## Airflow SCC Role Binding
###########################
{{- if and .Values.rbac.create .Values.rbac.createSCCRoleBinding }}
-{{- $hasWorkers := has .Values.executor (list "CeleryExecutor"
"LocalKubernetesExecutor" "KubernetesExecutor" "CeleryKubernetesExecutor") }}
apiVersion: rbac.authorization.k8s.io/v1
{{- if .Values.multiNamespaceMode }}
kind: ClusterRoleBinding
@@ -51,20 +50,26 @@ roleRef:
kind: ClusterRole
name: system:openshift:scc:anyuid
subjects:
+ {{- if and .Values.webserver.enabled (semverCompare "<3.0.0"
.Values.airflowVersion) }}
- kind: ServiceAccount
name: {{ include "webserver.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
- {{- if $hasWorkers }}
+ {{- end }}
+ {{- if or (contains "CeleryExecutor" .Values.executor) (contains
"LocalKubernetesExecutor" .Values.executor) (contains "KubernetesExecutor"
.Values.executor) (contains "CeleryKubernetesExecutor" .Values.executor) }}
- kind: ServiceAccount
name: {{ include "worker.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
{{- end }}
+ {{- if .Values.scheduler.enabled }}
- kind: ServiceAccount
name: {{ include "scheduler.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
+ {{- end }}
+ {{- if and .Values.apiServer.enabled (semverCompare ">=3.0.0"
.Values.airflowVersion) }}
- kind: ServiceAccount
name: {{ include "apiServer.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
+ {{- end }}
{{- if and .Values.statsd.enabled }}
- kind: ServiceAccount
name: {{ include "statsd.serviceAccountName" . }}
@@ -80,12 +85,16 @@ subjects:
name: {{ include "redis.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
{{- end }}
+ {{- if .Values.triggerer.enabled }}
- kind: ServiceAccount
name: {{ include "triggerer.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
+ {{- end }}
+ {{- if .Values.migrateDatabaseJob.enabled }}
- kind: ServiceAccount
name: {{ include "migrateDatabaseJob.serviceAccountName" . }}
namespace: "{{ .Release.Namespace }}"
+ {{- end }}
{{- if eq (include "createUserJob.isEnabled" .) "true" }}
- kind: ServiceAccount
name: {{ include "createUserJob.serviceAccountName" . }}
diff --git a/chart/templates/secrets/flower-secret.yaml
b/chart/templates/secrets/flower-secret.yaml
index e402f27dc3b..66395881d19 100644
--- a/chart/templates/secrets/flower-secret.yaml
+++ b/chart/templates/secrets/flower-secret.yaml
@@ -20,7 +20,7 @@
################################
## Flower Secret
#################################
-{{- if (and (not .Values.flower.secretName) .Values.flower.username
.Values.flower.password) }}
+{{- if and .Values.flower.enabled (not .Values.flower.secretName)
.Values.flower.username .Values.flower.password }}
apiVersion: v1
kind: Secret
metadata:
diff --git a/chart/templates/secrets/kerberos-keytab-secret.yaml
b/chart/templates/secrets/kerberos-keytab-secret.yaml
index 6cb90d544b9..cf1bc3ca23f 100644
--- a/chart/templates/secrets/kerberos-keytab-secret.yaml
+++ b/chart/templates/secrets/kerberos-keytab-secret.yaml
@@ -20,7 +20,7 @@
################################
## Kerberos Secret
#################################
-{{- if .Values.kerberos.keytabBase64Content }}
+{{- if and .Values.kerberos.enabled .Values.kerberos.keytabBase64Content }}
apiVersion: v1
kind: Secret
metadata:
diff --git a/chart/templates/secrets/pgbouncer-certificates-secret.yaml
b/chart/templates/secrets/pgbouncer-certificates-secret.yaml
index bd09f704e0f..e826d16a97c 100644
--- a/chart/templates/secrets/pgbouncer-certificates-secret.yaml
+++ b/chart/templates/secrets/pgbouncer-certificates-secret.yaml
@@ -20,7 +20,7 @@
################################
## Pgbouncer Certificate Secret
#################################
-{{- if or .Values.pgbouncer.ssl.ca .Values.pgbouncer.ssl.cert
.Values.pgbouncer.ssl.key }}
+{{- if and .Values.pgbouncer.enabled (or .Values.pgbouncer.ssl.ca
.Values.pgbouncer.ssl.cert .Values.pgbouncer.ssl.key) }}
apiVersion: v1
kind: Secret
metadata:
diff --git a/helm-tests/tests/helm_tests/other/test_flower.py
b/helm-tests/tests/helm_tests/other/test_flower.py
index 502c129a98e..5bc695fdd53 100644
--- a/helm-tests/tests/helm_tests/other/test_flower.py
+++ b/helm-tests/tests/helm_tests/other/test_flower.py
@@ -746,3 +746,18 @@ class TestFlowerSecret:
assert "annotations" in jmespath.search("metadata", docs)
assert jmespath.search("metadata.annotations",
docs)["test_annotation"] == "test_annotation_value"
+
+ def test_not_render_secret_when_flower_disabled(self):
+ docs = render_chart(
+ values={
+ "flower": {
+ "enabled": False,
+ "username": "username",
+ "password": "password",
+ "secretAnnotations": {"test_annotation":
"test_annotation_value"},
+ }
+ },
+ show_only=["templates/secrets/flower-secret.yaml"],
+ )
+
+ assert len(docs) == 0
diff --git a/helm-tests/tests/helm_tests/other/test_pgbouncer.py
b/helm-tests/tests/helm_tests/other/test_pgbouncer.py
index f8b3885cc94..27e0f60378a 100644
--- a/helm-tests/tests/helm_tests/other/test_pgbouncer.py
+++ b/helm-tests/tests/helm_tests/other/test_pgbouncer.py
@@ -615,6 +615,19 @@ class TestPgbouncerConfig:
assert "annotations" in jmespath.search("metadata", docs)
assert jmespath.search("metadata.annotations",
docs)["test_annotation"] == "test_annotation_value"
+ def test_should_not_render_cert_secret_when_pgbouncer_disabled(self):
+ docs = render_chart(
+ values={
+ "pgbouncer": {
+ "enabled": False,
+ "ssl": {"ca": "someca", "cert": "somecert", "key":
"somekey"},
+ },
+ },
+ show_only=["templates/secrets/pgbouncer-certificates-secret.yaml"],
+ )
+
+ assert len(docs) == 0
+
def test_extra_ini_configs(self):
values = {"pgbouncer": {"enabled": True, "extraIni":
"server_round_robin = 1\nstats_period = 30"}}
ini = self._get_pgbouncer_ini(values)
@@ -859,30 +872,52 @@ class TestPgBouncerServiceAccount:
class TestPgbouncerNetworkPolicy:
"""Tests PgBouncer Network Policy."""
- def test_should_create_pgbouncer_network_policy(self):
+ @pytest.mark.parametrize(
+ "executor",
+ [
+ "CeleryExecutor",
+ "CeleryKubernetesExecutor",
+ "LocalExecutor,CeleryExecutor,KubernetesExecutor",
+ "LocalExecutor,CeleryKubernetesExecutor,KubernetesExecutor",
+ ],
+ )
+ def test_should_create_pgbouncer_network_policy(self, executor):
docs = render_chart(
- values={"pgbouncer": {"enabled": True}, "networkPolicies":
{"enabled": True}},
+ values={
+ "executor": executor,
+ "pgbouncer": {"enabled": True},
+ "networkPolicies": {"enabled": True},
+ },
show_only=["templates/pgbouncer/pgbouncer-networkpolicy.yaml"],
)
assert jmespath.search("kind", docs[0]) == "NetworkPolicy"
assert jmespath.search("metadata.name", docs[0]) ==
"release-name-pgbouncer-policy"
+ @pytest.mark.parametrize(
+ "executor",
+ [
+ "CeleryExecutor",
+ "CeleryKubernetesExecutor",
+ "LocalExecutor,CeleryExecutor,KubernetesExecutor",
+ "LocalExecutor,CeleryKubernetesExecutor,KubernetesExecutor",
+ ],
+ )
@pytest.mark.parametrize(
"values",
[
- {"executor": "CeleryExecutor", "workers": {"keda": {"enabled":
True}}},
+ {"workers": {"keda": {"enabled": True}}},
{"triggerer": {"keda": {"enabled": True}}},
{
- "executor": "CeleryExecutor",
"workers": {"keda": {"enabled": True}},
"triggerer": {"keda": {"enabled": True}},
},
],
)
- def test_pod_selectors_with_keda_without_namespace_labels(self, values):
+ def test_pod_selectors_with_keda_without_namespace_labels(self, executor,
values):
docs = render_chart(
values={
+ "executor": executor,
"pgbouncer": {"enabled": True},
"networkPolicies": {"enabled": True},
**values,
@@ -895,22 +930,28 @@ class TestPgbouncerNetworkPolicy:
]
@pytest.mark.parametrize(
- "conf",
+ "executor",
+ [
+ "CeleryExecutor",
+ "CeleryKubernetesExecutor",
+ "LocalExecutor,CeleryExecutor,KubernetesExecutor",
+ "LocalExecutor,CeleryKubernetesExecutor,KubernetesExecutor",
+ ],
+ )
+ @pytest.mark.parametrize(
+ "values",
[
# test with workers.keda/workers.celery.keda enabled with
namespace labels
{
- "executor": "CeleryExecutor",
"workers": {
"keda": {"namespaceLabels": {"app": "airflow"}},
"celery": {"keda": {"enabled": True}},
},
},
{
- "executor": "CeleryExecutor",
"workers": {"celery": {"keda": {"enabled": True,
"namespaceLabels": {"app": "airflow"}}}},
},
{
- "executor": "CeleryExecutor",
"workers": {
"keda": {"namespaceLabels": {"airflow": "app"}},
"celery": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
@@ -920,42 +961,38 @@ class TestPgbouncerNetworkPolicy:
{"triggerer": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}}},
# test with workers.keda/workers.celery.keda and triggerer.keda
both enabled with namespace labels
{
- "executor": "CeleryExecutor",
"workers": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
"triggerer": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
},
{
- "executor": "CeleryExecutor",
"workers": {"celery": {"keda": {"enabled": True,
"namespaceLabels": {"app": "airflow"}}}},
"triggerer": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
},
# test with workers.keda/workers.celery.keda and triggerer.keda
both enabled workers
# with namespace labels and triggerer without namespace labels
{
- "executor": "CeleryExecutor",
"workers": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
"triggerer": {"keda": {"enabled": True}},
},
{
- "executor": "CeleryExecutor",
"workers": {"celery": {"keda": {"enabled": True,
"namespaceLabels": {"app": "airflow"}}}},
"triggerer": {"keda": {"enabled": True}},
},
# test with workers.celery.keda and triggerer.keda both enabled
workers without namespace labels
# and triggerer with namespace labels
{
- "executor": "CeleryExecutor",
"workers": {"celery": {"keda": {"enabled": True}}},
"triggerer": {"keda": {"enabled": True, "namespaceLabels":
{"app": "airflow"}}},
},
],
)
- def test_pod_selectors_with_namespace_labels(self, conf):
+ def test_pod_selectors_with_namespace_labels(self, executor, values):
docs = render_chart(
values={
+ "executor": executor,
"pgbouncer": {"enabled": True},
"networkPolicies": {"enabled": True},
- **conf,
+ **values,
},
show_only=["templates/pgbouncer/pgbouncer-networkpolicy.yaml"],
)
diff --git a/helm-tests/tests/helm_tests/security/test_kerberos.py
b/helm-tests/tests/helm_tests/security/test_kerberos.py
index bb23ae67ac1..9978ae86591 100644
--- a/helm-tests/tests/helm_tests/security/test_kerberos.py
+++ b/helm-tests/tests/helm_tests/security/test_kerberos.py
@@ -155,6 +155,20 @@ class TestKerberos:
assert jmespath.search('data."kerberos.keytab"', docs[0]) ==
"dGVzdGtleXRhYg=="
+ def test_kerberos_keytab_secret_unavailable_when_keberos_disabled(self):
+ docs = render_chart(
+ values={
+ "executor": "CeleryExecutor",
+ "kerberos": {
+ "enabled": False,
+ "keytabBase64Content": "dGVzdGtleXRhYg==",
+ },
+ },
+ show_only=["templates/secrets/kerberos-keytab-secret.yaml"],
+ )
+
+ assert len(docs) == 0
+
def test_kerberos_keytab_secret_unavailable_when_not_specified(self):
docs = render_chart(
values={
diff --git a/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
b/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
index e40bb909beb..664134474c4 100644
--- a/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
+++ b/helm-tests/tests/helm_tests/security/test_scc_rolebinding.py
@@ -24,6 +24,63 @@ from chart_utils.helm_template_generator import render_chart
class TestSCCActivation:
"""Tests SCCs."""
+ def test_zero_subjects_when_all_disabled_airflow_2(self):
+ docs = render_chart(
+ values={
+ "airflowVersion": "2.11.0",
+ "multiNamespaceMode": False,
+ "executor": "LocalExecutor",
+ "data": {"brokerUrlSecretName": "test"},
+ "cleanup": {"enabled": False},
+ "databaseCleanup": {"enabled": False},
+ "flower": {"enabled": False},
+ "rbac": {"create": True, "createSCCRoleBinding": True},
+ "dagProcessor": {"enabled": False},
+ "webserver": {"enabled": False},
+ "scheduler": {"enabled": False},
+ "statsd": {"enabled": False},
+ "triggerer": {"enabled": False},
+ "redis": {"enabled": False},
+ "migrateDatabaseJob": {"enabled": False},
+ "createUserJob": {"enabled": False},
+ },
+
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
+ )
+
+ assert jmespath.search("kind", docs[0]) == "RoleBinding"
+ assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
+ assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
+ assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+ assert jmespath.search("subjects", docs[0]) is None
+
+ def test_zero_subjects_when_all_disabled(self):
+ docs = render_chart(
+ values={
+ "multiNamespaceMode": False,
+ "executor": "LocalExecutor",
+ "data": {"brokerUrlSecretName": "test"},
+ "cleanup": {"enabled": False},
+ "databaseCleanup": {"enabled": False},
+ "flower": {"enabled": False},
+ "rbac": {"create": True, "createSCCRoleBinding": True},
+ "dagProcessor": {"enabled": False},
+ "apiServer": {"enabled": False},
+ "scheduler": {"enabled": False},
+ "statsd": {"enabled": False},
+ "triggerer": {"enabled": False},
+ "redis": {"enabled": False},
+ "migrateDatabaseJob": {"enabled": False},
+ "createUserJob": {"enabled": False},
+ },
+
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
+ )
+
+ assert jmespath.search("kind", docs[0]) == "RoleBinding"
+ assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
+ assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
+ assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+ assert jmespath.search("subjects", docs[0]) is None
+
@pytest.mark.parametrize(
("rbac_enabled", "scc_enabled", "created"),
[
@@ -33,9 +90,10 @@ class TestSCCActivation:
(True, False, False),
],
)
- def test_create_scc(self, rbac_enabled, scc_enabled, created):
+ def test_create_scc_airflow_2(self, rbac_enabled, scc_enabled, created):
docs = render_chart(
values={
+ "airflowVersion": "2.11.0",
"multiNamespaceMode": False,
"cleanup": {"enabled": True},
"databaseCleanup": {"enabled": True},
@@ -52,82 +110,144 @@ class TestSCCActivation:
assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
- assert jmespath.search("subjects[0].name", docs[0]) ==
"release-name-airflow-webserver"
- assert jmespath.search("subjects[1].name", docs[0]) ==
"release-name-airflow-worker"
- assert jmespath.search("subjects[2].name", docs[0]) ==
"release-name-airflow-scheduler"
- assert jmespath.search("subjects[3].name", docs[0]) ==
"release-name-airflow-api-server"
- assert jmespath.search("subjects[4].name", docs[0]) ==
"release-name-airflow-statsd"
- assert jmespath.search("subjects[5].name", docs[0]) ==
"release-name-airflow-flower"
- assert jmespath.search("subjects[6].name", docs[0]) ==
"release-name-airflow-redis"
- assert jmespath.search("subjects[7].name", docs[0]) ==
"release-name-airflow-triggerer"
- assert jmespath.search("subjects[8].name", docs[0]) ==
"release-name-airflow-migrate-database-job"
- assert jmespath.search("subjects[9].name", docs[0]) ==
"release-name-airflow-create-user-job"
- assert jmespath.search("subjects[10].name", docs[0]) ==
"release-name-airflow-cleanup"
- assert jmespath.search("subjects[11].name", docs[0]) ==
"release-name-airflow-database-cleanup"
- assert jmespath.search("subjects[12].name", docs[0]) ==
"release-name-airflow-dag-processor"
+ assert jmespath.search("subjects | [*].name", docs[0]) == [
+ "release-name-airflow-webserver",
+ "release-name-airflow-worker",
+ "release-name-airflow-scheduler",
+ "release-name-airflow-statsd",
+ "release-name-airflow-flower",
+ "release-name-airflow-redis",
+ "release-name-airflow-triggerer",
+ "release-name-airflow-migrate-database-job",
+ "release-name-airflow-create-user-job",
+ "release-name-airflow-cleanup",
+ "release-name-airflow-database-cleanup",
+ "release-name-airflow-dag-processor",
+ ]
@pytest.mark.parametrize(
- ("rbac_enabled", "scc_enabled", "created", "namespace",
"expected_name"),
+ ("rbac_enabled", "scc_enabled", "created"),
[
- (True, True, True, "default",
"default-release-name-scc-rolebinding"),
- (True, True, True, "other-ns",
"other-ns-release-name-scc-rolebinding"),
+ (False, False, False),
+ (False, True, False),
+ (True, True, True),
+ (True, False, False),
],
)
- def test_create_scc_multinamespace(self, rbac_enabled, scc_enabled,
created, namespace, expected_name):
+ def test_create_scc(self, rbac_enabled, scc_enabled, created):
docs = render_chart(
- namespace=namespace,
values={
- "multiNamespaceMode": True,
- "createUserJob": {"enabled": False},
- "cleanup": {"enabled": False},
- "databaseCleanup": {"enabled": False},
- "flower": {"enabled": False},
+ "multiNamespaceMode": False,
+ "cleanup": {"enabled": True},
+ "databaseCleanup": {"enabled": True},
+ "flower": {"enabled": True},
"rbac": {"create": rbac_enabled, "createSCCRoleBinding":
scc_enabled},
+ "dagProcessor": {"enabled": True},
},
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
)
assert bool(docs) is created
if created:
- assert jmespath.search("kind", docs[0]) == "ClusterRoleBinding"
+ assert jmespath.search("kind", docs[0]) == "RoleBinding"
assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
- assert expected_name == jmespath.search("metadata.name", docs[0])
+ assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+ assert jmespath.search("subjects | [*].name", docs[0]) == [
+ "release-name-airflow-worker",
+ "release-name-airflow-scheduler",
+ "release-name-airflow-api-server",
+ "release-name-airflow-statsd",
+ "release-name-airflow-flower",
+ "release-name-airflow-redis",
+ "release-name-airflow-triggerer",
+ "release-name-airflow-migrate-database-job",
+ "release-name-airflow-create-user-job",
+ "release-name-airflow-cleanup",
+ "release-name-airflow-database-cleanup",
+ "release-name-airflow-dag-processor",
+ ]
@pytest.mark.parametrize(
- ("rbac_enabled", "scc_enabled", "created"),
+ ("namespace", "expected_name"),
[
- (True, True, True),
+ ("default", "default-release-name-scc-rolebinding"),
+ ("other-ns", "other-ns-release-name-scc-rolebinding"),
],
)
- def test_create_scc_worker_only(self, rbac_enabled, scc_enabled, created):
+ def test_create_scc_multinamespace(self, namespace, expected_name):
+ docs = render_chart(
+ namespace=namespace,
+ values={
+ "multiNamespaceMode": True,
+ "createUserJob": {"enabled": False},
+ "cleanup": {"enabled": False},
+ "databaseCleanup": {"enabled": False},
+ "flower": {"enabled": False},
+ "rbac": {"create": True, "createSCCRoleBinding": True},
+ },
+
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
+ )
+
+ assert jmespath.search("kind", docs[0]) == "ClusterRoleBinding"
+ assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
+ assert expected_name == jmespath.search("metadata.name", docs[0])
+ assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+
+ def test_create_scc_worker_only_airflow_2(self):
docs = render_chart(
values={
+ "airflowVersion": "2.11.0",
"multiNamespaceMode": False,
"createUserJob": {"enabled": False},
"cleanup": {"enabled": False},
"databaseCleanup": {"enabled": False},
"flower": {"enabled": False},
"statsd": {"enabled": False},
- "rbac": {"create": rbac_enabled, "createSCCRoleBinding":
scc_enabled},
+ "rbac": {"create": True, "createSCCRoleBinding": True},
},
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
)
- assert bool(docs) is created
- if created:
- assert jmespath.search("kind", docs[0]) == "RoleBinding"
- assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
- assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
- assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
- assert jmespath.search("subjects[0].name", docs[0]) ==
"release-name-airflow-webserver"
- assert jmespath.search("subjects[1].name", docs[0]) ==
"release-name-airflow-worker"
- assert jmespath.search("subjects[2].name", docs[0]) ==
"release-name-airflow-scheduler"
- assert jmespath.search("subjects[3].name", docs[0]) ==
"release-name-airflow-api-server"
- assert jmespath.search("subjects[4].name", docs[0]) ==
"release-name-airflow-redis"
- assert jmespath.search("subjects[5].name", docs[0]) ==
"release-name-airflow-triggerer"
- assert jmespath.search("subjects[6].name", docs[0]) ==
"release-name-airflow-migrate-database-job"
- assert len(docs[0]["subjects"]) == 7
+ assert jmespath.search("kind", docs[0]) == "RoleBinding"
+ assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
+ assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
+ assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+ assert jmespath.search("subjects | [*].name", docs[0]) == [
+ "release-name-airflow-webserver",
+ "release-name-airflow-worker",
+ "release-name-airflow-scheduler",
+ "release-name-airflow-redis",
+ "release-name-airflow-triggerer",
+ "release-name-airflow-migrate-database-job",
+ ]
+
+ def test_create_scc_worker_only(self):
+ docs = render_chart(
+ values={
+ "multiNamespaceMode": False,
+ "createUserJob": {"enabled": False},
+ "cleanup": {"enabled": False},
+ "databaseCleanup": {"enabled": False},
+ "flower": {"enabled": False},
+ "statsd": {"enabled": False},
+ "rbac": {"create": True, "createSCCRoleBinding": True},
+ },
+
show_only=["templates/rbac/security-context-constraint-rolebinding.yaml"],
+ )
+
+ assert jmespath.search("kind", docs[0]) == "RoleBinding"
+ assert jmespath.search("roleRef.kind", docs[0]) == "ClusterRole"
+ assert jmespath.search("metadata.name", docs[0]) ==
"release-name-scc-rolebinding"
+ assert jmespath.search("roleRef.name", docs[0]) ==
"system:openshift:scc:anyuid"
+ assert jmespath.search("subjects | [*].name", docs[0]) == [
+ "release-name-airflow-worker",
+ "release-name-airflow-scheduler",
+ "release-name-airflow-api-server",
+ "release-name-airflow-redis",
+ "release-name-airflow-triggerer",
+ "release-name-airflow-migrate-database-job",
+ ]
def
test_deprecated_default_user_disabled_excludes_create_user_subject(self):
"""webserver.defaultUser.enabled=false should exclude the
create-user-job service account."""