summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2017-06-16 14:05:54 -0700
committerJoffrey F <f.joffrey@gmail.com>2017-08-17 13:38:40 -0700
commit7139e2d8f1ea82340417add02090bfaf7794f159 (patch)
treec67c9c943d5ddd459600e239d14dcdc4b6e7253d
parent9e793806ff79559c3bc591d8c52a3bbe3cdb7350 (diff)
downloaddocker-py-7139e2d8f1ea82340417add02090bfaf7794f159.tar.gz
Return generator for output of load_image endpoint
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r--Jenkinsfile5
-rw-r--r--docker/api/image.py29
-rw-r--r--docker/models/images.py3
-rw-r--r--tests/integration/api_image_test.py13
-rw-r--r--tests/unit/api_image_test.py14
5 files changed, 58 insertions, 6 deletions
diff --git a/Jenkinsfile b/Jenkinsfile
index 3579278..9e1b491 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -5,9 +5,8 @@ def imageNamePy2
def imageNamePy3
def images = [:]
-// Note: Swarm in dind seem notoriously flimsy with 1.12.1+, which is why we're
-// sticking with 1.12.0 for the 1.12 series
-def dockerVersions = ["1.13.1", "17.04.0-ce", "17.05.0-ce", "17.06.0-ce-rc5"]
+
+def dockerVersions = ["1.13.1", "17.04.0-ce", "17.05.0-ce", "17.06.0-ce"]
def buildImage = { name, buildargs, pyTag ->
img = docker.image(name)
diff --git a/docker/api/image.py b/docker/api/image.py
index 85ff435..41cc267 100644
--- a/docker/api/image.py
+++ b/docker/api/image.py
@@ -262,7 +262,7 @@ class ImageApiMixin(object):
self._get(self._url("/images/{0}/json", image)), True
)
- def load_image(self, data):
+ def load_image(self, data, quiet=None):
"""
Load an image that was previously saved using
:py:meth:`~docker.api.image.ImageApiMixin.get_image` (or ``docker
@@ -270,9 +270,32 @@ class ImageApiMixin(object):
Args:
data (binary): Image data to be loaded.
+ quiet (boolean): Suppress progress details in response.
+
+ Returns:
+ (generator): Progress output as JSON objects. Only available for
+ API version >= 1.23
+
+ Raises:
+ :py:class:`docker.errors.APIError`
+ If the server returns an error.
"""
- res = self._post(self._url("/images/load"), data=data)
- return self._result(res, True)
+ params = {}
+
+ if quiet is not None:
+ if utils.version_lt(self._version, '1.23'):
+ raise errors.InvalidVersion(
+ 'quiet is not supported in API version < 1.23'
+ )
+ params['quiet'] = quiet
+
+ res = self._post(
+ self._url("/images/load"), data=data, params=params, stream=True
+ )
+ if utils.version_gte(self._version, '1.23'):
+ return self._stream_helper(res, decode=True)
+
+ self._raise_for_status(res)
@utils.minimum_version('1.25')
def prune_images(self, filters=None):
diff --git a/docker/models/images.py b/docker/models/images.py
index d4e24c6..3837929 100644
--- a/docker/models/images.py
+++ b/docker/models/images.py
@@ -235,6 +235,9 @@ class ImageCollection(Collection):
Args:
data (binary): Image data to be loaded.
+ Returns:
+ (generator): Progress output as JSON objects
+
Raises:
:py:class:`docker.errors.APIError`
If the server returns an error.
diff --git a/tests/integration/api_image_test.py b/tests/integration/api_image_test.py
index 192e6f8..14fb77a 100644
--- a/tests/integration/api_image_test.py
+++ b/tests/integration/api_image_test.py
@@ -249,6 +249,19 @@ class ImportImageTest(BaseAPIIntegrationTest):
assert img_data['Config']['Cmd'] == ['echo']
assert img_data['Config']['User'] == 'foobar'
+ # Docs say output is available in 1.23, but this test fails on 1.12.0
+ @requires_api_version('1.24')
+ def test_get_load_image(self):
+ test_img = 'hello-world:latest'
+ self.client.pull(test_img)
+ data = self.client.get_image(test_img)
+ assert data
+ output = self.client.load_image(data)
+ assert any([
+ line for line in output
+ if 'Loaded image: {}'.format(test_img) in line.get('stream', '')
+ ])
+
@contextlib.contextmanager
def temporary_http_file_server(self, stream):
'''Serve data from an IO stream over HTTP.'''
diff --git a/tests/unit/api_image_test.py b/tests/unit/api_image_test.py
index 36b2a46..f1e42cc 100644
--- a/tests/unit/api_image_test.py
+++ b/tests/unit/api_image_test.py
@@ -369,5 +369,19 @@ class ImageTest(BaseAPIClientTest):
'POST',
url_prefix + 'images/load',
data='Byte Stream....',
+ stream=True,
+ params={},
+ timeout=DEFAULT_TIMEOUT_SECONDS
+ )
+
+ def test_load_image_quiet(self):
+ self.client.load_image('Byte Stream....', quiet=True)
+
+ fake_request.assert_called_with(
+ 'POST',
+ url_prefix + 'images/load',
+ data='Byte Stream....',
+ stream=True,
+ params={'quiet': True},
timeout=DEFAULT_TIMEOUT_SECONDS
)