[virt-tools-list] [virt-bootstrap] [PATCH v2 03/14] Split 'sources' module into files

Cedric Bosdonnat cbosdonnat at suse.com
Tue Aug 1 13:14:17 UTC 2017


On Tue, 2017-08-01 at 12:28 +0100, Radostin Stoyanov wrote:
> Improve readability by spliting the 'sources' module into separate
> files. Each file contains only one class.
> 
> In addition update the mock statements in the unit tests to match these
> chages.

typo -> changes.

> 
> Add recursive-include in MANIFEST.in to include virtBootstrap.sources
> module.
> ---
>  MANIFEST.in                                        |  3 +-
>  src/virtBootstrap/sources/__init__.py              | 26 ++++++++
>  .../{sources.py => sources/docker_source.py}       | 53 +--------------
>  src/virtBootstrap/sources/file_source.py           | 78 ++++++++++++++++++++++
>  tests/test_docker_source.py                        | 12 ++--
>  5 files changed, 115 insertions(+), 57 deletions(-)
>  create mode 100644 src/virtBootstrap/sources/__init__.py
>  rename src/virtBootstrap/{sources.py => sources/docker_source.py} (85%)
>  create mode 100644 src/virtBootstrap/sources/file_source.py
> 
> diff --git a/MANIFEST.in b/MANIFEST.in
> index 7152b80..bd0eb08 100644
> --- a/MANIFEST.in
> +++ b/MANIFEST.in
> @@ -1 +1,2 @@
> -include README.md LICENSE
> \ No newline at end of file
> +include README.md LICENSE
> +recursive-include src *.py
> diff --git a/src/virtBootstrap/sources/__init__.py b/src/virtBootstrap/sources/__init__.py
> new file mode 100644
> index 0000000..e891e9b
> --- /dev/null
> +++ b/src/virtBootstrap/sources/__init__.py
> @@ -0,0 +1,26 @@
> +"""
> +sources - Class definitions which process container image or
> +          tarball to extract the root file system in destination
> +          directory or qcow2 image.
> +
> + Authors:
> +    Radostin Stoyanov <rstoyanov1 at gmail.com>
> +
> + Copyright (c) 2017 Radostin Stoyanov
> +
> +    This program is free software: you can redistribute it and/or modify
> +    it under the terms of the GNU General Public License as published by
> +    the Free Software Foundation, either version 3 of the License, or
> +    (at your option) any later version.
> +
> +    This program is distributed in the hope that it will be useful,
> +    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +    GNU General Public License for more details.
> +
> +    You should have received a copy of the GNU General Public License
> +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +"""
> +
> +from virtBootstrap.sources.file_source import FileSource
> +from virtBootstrap.sources.docker_source import DockerSource
> diff --git a/src/virtBootstrap/sources.py b/src/virtBootstrap/sources/docker_source.py
> similarity index 85%
> rename from src/virtBootstrap/sources.py
> rename to src/virtBootstrap/sources/docker_source.py
> index c44b2ed..1b5bc31 100644
> --- a/src/virtBootstrap/sources.py
> +++ b/src/virtBootstrap/sources/docker_source.py
> @@ -16,8 +16,9 @@
>  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>  
>  """
> -Class definitions which process container image or
> -archive from source and unpack them in destination directory.
> +DockerSource aim is to download container image from Docker registry and
> +extract the layers of root file system into destination directory or qcow2
> +image with backing chains.
>  """
>  
>  import select
> @@ -35,54 +36,6 @@ from virtBootstrap import utils
>  logger = logging.getLogger(__name__)
>  
>  
> -class FileSource(object):
> -    """
> -    Extract root filesystem from file.
> -    """
> -    def __init__(self, **kwargs):
> -        """
> -        Bootstrap root filesystem from tarball
> -
> -        @param uri: Path to tar archive file.
> -        @param fmt: Format used to store image [dir, qcow2]
> -        @param progress: Instance of the progress module
> -        """
> -        self.path = kwargs['uri'].path
> -        self.output_format = kwargs['fmt']
> -        self.progress = kwargs['progress'].update_progress
> -
> -    def unpack(self, dest):
> -        """
> -        Safely extract root filesystem from tarball
> -
> -        @param dest: Directory path where the files to be extraced
> -        """
> -
> -        if not os.path.isfile(self.path):
> -            raise Exception('Invalid file source "%s"' % self.path)
> -
> -        if self.output_format == 'dir':
> -            self.progress("Extracting files into destination directory",
> -                          value=0, logger=logger)
> -            utils.safe_untar(self.path, dest)
> -
> -        elif self.output_format == 'qcow2':
> -            # Remove the old path
> -            file_name = os.path.basename(self.path)
> -            qcow2_file = os.path.realpath('{}/{}.qcow2'.format(dest,
> -                                                               file_name))
> -
> -            self.progress("Extracting files into qcow2 image", value=0,
> -                          logger=logger)
> -            utils.create_qcow2(self.path, qcow2_file)
> -        else:
> -            raise Exception("Unknown format:" + self.output_format)
> -
> -        self.progress("Extraction completed successfully!", value=100,
> -                      logger=logger)
> -        logger.info("Files are stored in: " + dest)
> -
> -
>  class DockerSource(object):
>      """
>      Extract files from Docker image
> diff --git a/src/virtBootstrap/sources/file_source.py b/src/virtBootstrap/sources/file_source.py
> new file mode 100644
> index 0000000..f8cf6c4
> --- /dev/null
> +++ b/src/virtBootstrap/sources/file_source.py
> @@ -0,0 +1,78 @@
> +# Authors: Cedric Bosdonnat <cbosdonnat at suse.com>
> +#
> +# Copyright (C) 2017 SUSE, Inc.
> +#
> +# This program is free software: you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation, either version 3 of the License, or
> +# (at your option) any later version.
> +
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +"""
> +FileSource aim is to extract root filesystem from tar archive to destination
> +directory or qcow2 image.
> +"""
> +
> +import logging
> +import os
> +
> +from virtBootstrap import utils
> +
> +# pylint: disable=invalid-name
> +# Create logger
> +logger = logging.getLogger(__name__)
> +
> +
> +class FileSource(object):
> +    """
> +    Extract root filesystem from file.
> +    """
> +    def __init__(self, **kwargs):
> +        """
> +        Bootstrap root filesystem from tarball
> +
> +        @param uri: Path to tar archive file.
> +        @param fmt: Format used to store image [dir, qcow2]
> +        @param progress: Instance of the progress module
> +        """
> +        self.path = kwargs['uri'].path
> +        self.output_format = kwargs['fmt']
> +        self.progress = kwargs['progress'].update_progress
> +
> +    def unpack(self, dest):
> +        """
> +        Safely extract root filesystem from tarball
> +
> +        @param dest: Directory path where the files to be extraced
> +        """
> +
> +        if not os.path.isfile(self.path):
> +            raise Exception('Invalid file source "%s"' % self.path)
> +
> +        if self.output_format == 'dir':
> +            self.progress("Extracting files into destination directory",
> +                          value=0, logger=logger)
> +            utils.safe_untar(self.path, dest)
> +
> +        elif self.output_format == 'qcow2':
> +            # Remove the old path
> +            file_name = os.path.basename(self.path)
> +            qcow2_file = os.path.realpath('{}/{}.qcow2'.format(dest,
> +                                                               file_name))
> +
> +            self.progress("Extracting files into qcow2 image", value=0,
> +                          logger=logger)
> +            utils.create_qcow2(self.path, qcow2_file)
> +        else:
> +            raise Exception("Unknown format:" + self.output_format)
> +
> +        self.progress("Extraction completed successfully!", value=100,
> +                      logger=logger)
> +        logger.info("Files are stored in: " + dest)
> diff --git a/tests/test_docker_source.py b/tests/test_docker_source.py
> index 4d6d0c3..f0a676e 100644
> --- a/tests/test_docker_source.py
> +++ b/tests/test_docker_source.py
> @@ -104,14 +104,14 @@ class TestDockerSource(unittest.TestCase):
>          kwargs['username'] = 'test'
>  
>          with mock.patch('virtBootstrap.utils.get_image_dir'):
> -            with mock.patch('virtBootstrap.sources.getpass') as m_getpass:
> -                m_getpass.getpass.return_value = test_password
> +            with mock.patch('getpass.getpass') as m_getpass:
> +                m_getpass.return_value = test_password
>                  with mock.patch.multiple('virtBootstrap.sources.DockerSource',
>                                           retrieve_layers_info=mock.DEFAULT,
>                                           gen_valid_uri=mock.DEFAULT):
>                      src_instance = sources.DockerSource(**kwargs)
>  
> -        m_getpass.getpass.assert_called_once()
> +        m_getpass.assert_called_once()
>          self.assertIs(test_password, src_instance.password)
>  
>      ###################################
> @@ -372,7 +372,7 @@ class TestDockerSource(unittest.TestCase):
>          """
>          m_self = mock.Mock(spec=sources.DockerSource)
>          m_self.parse_output.return_value = parse_output_return
> -        with mock.patch.multiple('virtBootstrap.sources',
> +        with mock.patch.multiple('virtBootstrap.sources.docker_source',
>                                   Popen=mock.DEFAULT,
>                                   PIPE=mock.DEFAULT) as mocked:
>              with mock.patch('virtBootstrap.utils.make_async') as m_make_async:
> @@ -399,7 +399,7 @@ class TestDockerSource(unittest.TestCase):
>          Ensures that read_skopeo_progress() raise CalledProcessError
>          when parse_output() returns false.
>          """
> -        with self.assertRaises(sources.CalledProcessError):
> +        with self.assertRaises(sources.docker_source.CalledProcessError):
>              self._mock_read_skopeo_progress('test', False)
>  
>      ###################################
> @@ -584,7 +584,7 @@ class TestDockerSource(unittest.TestCase):
>          for fmt, patch_mthd in zip(output_formats, patch_methods):
>              m_self = self._mock_docker_source()
>              m_self.no_cache = True
> -            with mock.patch('virtBootstrap.sources.shutil.rmtree') as m_shutil:
> +            with mock.patch('shutil.rmtree') as m_shutil:
>                  self._unpack_test_fmt(fmt, patch_mthd, m_self=m_self)
>              m_shutil.assert_called_once_with(m_self.images_dir)
>  

ACK with the typo fixed.

--
Cedric




More information about the virt-tools-list mailing list