Skip to content

Commit 7139e2d

Browse files
committed
Return generator for output of load_image endpoint
Signed-off-by: Joffrey F <[email protected]>
1 parent 9e79380 commit 7139e2d

File tree

5 files changed

+58
-6
lines changed

5 files changed

+58
-6
lines changed

Jenkinsfile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ def imageNamePy2
55
def imageNamePy3
66
def images = [:]
77

8-
// Note: Swarm in dind seem notoriously flimsy with 1.12.1+, which is why we're
9-
// sticking with 1.12.0 for the 1.12 series
10-
def dockerVersions = ["1.13.1", "17.04.0-ce", "17.05.0-ce", "17.06.0-ce-rc5"]
8+
9+
def dockerVersions = ["1.13.1", "17.04.0-ce", "17.05.0-ce", "17.06.0-ce"]
1110

1211
def buildImage = { name, buildargs, pyTag ->
1312
img = docker.image(name)

docker/api/image.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,17 +262,40 @@ def inspect_image(self, image):
262262
self._get(self._url("/images/{0}/json", image)), True
263263
)
264264

265-
def load_image(self, data):
265+
def load_image(self, data, quiet=None):
266266
"""
267267
Load an image that was previously saved using
268268
:py:meth:`~docker.api.image.ImageApiMixin.get_image` (or ``docker
269269
save``). Similar to ``docker load``.
270270
271271
Args:
272272
data (binary): Image data to be loaded.
273+
quiet (boolean): Suppress progress details in response.
274+
275+
Returns:
276+
(generator): Progress output as JSON objects. Only available for
277+
API version >= 1.23
278+
279+
Raises:
280+
:py:class:`docker.errors.APIError`
281+
If the server returns an error.
273282
"""
274-
res = self._post(self._url("/images/load"), data=data)
275-
return self._result(res, True)
283+
params = {}
284+
285+
if quiet is not None:
286+
if utils.version_lt(self._version, '1.23'):
287+
raise errors.InvalidVersion(
288+
'quiet is not supported in API version < 1.23'
289+
)
290+
params['quiet'] = quiet
291+
292+
res = self._post(
293+
self._url("/images/load"), data=data, params=params, stream=True
294+
)
295+
if utils.version_gte(self._version, '1.23'):
296+
return self._stream_helper(res, decode=True)
297+
298+
self._raise_for_status(res)
276299

277300
@utils.minimum_version('1.25')
278301
def prune_images(self, filters=None):

docker/models/images.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ def load(self, data):
235235
Args:
236236
data (binary): Image data to be loaded.
237237
238+
Returns:
239+
(generator): Progress output as JSON objects
240+
238241
Raises:
239242
:py:class:`docker.errors.APIError`
240243
If the server returns an error.

tests/integration/api_image_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,19 @@ def test_import_image_with_changes(self):
249249
assert img_data['Config']['Cmd'] == ['echo']
250250
assert img_data['Config']['User'] == 'foobar'
251251

252+
# Docs say output is available in 1.23, but this test fails on 1.12.0
253+
@requires_api_version('1.24')
254+
def test_get_load_image(self):
255+
test_img = 'hello-world:latest'
256+
self.client.pull(test_img)
257+
data = self.client.get_image(test_img)
258+
assert data
259+
output = self.client.load_image(data)
260+
assert any([
261+
line for line in output
262+
if 'Loaded image: {}'.format(test_img) in line.get('stream', '')
263+
])
264+
252265
@contextlib.contextmanager
253266
def temporary_http_file_server(self, stream):
254267
'''Serve data from an IO stream over HTTP.'''

tests/unit/api_image_test.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,5 +369,19 @@ def test_load_image(self):
369369
'POST',
370370
url_prefix + 'images/load',
371371
data='Byte Stream....',
372+
stream=True,
373+
params={},
374+
timeout=DEFAULT_TIMEOUT_SECONDS
375+
)
376+
377+
def test_load_image_quiet(self):
378+
self.client.load_image('Byte Stream....', quiet=True)
379+
380+
fake_request.assert_called_with(
381+
'POST',
382+
url_prefix + 'images/load',
383+
data='Byte Stream....',
384+
stream=True,
385+
params={'quiet': True},
372386
timeout=DEFAULT_TIMEOUT_SECONDS
373387
)

0 commit comments

Comments
 (0)