def test_full_pod_spec(self): pod_spec = k8s.V1Pod( metadata=k8s.V1ObjectMeta(name="hello", labels={"foo": "bar"}, namespace="mynamespace"), spec=k8s.V1PodSpec(containers=[ k8s.V1Container( name="base", image="ubuntu:16.04", command=["something"], ) ]), ) k = KubernetesPodOperator( task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", full_pod_spec=pod_spec, ) pod = k.create_pod_request_obj() assert pod.metadata.name == pod_spec.metadata.name assert pod.metadata.labels == pod_spec.metadata.labels assert pod.metadata.namespace == pod_spec.metadata.namespace assert pod.spec.containers[0].image == pod_spec.spec.containers[ 0].image assert pod.spec.containers[0].command == pod_spec.spec.containers[ 0].command # kwargs take precedence, however image = "some.custom.image:andtag" name_base = "world" k = KubernetesPodOperator( task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", full_pod_spec=pod_spec, name=name_base, image=image, ) pod = k.create_pod_request_obj() # make sure the kwargs takes precedence (and that name is randomized) assert pod.metadata.name.startswith(name_base) assert pod.metadata.name != name_base assert pod.spec.containers[0].image == image
def test_pod_template_file(self): pod_template_yaml = b""" apiVersion: v1 kind: Pod metadata: name: hello namespace: mynamespace labels: foo: bar spec: containers: - name: base image: ubuntu:16.04 command: - something """ with NamedTemporaryFile() as tpl_file: tpl_file.write(pod_template_yaml) tpl_file.flush() k = KubernetesPodOperator( task_id="task", pod_template_file=tpl_file.name, ) pod = k.create_pod_request_obj() assert pod.metadata.name == "hello" assert pod.metadata.labels == {"foo": "bar"} assert pod.metadata.namespace == "mynamespace" assert pod.spec.containers[0].image == "ubuntu:16.04" assert pod.spec.containers[0].command == ["something"] # kwargs take precedence, however image = "some.custom.image:andtag" name_base = "world" k = KubernetesPodOperator( task_id="task", pod_template_file=tpl_file.name, name=name_base, image=image, ) pod = k.create_pod_request_obj() # make sure the kwargs takes precedence (and that name is randomized) assert pod.metadata.name.startswith(name_base) assert pod.metadata.name != name_base assert pod.spec.containers[0].image == image
def test_tolerations(self): k8s_api_tolerations = [ k8s.V1Toleration(key="key", operator="Equal", value="value") ] tolerations = [{'key': "key", 'operator': 'Equal', 'value': 'value'}] k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', tolerations=tolerations, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.tolerations[0]), k8s.V1Toleration) self.assertEqual( client.sanitize_for_serialization(result)['spec']['tolerations'], tolerations) k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', tolerations=k8s_api_tolerations, ) result = k.create_pod_request_obj() self.assertEqual(type(result.spec.tolerations[0]), k8s.V1Toleration) self.assertEqual( client.sanitize_for_serialization(result)['spec']['tolerations'], tolerations)
def test_node_selector(self): node_selector = {"beta.kubernetes.io/os": "linux"} k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", node_selector=node_selector, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.node_selector, dict) assert sanitized_pod["spec"]["nodeSelector"] == node_selector # repeat tests using deprecated parameter with pytest.warns( DeprecationWarning, match= "node_selectors is deprecated. Please use node_selector instead." ): k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", node_selectors=node_selector, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.node_selector, dict) assert sanitized_pod["spec"]["nodeSelector"] == node_selector
def test_node_selector(self): node_selector = {'beta.kubernetes.io/os': 'linux'} k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selector=node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), dict) self.assertEqual( client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector) # repeat tests using deprecated parameter k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selectors=node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), dict) self.assertEqual( client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector)
def test_tolerations(self): k8s_api_tolerations = [ k8s.V1Toleration(key="key", operator="Equal", value="value") ] tolerations = [{"key": "key", "operator": "Equal", "value": "value"}] k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", tolerations=tolerations, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.tolerations[0], k8s.V1Toleration) assert sanitized_pod["spec"]["tolerations"] == tolerations k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", tolerations=k8s_api_tolerations, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.tolerations[0], k8s.V1Toleration) assert sanitized_pod["spec"]["tolerations"] == tolerations
def test_image_pull_policy_not_set(self): k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="test", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", ) pod = k.create_pod_request_obj() assert pod.spec.containers[0].image_pull_policy == "IfNotPresent"
def test_randomize_pod_name(self): name_base = "test" k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", name=name_base, task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", ) pod = k.create_pod_request_obj() assert pod.metadata.name.startswith(name_base) assert pod.metadata.name != name_base
def test_image_pull_secrets_correctly_set(self): fake_pull_secrets = "fakeSecret" k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="test", task_id="task", in_cluster=False, do_xcom_push=False, image_pull_secrets=[k8s.V1LocalObjectReference(fake_pull_secrets)], cluster_context="default", ) pod = k.create_pod_request_obj() assert pod.spec.image_pull_secrets == [k8s.V1LocalObjectReference(name=fake_pull_secrets)]
def test_create_with_affinity(self): name_base = "test" affinity = { "nodeAffinity": { "preferredDuringSchedulingIgnoredDuringExecution": [ { "weight": 1, "preference": { "matchExpressions": [{"key": "disktype", "operator": "In", "values": ["ssd"]}] }, } ] } } k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name=name_base, task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", affinity=affinity, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.affinity, k8s.V1Affinity) assert sanitized_pod["spec"]["affinity"] == affinity k8s_api_affinity = k8s.V1Affinity( node_affinity=k8s.V1NodeAffinity( preferred_during_scheduling_ignored_during_execution=[ k8s.V1PreferredSchedulingTerm( weight=1, preference=k8s.V1NodeSelectorTerm( match_expressions=[ k8s.V1NodeSelectorRequirement(key="disktype", operator="In", values=["ssd"]) ] ), ) ] ), ) k = KubernetesPodOperator( namespace="default", image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name=name_base, task_id="task", in_cluster=False, do_xcom_push=False, cluster_context="default", affinity=k8s_api_affinity, ) pod = k.create_pod_request_obj() sanitized_pod = self.sanitize_for_serialization(pod) assert isinstance(pod.spec.affinity, k8s.V1Affinity) assert sanitized_pod["spec"]["affinity"] == affinity
def test_create_with_affinity(self): name_base = 'test' affinity = { 'nodeAffinity': { 'preferredDuringSchedulingIgnoredDuringExecution': [{ "weight": 1, "preference": { "matchExpressions": [{ "key": "disktype", "operator": "In", "values": ["ssd"] }] }, }] } } k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name=name_base, task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', affinity=affinity, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.affinity), k8s.V1Affinity) self.assertEqual( client.sanitize_for_serialization(result)['spec']['affinity'], affinity) k8s_api_affinity = k8s.V1Affinity(node_affinity=k8s.V1NodeAffinity( preferred_during_scheduling_ignored_during_execution=[ k8s.V1PreferredSchedulingTerm( weight=1, preference=k8s.V1NodeSelectorTerm(match_expressions=[ k8s.V1NodeSelectorRequirement( key="disktype", operator="In", values=["ssd"]) ]), ) ]), ) k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name=name_base, task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', affinity=k8s_api_affinity, ) result = k.create_pod_request_obj() self.assertEqual(type(result.spec.affinity), k8s.V1Affinity) self.assertEqual( client.sanitize_for_serialization(result)['spec']['affinity'], affinity)
def test_node_selector(self): k8s_api_node_selector = k8s.V1NodeSelector( node_selector_terms=[ k8s.V1NodeSelectorTerm( match_expressions=[ k8s.V1NodeSelectorRequirement(key="disktype", operator="In", values=["ssd"]) ] ) ] ) node_selector = { 'nodeSelectorTerms': [ {'matchExpressions': [{'key': 'disktype', 'operator': 'In', 'values': ['ssd']}]} ] } k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selector=k8s_api_node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), k8s.V1NodeSelector) self.assertEqual(client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector) k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selector=k8s_api_node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), k8s.V1NodeSelector) self.assertEqual(client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector) # repeat tests using deprecated parameter k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selectors=node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), k8s.V1NodeSelector) self.assertEqual(client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector) k = KubernetesPodOperator( namespace='default', image="ubuntu:16.04", cmds=["bash", "-cx"], arguments=["echo 10"], labels={"foo": "bar"}, name="name", task_id="task", in_cluster=False, do_xcom_push=False, cluster_context='default', node_selectors=node_selector, ) result = k.create_pod_request_obj() client = ApiClient() self.assertEqual(type(result.spec.node_selector), k8s.V1NodeSelector) self.assertEqual(client.sanitize_for_serialization(result)['spec']['nodeSelector'], node_selector)