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@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) > ACK with the typo fixed. -- Cedric _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list