Return generator for output of load_image endpoint

Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
Joffrey F 2017-06-16 14:05:54 -07:00 committed by Joffrey F
parent 56dc7db069
commit 5e4a69bbda
5 changed files with 58 additions and 6 deletions

5
Jenkinsfile vendored
View File

@ -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)

View File

@ -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):

View File

@ -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.

View File

@ -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.'''

View File

@ -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
)