This is an automated email from the ASF dual-hosted git repository.
potiuk 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 f4e5571384 Add missing docker test_exceptions.py (#35674)
f4e5571384 is described below
commit f4e55713840fed023c03a4e4462789aa35c892db
Author: Riyas P K <[email protected]>
AuthorDate: Wed Nov 22 06:08:45 2023 +0530
Add missing docker test_exceptions.py (#35674)
* test case for docker exceptions
* removed docker test exception
* re-wrote test case based on feedback
---
tests/always/test_project_structure.py | 1 -
tests/providers/docker/test_exceptions.py | 80 +++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/tests/always/test_project_structure.py
b/tests/always/test_project_structure.py
index a58f33d755..967c3ecbb5 100644
--- a/tests/always/test_project_structure.py
+++ b/tests/always/test_project_structure.py
@@ -108,7 +108,6 @@ class TestProjectStructure:
"tests/providers/cncf/kubernetes/utils/test_xcom_sidecar.py",
"tests/providers/daskexecutor/executors/test_dask_executor.py",
"tests/providers/databricks/hooks/test_databricks_base.py",
- "tests/providers/docker/test_exceptions.py",
"tests/providers/google/cloud/fs/test_gcs.py",
"tests/providers/google/cloud/links/test_automl.py",
"tests/providers/google/cloud/links/test_base.py",
diff --git a/tests/providers/docker/test_exceptions.py
b/tests/providers/docker/test_exceptions.py
new file mode 100644
index 0000000000..1f3653c39d
--- /dev/null
+++ b/tests/providers/docker/test_exceptions.py
@@ -0,0 +1,80 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""Test for Exceptions used by Docker provider."""
+
+from __future__ import annotations
+
+from unittest import mock
+
+import pytest
+from docker import APIClient
+
+from airflow.providers.docker.exceptions import (
+ DockerContainerFailedException,
+ DockerContainerFailedSkipException,
+)
+from airflow.providers.docker.operators.docker import DockerOperator
+
+FAILED_MESSAGE = {"StatusCode": 1}
+FAILED_LOGS = ["unicode container log 😁 ", b"byte string container log"]
+EXPECTED_MESSAGE = f"Docker container failed: {FAILED_MESSAGE}"
+FAILED_SKIP_MESSAGE = {"StatusCode": 2}
+SKIP_ON_EXIT_CODE = 2
+EXPECTED_SKIP_MESSAGE = f"Docker container returned exit code
{[SKIP_ON_EXIT_CODE]}. Skipping."
+
+
[email protected](
+ "failed_msg, log_line, expected_message, skip_on_exit_code",
+ [
+ (FAILED_MESSAGE, FAILED_LOGS, EXPECTED_MESSAGE, None),
+ (FAILED_SKIP_MESSAGE, FAILED_LOGS, EXPECTED_SKIP_MESSAGE,
SKIP_ON_EXIT_CODE),
+ ],
+)
+class TestDockerContainerExceptions:
+ @pytest.fixture(autouse=True, scope="function")
+ def setup_patchers(self, docker_api_client_patcher):
+ self.client_mock = mock.MagicMock(spec=APIClient)
+ self.client_mock.wait.return_value = {"StatusCode": 0}
+ self.log_messages = ["container log 😁 ", b"byte string container
log"]
+ self.client_mock.attach.return_value = self.log_messages
+
+ self.client_mock.logs.side_effect = (
+ lambda **kwargs: iter(self.log_messages[-kwargs["tail"] :])
+ if "tail" in kwargs
+ else iter(self.log_messages)
+ )
+
+ docker_api_client_patcher.return_value = self.client_mock
+
+ def test_docker_failed_exception(self, failed_msg, log_line,
expected_message, skip_on_exit_code):
+ self.client_mock.attach.return_value = log_line
+ self.client_mock.wait.return_value = failed_msg
+
+ operator = DockerOperator(
+ image="ubuntu", owner="unittest", task_id="unittest",
skip_on_exit_code=skip_on_exit_code
+ )
+
+ if skip_on_exit_code:
+ with pytest.raises(DockerContainerFailedSkipException) as
raised_exception:
+ operator.execute(None)
+ else:
+ with pytest.raises(DockerContainerFailedException) as
raised_exception:
+ operator.execute(None)
+
+ assert str(raised_exception.value) == expected_message
+ assert raised_exception.value.logs == [log_line[0].strip(),
log_line[1].decode("utf-8")]