[virt-tools-list] [virt-bootstrap] [PATCH v6 06/26] DockerSource: Split checksum and layers

Cedric Bosdonnat cbosdonnat at suse.com
Sat Aug 19 12:30:07 UTC 2017


On Thu, 2017-08-17 at 10:39 +0100, Radostin Stoyanov wrote:
> The current implementation store in one list:
>     - checksum
>     - checksum type
>     - file path
>     - file size
> However, the information about checksum and checksum type is only used
> to verify the content of tarball before it is being extracted. Splitting
> these into separate lists would allow us to reuse the function
> untar_layers() with FileSource.
> ---
>  src/virtBootstrap/sources/docker_source.py | 12 ++++++++++--
>  src/virtBootstrap/utils.py                 | 19 +++++++++----------
>  tests/docker_source.py                     | 16 +++++++++-------
>  3 files changed, 28 insertions(+), 19 deletions(-)
> 
> diff --git a/src/virtBootstrap/sources/docker_source.py b/src/virtBootstrap/sources/docker_source.py
> index 54d8903..246356a 100644
> --- a/src/virtBootstrap/sources/docker_source.py
> +++ b/src/virtBootstrap/sources/docker_source.py
> @@ -65,6 +65,7 @@ class DockerSource(object):
>          self.images_dir = utils.get_image_dir(self.no_cache)
>          self.manifest = None
>          self.layers = []
> +        self.checksums = []
>  
>          if self.username and not self.password:
>              self.password = getpass.getpass()
> @@ -94,9 +95,13 @@ class DockerSource(object):
>              layer_digest = layer[digest_field]
>              layer_size = layer['size'] if 'size' in layer else None
>  
> +            # Store checksums of layers
>              sum_type, layer_sum = layer_digest.split(':')
> +            self.checksums.append([sum_type, layer_sum])
> +
> +            # Store file path and size of each layer
>              file_path = os.path.join(self.images_dir, layer_sum + '.tar')
> -            self.layers.append([sum_type, layer_sum, file_path, layer_size])
> +            self.layers.append([file_path, layer_size])
>  
>      def gen_valid_uri(self, uri):
>          """
> @@ -230,7 +235,10 @@ class DockerSource(object):
>          and have valid hash sum.
>          """
>          self.progress("Checking cached layers", value=0, logger=logger)
> -        for sum_type, sum_expected, path, _ignore in self.layers:
> +        for index, checksum in enumerate(self.checksums):
> +            path = self.layers[index][0]
> +            sum_type, sum_expected = checksum
> +
>              logger.debug("Checking layer: %s", path)
>              if not (os.path.exists(path)
>                      and utils.checksum(path, sum_type, sum_expected)):
> diff --git a/src/virtBootstrap/utils.py b/src/virtBootstrap/utils.py
> index fff7b35..730f939 100644
> --- a/src/virtBootstrap/utils.py
> +++ b/src/virtBootstrap/utils.py
> @@ -143,17 +143,16 @@ def size_to_bytes(number, fmt):
>              else False)
>  
>  
> -def log_layer_extract(layer, current, total, progress):
> +def log_layer_extract(tar_file, tar_size, current, total, progress):
>      """
>      Create log message on layer extract.
>      """
> -    sum_type, sum_value, layer_file, layer_size = layer
>      msg = 'Extracting layer (%s/%s)' % (current, total)
>  
> -    if layer_size:
> -        msg += " with size: %s" % bytes_to_size(layer_size)
> +    if tar_size:
> +        msg += " with size: %s" % bytes_to_size(tar_size)
>      progress(msg, logger=logger)
> -    logger.debug('Untar layer: (%s:%s) %s', sum_type, sum_value, layer_file)
> +    logger.debug('Untar layer: %s', tar_file)
>  
>  
>  def untar_layers(layers_list, dest_dir, progress):
> @@ -162,11 +161,11 @@ def untar_layers(layers_list, dest_dir, progress):
>      """
>      nlayers = len(layers_list)
>      for index, layer in enumerate(layers_list):
> -        log_layer_extract(layer, index + 1, nlayers, progress)
> -        layer_file = layer[2]
> +        tar_file, tar_size = layer
> +        log_layer_extract(tar_file, tar_size, index + 1, nlayers, progress)
>  
>          # Extract layer tarball into destination directory
> -        safe_untar(layer_file, dest_dir)
> +        safe_untar(tar_file, dest_dir)
>  
>          # Update progress value
>          progress(value=(float(index + 1) / nlayers * 50) + 50)
> @@ -243,8 +242,8 @@ def extract_layers_in_qcow2(layers_list, dest_dir, progress):
>  
>      nlayers = len(layers_list)
>      for index, layer in enumerate(layers_list):
> -        log_layer_extract(layer, index + 1, nlayers, progress)
> -        tar_file = layer[2]
> +        tar_file, tar_size = layer
> +        log_layer_extract(tar_file, tar_size, index + 1, nlayers, progress)
>  
>          # Name format for the qcow2 image
>          qcow2_layer_file = "{}/layer-{}.qcow2".format(dest_dir, index)
> diff --git a/tests/docker_source.py b/tests/docker_source.py
> index cf2b2d2..ee294c1 100644
> --- a/tests/docker_source.py
> +++ b/tests/docker_source.py
> @@ -483,12 +483,14 @@ class TestDockerSource(unittest.TestCase):
>          }
>  
>          expected_result = [
> -            ['sha256', 'a7050fc1', '/images_path/a7050fc1.tar', None],
> -            ['sha256', 'c6ff40b6', '/images_path/c6ff40b6.tar', None],
> -            ['sha256', '75c416ea', '/images_path/75c416ea.tar', None]
> +            ['/images_path/a7050fc1.tar', None],
> +            ['/images_path/c6ff40b6.tar', None],
> +            ['/images_path/75c416ea.tar', None]
>          ]
>  
> -        src_instance = self._mock_retrieve_layers_info(manifest, kwargs)[0]
> +        with mock.patch('os.path.getsize') as m_getsize:
> +            m_getsize.return_value = None
> +            src_instance = self._mock_retrieve_layers_info(manifest, kwargs)[0]
>          self.assertEqual(src_instance.layers, expected_result)
>  
>      def test_retrieve_layers_info_schema_version_2(self):
> @@ -512,9 +514,9 @@ class TestDockerSource(unittest.TestCase):
>          }
>  
>          expected_result = [
> -            ['sha256', '75c416ea', '/images_path/75c416ea.tar', 47103294],
> -            ['sha256', 'c6ff40b6', '/images_path/c6ff40b6.tar', 814],
> -            ['sha256', 'a7050fc1', '/images_path/a7050fc1.tar', 513]
> +            ['/images_path/75c416ea.tar', 47103294],
> +            ['/images_path/c6ff40b6.tar', 814],
> +            ['/images_path/a7050fc1.tar', 513]
>          ]
>  
>          src_instance = self._mock_retrieve_layers_info(manifest, kwargs)[0]

Would be good to add the call to untar_layers() in the commit rather than have it
swamped in a future one.

ACK with this addition

--
Cedric




More information about the virt-tools-list mailing list