From 022478fb68c0db7840f1a5f746f15ae570152b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ugo=20M=C3=A9da?= Date: Mon, 2 Oct 2017 22:06:35 +0200 Subject: [PATCH] Support saving multiple images Signed-off-by: EFanZh --- docker/api/image.py | 31 +++++++++++++++++++++++++++++++ tests/unit/api_image_test.py | 11 +++++++++++ tests/unit/fake_api.py | 8 ++++++++ 3 files changed, 50 insertions(+) diff --git a/docker/api/image.py b/docker/api/image.py index b370b7d83..d1e6e22e9 100644 --- a/docker/api/image.py +++ b/docker/api/image.py @@ -40,6 +40,37 @@ def get_image(self, image, chunk_size=DEFAULT_DATA_CHUNK_SIZE): res = self._get(self._url("/images/{0}/get", image), stream=True) return self._stream_raw_result(res, chunk_size, False) + @utils.check_resource('images') + def get_images(self, images, chunk_size=DEFAULT_DATA_CHUNK_SIZE): + """ + Get a tarball of images. Similar to the ``docker save`` command. + Args: + images (str[]): Image names to get + chunk_size (int): The number of bytes returned by each iteration + of the generator. If ``None``, data will be streamed as it is + received. Default: 2 MB + + Returns: + (generator): A stream of raw archive data. + + Raises: + :py:class:`docker.errors.APIError` + If the server returns an error. + + Example: + + >>> image = cli.get_images(["fedora:latest", "nginx:latest"]) + >>> f = open('/tmp/fedora-and-nginx-latest.tar', 'w') + >>> for chunk in image: + >>> f.write(chunk) + >>> f.close() + """ + params = { + "names": images + } + res = self._get(self._url("/images/get"), params=params, stream=True) + return self._stream_raw_result(res, chunk_size, False) + @utils.check_resource('image') def history(self, image): """ diff --git a/tests/unit/api_image_test.py b/tests/unit/api_image_test.py index 1e2315dbb..6e8f26ba7 100644 --- a/tests/unit/api_image_test.py +++ b/tests/unit/api_image_test.py @@ -332,6 +332,17 @@ def test_get_image(self): timeout=DEFAULT_TIMEOUT_SECONDS ) + def test_get_images(self): + self.client.get_images([fake_api.FAKE_IMAGE_ID]) + + fake_request.assert_called_with( + 'GET', + url_prefix + 'images/get', + stream=True, + params={"names": ["e9aa60c60128"]}, + timeout=DEFAULT_TIMEOUT_SECONDS + ) + def test_load_image(self): self.client.load_image('Byte Stream....') diff --git a/tests/unit/fake_api.py b/tests/unit/fake_api.py index e609b64ed..0c5755289 100644 --- a/tests/unit/fake_api.py +++ b/tests/unit/fake_api.py @@ -343,6 +343,12 @@ def get_fake_get_image(): return status_code, response +def get_fake_get_images(): + status_code = 200 + response = 'Byte Stream....' + return status_code, response + + def post_fake_load_image(): status_code = 200 response = {'Id': FAKE_IMAGE_ID} @@ -588,6 +594,8 @@ def post_fake_network_disconnect(): delete_fake_remove_image, '{1}/{0}/images/e9aa60c60128/get'.format(CURRENT_VERSION, prefix): get_fake_get_image, + '{1}/{0}/images/get'.format(CURRENT_VERSION, prefix): + get_fake_get_images, '{1}/{0}/images/load'.format(CURRENT_VERSION, prefix): post_fake_load_image, '{1}/{0}/images/test_image/json'.format(CURRENT_VERSION, prefix):