From d220fa801fa1bc35a0595639272273168185ce57 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 2 Dec 2025 20:11:06 +0100 Subject: [PATCH] Await aiodocker import_image coroutine (#6378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The aiodocker images.import_image() method returns a coroutine that needs to be awaited, but the code was iterating over it directly, causing "TypeError: 'coroutine' object is not iterable". Fixes SUPERVISOR-13D9 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- supervisor/docker/manager.py | 2 +- tests/conftest.py | 6 +++--- tests/docker/test_manager.py | 24 +++++++++++++----------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/supervisor/docker/manager.py b/supervisor/docker/manager.py index a8fe25192..105318831 100644 --- a/supervisor/docker/manager.py +++ b/supervisor/docker/manager.py @@ -768,7 +768,7 @@ class DockerAPI(CoreSysAttributes): """Import a tar file as image.""" try: with tar_file.open("rb") as read_tar: - resp: list[dict[str, Any]] = self.images.import_image(read_tar) + resp: list[dict[str, Any]] = await self.images.import_image(read_tar) except (aiodocker.DockerError, OSError) as err: raise DockerError( f"Can't import image from tar: {err}", _LOGGER.error diff --git a/tests/conftest.py b/tests/conftest.py index 6936198b1..e2d0340ce 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -144,9 +144,9 @@ async def docker() -> DockerAPI: docker_images.inspect.return_value = image_inspect docker_images.list.return_value = [image_inspect] - docker_images.import_image.return_value = [ - {"stream": "Loaded image: test:latest\n"} - ] + docker_images.import_image = AsyncMock( + return_value=[{"stream": "Loaded image: test:latest\n"}] + ) docker_images.pull.return_value = AsyncIterator([{}]) diff --git a/tests/docker/test_manager.py b/tests/docker/test_manager.py index dae636e3f..52b1e6b4c 100644 --- a/tests/docker/test_manager.py +++ b/tests/docker/test_manager.py @@ -2,7 +2,7 @@ import asyncio from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import AsyncMock, MagicMock, patch from docker.errors import APIError, DockerException, NotFound import pytest @@ -412,9 +412,9 @@ async def test_repair_failures(coresys: CoreSys, caplog: pytest.LogCaptureFixtur async def test_import_image(coresys: CoreSys, tmp_path: Path, log_starter: str): """Test importing an image into docker.""" (test_tar := tmp_path / "test.tar").touch() - coresys.docker.images.import_image.return_value = [ - {"stream": f"{log_starter}: imported"} - ] + coresys.docker.images.import_image = AsyncMock( + return_value=[{"stream": f"{log_starter}: imported"}] + ) coresys.docker.images.inspect.return_value = {"Id": "imported"} image = await coresys.docker.import_image(test_tar) @@ -426,9 +426,9 @@ async def test_import_image(coresys: CoreSys, tmp_path: Path, log_starter: str): async def test_import_image_error(coresys: CoreSys, tmp_path: Path): """Test failure importing an image into docker.""" (test_tar := tmp_path / "test.tar").touch() - coresys.docker.images.import_image.return_value = [ - {"errorDetail": {"message": "fail"}} - ] + coresys.docker.images.import_image = AsyncMock( + return_value=[{"errorDetail": {"message": "fail"}}] + ) with pytest.raises(DockerError, match="Can't import image from tar: fail"): await coresys.docker.import_image(test_tar) @@ -441,10 +441,12 @@ async def test_import_multiple_images_in_tar( ): """Test importing an image into docker.""" (test_tar := tmp_path / "test.tar").touch() - coresys.docker.images.import_image.return_value = [ - {"stream": "Loaded image: imported-1"}, - {"stream": "Loaded image: imported-2"}, - ] + coresys.docker.images.import_image = AsyncMock( + return_value=[ + {"stream": "Loaded image: imported-1"}, + {"stream": "Loaded image: imported-2"}, + ] + ) assert await coresys.docker.import_image(test_tar) is None