From 05028469bfa47e0291439c250380a2bfa7b156c6 Mon Sep 17 00:00:00 2001 From: stefanos-mandalas Date: Wed, 24 Sep 2025 13:29:27 +0200 Subject: [PATCH 1/3] use inspect_service() instead of inspect_container() --- .../src/airflow/providers/docker/operators/docker_swarm.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py b/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py index 8c07df0bf2826..b5a3119b37d2f 100644 --- a/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py +++ b/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py @@ -218,9 +218,8 @@ def _run_service(self) -> None: if self.service and self._service_status() == "complete": self.tasks = self.cli.tasks(filters={"service": self.service["ID"]}) for task in self.tasks: - container_id = task["Status"]["ContainerStatus"]["ContainerID"] - container = self.cli.inspect_container(container_id) - self.containers.append(container) + docker_service = self.cli.inspect_service(task["ServiceID"]) + self.containers.append(docker_service) if self.retrieve_output: return self._attempt_to_retrieve_results() From f2b7934988ef9e62a091d230dd5815d88dec378d Mon Sep 17 00:00:00 2001 From: stefanos-mandalas Date: Thu, 25 Sep 2025 10:46:01 +0200 Subject: [PATCH 2/3] fix tests --- .../unit/docker/operators/test_docker_swarm.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py index c512e052f904a..6a7b59c51e4b1 100644 --- a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py +++ b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py @@ -37,9 +37,9 @@ def test_execute(self, types_mock, docker_api_client_patcher, caplog): def _client_tasks_side_effect(): for _ in range(2): - yield [{"Status": {"State": "pending"}}] + yield [{"ServiceID": "some_id", "Status": {"State": "pending"}}] while True: - yield [{"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}}] + yield [{"ServiceID": "some_id", "Status": {"State": "complete"}}] def _client_service_logs_effect(): service_logs = [ @@ -139,7 +139,7 @@ def test_auto_remove(self, types_mock, docker_api_client_patcher, auto_remove): client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj @@ -195,7 +195,7 @@ def test_no_auto_remove(self, types_mock, docker_api_client_patcher): client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj @@ -273,7 +273,7 @@ def test_container_resources(self, types_mock, docker_api_client_patcher): client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj @@ -323,7 +323,7 @@ def test_service_args_str(self, types_mock, docker_api_client_patcher): client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj @@ -363,7 +363,7 @@ def test_service_args_list(self, types_mock, docker_api_client_patcher): client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj @@ -457,7 +457,7 @@ def test_service_prefix(self, types_mock, docker_api_client_patcher, service_pre client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] client_mock.tasks.return_value = [ - {"Status": {"State": "complete", "ContainerStatus": {"ContainerID": "some_id"}}} + {"ServiceID": "some_id", "Status": {"State": "complete"}} ] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj From 3f1e4c0dd199e78417eac979d48ab27cf79b14a6 Mon Sep 17 00:00:00 2001 From: stefanos-mandalas Date: Sat, 27 Sep 2025 11:20:16 +0200 Subject: [PATCH 3/3] fix formatting --- .../docker/operators/test_docker_swarm.py | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py index 6a7b59c51e4b1..480bb61986b2f 100644 --- a/providers/docker/tests/unit/docker/operators/test_docker_swarm.py +++ b/providers/docker/tests/unit/docker/operators/test_docker_swarm.py @@ -138,9 +138,7 @@ def test_auto_remove(self, types_mock, docker_api_client_patcher, auto_remove): client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj @@ -194,9 +192,7 @@ def test_no_auto_remove(self, types_mock, docker_api_client_patcher): client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj @@ -272,9 +268,7 @@ def test_container_resources(self, types_mock, docker_api_client_patcher): client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj @@ -322,9 +316,7 @@ def test_service_args_str(self, types_mock, docker_api_client_patcher): client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj @@ -362,9 +354,7 @@ def test_service_args_list(self, types_mock, docker_api_client_patcher): client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj @@ -456,9 +446,7 @@ def test_service_prefix(self, types_mock, docker_api_client_patcher, service_pre client_mock.create_service.return_value = {"ID": "some_id"} client_mock.images.return_value = [] client_mock.pull.return_value = [b'{"status":"pull log"}'] - client_mock.tasks.return_value = [ - {"ServiceID": "some_id", "Status": {"State": "complete"}} - ] + client_mock.tasks.return_value = [{"ServiceID": "some_id", "Status": {"State": "complete"}}] types_mock.TaskTemplate.return_value = mock_obj types_mock.ContainerSpec.return_value = mock_obj types_mock.RestartPolicy.return_value = mock_obj