From 35ceefe1f121c8d829173cbc8f18dd5965308073 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sun, 10 Sep 2017 14:34:51 -0400 Subject: [PATCH 1/2] Return Image objects on image.load In before, image.load returns what Docker API returns, which is a text stream. This commits propose an improvement for returning more useful information, which is a list of Image objects being loaded. Signed-off-by: Hongbin Lu --- docker/models/images.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/docker/models/images.py b/docker/models/images.py index d1b29ad8a6..89e0e80319 100644 --- a/docker/models/images.py +++ b/docker/models/images.py @@ -236,13 +236,24 @@ def load(self, data): data (binary): Image data to be loaded. Returns: - (generator): Progress output as JSON objects + (list of :py:class:`Image`): The images. Raises: :py:class:`docker.errors.APIError` If the server returns an error. """ - return self.client.api.load_image(data) + resp = self.client.api.load_image(data) + images = [] + for chunk in resp: + if 'stream' in chunk: + match = re.search( + r'(^Loaded image ID: |^Loaded image: )(.+)$', + chunk['stream'] + ) + if match: + image_id = match.group(2) + images.append(image_id) + return [self.get(i) for i in images] def pull(self, name, tag=None, **kwargs): """ From 8b5a52ae0ced380fbd761f891830107d8817f240 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Fri, 26 Jan 2018 14:34:20 -0800 Subject: [PATCH 2/2] Error handling in ImageCollection.load Signed-off-by: Joffrey F --- docker/errors.py | 4 ++++ docker/models/images.py | 5 ++++- tests/integration/models_images_test.py | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docker/errors.py b/docker/errors.py index 50423a268d..eeeac5791f 100644 --- a/docker/errors.py +++ b/docker/errors.py @@ -144,6 +144,10 @@ class BuildError(Exception): pass +class ImageLoadError(DockerException): + pass + + def create_unexpected_kwargs_error(name, kwargs): quoted_kwargs = ["'{}'".format(k) for k in sorted(kwargs)] text = ["{}() ".format(name)] diff --git a/docker/models/images.py b/docker/models/images.py index 437273013b..dcdeac98aa 100644 --- a/docker/models/images.py +++ b/docker/models/images.py @@ -3,7 +3,7 @@ import six from ..api import APIClient -from ..errors import BuildError +from ..errors import BuildError, ImageLoadError from ..utils.json_stream import json_stream from .resource import Collection, Model @@ -258,6 +258,9 @@ def load(self, data): if match: image_id = match.group(2) images.append(image_id) + if 'error' in chunk: + raise ImageLoadError(chunk['error']) + return [self.get(i) for i in images] def pull(self, name, tag=None, **kwargs): diff --git a/tests/integration/models_images_test.py b/tests/integration/models_images_test.py index 8f812d9390..8840e15de0 100644 --- a/tests/integration/models_images_test.py +++ b/tests/integration/models_images_test.py @@ -71,6 +71,11 @@ def test_pull_with_tag(self): image = client.images.pull('alpine', tag='3.3') assert 'alpine:3.3' in image.attrs['RepoTags'] + def test_load_error(self): + client = docker.from_env(version=TEST_API_VERSION) + with pytest.raises(docker.errors.ImageLoadError): + client.images.load('abc') + class ImageTest(BaseIntegrationTest):