Rename cachefrom -> cache_from

Fix cache_from integration test
Fix image ID detection in ImageCollection.build

Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
Joffrey F 2017-02-15 18:42:49 -08:00
parent 4a50784ad4
commit 0a97df1abc
3 changed files with 43 additions and 27 deletions

View File

@ -1,11 +1,11 @@
import json
import logging import logging
import os import os
import re import re
import json
from .. import auth
from .. import constants from .. import constants
from .. import errors from .. import errors
from .. import auth
from .. import utils from .. import utils
@ -18,7 +18,7 @@ class BuildApiMixin(object):
custom_context=False, encoding=None, pull=False, custom_context=False, encoding=None, pull=False,
forcerm=False, dockerfile=None, container_limits=None, forcerm=False, dockerfile=None, container_limits=None,
decode=False, buildargs=None, gzip=False, shmsize=None, decode=False, buildargs=None, gzip=False, shmsize=None,
labels=None, cachefrom=None): labels=None, cache_from=None):
""" """
Similar to the ``docker build`` command. Either ``path`` or ``fileobj`` Similar to the ``docker build`` command. Either ``path`` or ``fileobj``
needs to be set. ``path`` can be a local path (to a directory needs to be set. ``path`` can be a local path (to a directory
@ -92,7 +92,8 @@ class BuildApiMixin(object):
shmsize (int): Size of `/dev/shm` in bytes. The size must be shmsize (int): Size of `/dev/shm` in bytes. The size must be
greater than 0. If omitted the system uses 64MB. greater than 0. If omitted the system uses 64MB.
labels (dict): A dictionary of labels to set on the image. labels (dict): A dictionary of labels to set on the image.
cachefrom (list): A list of images used for build cache resolution. cache_from (list): A list of images used for build cache
resolution.
Returns: Returns:
A generator for the build output. A generator for the build output.
@ -189,12 +190,12 @@ class BuildApiMixin(object):
'labels was only introduced in API version 1.23' 'labels was only introduced in API version 1.23'
) )
if cachefrom: if cache_from:
if utils.version_gte(self._version, '1.25'): if utils.version_gte(self._version, '1.25'):
params.update({'cachefrom': json.dumps(cachefrom)}) params.update({'cachefrom': json.dumps(cache_from)})
else: else:
raise errors.InvalidVersion( raise errors.InvalidVersion(
'cachefrom was only introduced in API version 1.25' 'cache_from was only introduced in API version 1.25'
) )
if context is not None: if context is not None:

View File

@ -141,7 +141,8 @@ class ImageCollection(Collection):
``"0-3"``, ``"0,1"`` ``"0-3"``, ``"0,1"``
decode (bool): If set to ``True``, the returned stream will be decode (bool): If set to ``True``, the returned stream will be
decoded into dicts on the fly. Default ``False``. decoded into dicts on the fly. Default ``False``.
cachefrom (list): A list of images used for build cache resolution. cache_from (list): A list of images used for build cache
resolution.
Returns: Returns:
(:py:class:`Image`): The built image. (:py:class:`Image`): The built image.
@ -162,10 +163,10 @@ class ImageCollection(Collection):
return BuildError('Unknown') return BuildError('Unknown')
event = events[-1] event = events[-1]
if 'stream' in event: if 'stream' in event:
match = re.search(r'Successfully built ([0-9a-f]+)', match = re.search(r'(Successfully built |sha256:)([0-9a-f]+)',
event.get('stream', '')) event.get('stream', ''))
if match: if match:
image_id = match.group(1) image_id = match.group(2)
return self.get(image_id) return self.get(image_id)
raise BuildError(event.get('error') or event) raise BuildError(event.get('error') or event)

View File

@ -3,13 +3,12 @@ import os
import shutil import shutil
import tempfile import tempfile
import pytest
import six
from docker import errors from docker import errors
from ..helpers import requires_api_version import six
from .base import BaseAPIIntegrationTest from .base import BaseAPIIntegrationTest
from ..helpers import requires_api_version
class BuildTest(BaseAPIIntegrationTest): class BuildTest(BaseAPIIntegrationTest):
@ -155,25 +154,40 @@ class BuildTest(BaseAPIIntegrationTest):
self.assertEqual(info['Config']['Labels'], labels) self.assertEqual(info['Config']['Labels'], labels)
@requires_api_version('1.25') @requires_api_version('1.25')
@pytest.mark.xfail(reason='Bad test') def test_build_with_cache_from(self):
def test_build_cachefrom(self):
script = io.BytesIO('\n'.join([ script = io.BytesIO('\n'.join([
'FROM scratch', 'FROM busybox',
'CMD sh -c "echo \'Hello, World!\'"', 'ENV FOO=bar',
'RUN touch baz',
'RUN touch bax',
]).encode('ascii')) ]).encode('ascii'))
cachefrom = ['build1'] stream = self.client.build(fileobj=script, tag='build1')
self.tmp_imgs.append('build1')
stream = self.client.build(
fileobj=script, tag='cachefrom', cachefrom=cachefrom
)
self.tmp_imgs.append('cachefrom')
for chunk in stream: for chunk in stream:
pass pass
info = self.client.inspect_image('cachefrom') stream = self.client.build(
# FIXME: Config.CacheFrom is not a real thing fileobj=script, tag='build2', cache_from=['build1'],
self.assertEqual(info['Config']['CacheFrom'], cachefrom) decode=True
)
self.tmp_imgs.append('build2')
counter = 0
for chunk in stream:
if 'Using cache' in chunk.get('stream', ''):
counter += 1
assert counter == 3
self.client.remove_image('build2')
counter = 0
stream = self.client.build(
fileobj=script, tag='build2', cache_from=['nosuchtag'],
decode=True
)
for chunk in stream:
if 'Using cache' in chunk.get('stream', ''):
counter += 1
assert counter == 0
def test_build_stderr_data(self): def test_build_stderr_data(self):
control_chars = ['\x1b[91m', '\x1b[0m'] control_chars = ['\x1b[91m', '\x1b[0m']