diff options
author | Joffrey F <joffrey@docker.com> | 2017-06-16 14:05:54 -0700 |
---|---|---|
committer | Joffrey F <f.joffrey@gmail.com> | 2017-08-17 13:38:40 -0700 |
commit | 7139e2d8f1ea82340417add02090bfaf7794f159 (patch) | |
tree | c67c9c943d5ddd459600e239d14dcdc4b6e7253d | |
parent | 9e793806ff79559c3bc591d8c52a3bbe3cdb7350 (diff) | |
download | docker-py-7139e2d8f1ea82340417add02090bfaf7794f159.tar.gz |
Return generator for output of load_image endpoint
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r-- | Jenkinsfile | 5 | ||||
-rw-r--r-- | docker/api/image.py | 29 | ||||
-rw-r--r-- | docker/models/images.py | 3 | ||||
-rw-r--r-- | tests/integration/api_image_test.py | 13 | ||||
-rw-r--r-- | tests/unit/api_image_test.py | 14 |
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 ) |