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. 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@xxxxxxxxx> + + 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@xxxxxxxx> +# +# 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) -- 2.13.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list