You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by di...@apache.org on 2020/11/19 18:32:42 UTC
[airflow] branch v1-10-test updated: Fixes issue with affinity
backcompat in Airflow 1.10
This is an automated email from the ASF dual-hosted git repository.
dimberman pushed a commit to branch v1-10-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v1-10-test by this push:
new 9f1b66f Fixes issue with affinity backcompat in Airflow 1.10
9f1b66f is described below
commit 9f1b66f9e7cd250f28e1763ad95a99eb049fe3d8
Author: Daniel Imberman <da...@gmail.com>
AuthorDate: Thu Nov 19 10:29:59 2020 -0800
Fixes issue with affinity backcompat in Airflow 1.10
There was a breaking change in 1.10.12 where the affinity argument
was being turned into a k8s.V1Affinity object instead of a python dict.
This commit solves https://github.com/apache/airflow/issues/11731
---
airflow/kubernetes/pod_launcher.py | 2 +-
tests/kubernetes/test_pod_launcher.py | 34 +++++++++++++++++++++++++++++++---
2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/airflow/kubernetes/pod_launcher.py b/airflow/kubernetes/pod_launcher.py
index 704a77e..468e077 100644
--- a/airflow/kubernetes/pod_launcher.py
+++ b/airflow/kubernetes/pod_launcher.py
@@ -326,7 +326,7 @@ def _convert_to_airflow_pod(pod):
resources=base_container.resources,
service_account_name=pod.spec.service_account_name,
secrets=secrets,
- affinity=pod.spec.affinity,
+ affinity=api_client.sanitize_for_serialization(pod.spec.affinity),
hostnetwork=pod.spec.host_network,
security_context=_extract_security_context(pod.spec.security_context)
)
diff --git a/tests/kubernetes/test_pod_launcher.py b/tests/kubernetes/test_pod_launcher.py
index 63169ae..00198fe 100644
--- a/tests/kubernetes/test_pod_launcher.py
+++ b/tests/kubernetes/test_pod_launcher.py
@@ -175,9 +175,26 @@ class TestPodLauncherHelper(unittest.TestCase):
input_pod = k8s.V1Pod(
metadata=k8s.V1ObjectMeta(
name="foo",
- namespace="bar"
+ namespace="bar",
+ annotations={"foo": "bar"}
),
spec=k8s.V1PodSpec(
+ affinity=k8s.V1Affinity(
+ pod_anti_affinity=k8s.V1PodAntiAffinity(
+ required_during_scheduling_ignored_during_execution=[
+ k8s.V1WeightedPodAffinityTerm(
+ weight=1,
+ pod_affinity_term=k8s.V1PodAffinityTerm(
+ label_selector=k8s.V1LabelSelector(
+ match_expressions=[
+ k8s.V1LabelSelectorRequirement(key="security", operator="In", values="S1")
+ ]
+ ),
+ topology_key="failure-domain.beta.kubernetes.io/zone",
+ ),
+ )
+ ]
+ )),
init_containers=[
k8s.V1Container(
name="init-container",
@@ -256,9 +273,12 @@ class TestPodLauncherHelper(unittest.TestCase):
)
result_pod = _convert_to_airflow_pod(input_pod)
+ self.assertEqual(type(result_pod.affinity), dict)
+
expected = Pod(
name="foo",
namespace="bar",
+ annotations={"foo": "bar"},
envs={},
init_containers=[
{'name': 'init-container', 'volumeMounts': [{'mountPath': '/tmp', 'name': 'init-secret'}]}
@@ -288,6 +308,14 @@ class TestPodLauncherHelper(unittest.TestCase):
read_only=True
)],
image_pull_secrets="my-secret",
+ affinity={'podAntiAffinity':
+ {'requiredDuringSchedulingIgnoredDuringExecution':
+ [{'podAffinityTerm':
+ {'labelSelector':
+ {'matchExpressions':
+ [{'key': 'security', 'operator': 'In', 'values': 'S1'}]},
+ 'topologyKey': 'failure-domain.beta.kubernetes.io/zone'},
+ 'weight': 1}]}},
secrets=[Secret("env", "AIRFLOW_SECRET", "ai", "secret_key")],
security_context={'fsGroup': 0, 'runAsUser': 0},
volumes=[Volume(name="myvolume", configs={'name': 'myvolume'}),
@@ -295,8 +323,8 @@ class TestPodLauncherHelper(unittest.TestCase):
'name': 'airflow-config'}),
Volume(name='airflow-secret', configs={'name': 'airflow-secret',
'secret': {'secretName': 'secret-name'}}),
- Volume(name='init-secret', configs={'name': 'init-secret', 'secret':
- {'secretName': 'init-secret'}})],
+ Volume(name='init-secret', configs={'name': 'init-secret',
+ 'secret': {'secretName': 'init-secret'}})],
)
expected_dict = expected.as_dict()
result_dict = result_pod.as_dict()