[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