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
Beispiel #3
0
    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
Beispiel #5
0
    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)]
Beispiel #10
0
    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
Beispiel #11
0
    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)
Beispiel #12
0
    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)