[virt-tools-list] [virt-bootstrap] [PATCH v4 06/26] Split 'sources' module into files

Radostin Stoyanov rstoyanov1 at gmail.com
Thu Aug 3 13:13:04 UTC 2017


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
changes.

Add recursive-include in MANIFEST.in to include virtBootstrap.sources
module.

Update the unit tests to match these changes.
---
 MANIFEST.in                                        |  3 +-
 src/virtBootstrap/sources/__init__.py              | 26 +++++++
 .../{sources.py => sources/docker_source.py}       | 53 +--------------
 src/virtBootstrap/sources/file_source.py           | 79 ++++++++++++++++++++++
 tests/test_docker_source.py                        | 14 ++--
 5 files changed, 118 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 40b66f9..54d8903 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.get('fmt', utils.DEFAULT_OUTPUT_FORMAT)
-        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..c02f735
--- /dev/null
+++ b/src/virtBootstrap/sources/file_source.py
@@ -0,0 +1,79 @@
+# 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 os
+import logging
+
+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.get('fmt', utils.DEFAULT_OUTPUT_FORMAT)
+        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 4c52173..4859e1b 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)
 
     ###################################
@@ -375,7 +375,8 @@ 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.subprocess',
+        with mock.patch.multiple('virtBootstrap.sources.'
+                                 'docker_source.subprocess',
                                  Popen=mock.DEFAULT,
                                  PIPE=mock.DEFAULT) as mocked:
             with mock.patch('virtBootstrap.utils.make_async') as m_make_async:
@@ -402,7 +403,8 @@ class TestDockerSource(unittest.TestCase):
         Ensures that read_skopeo_progress() raise CalledProcessError
         when parse_output() returns false.
         """
-        with self.assertRaises(sources.subprocess.CalledProcessError):
+        with self.assertRaises(sources.docker_source
+                               .subprocess.CalledProcessError):
             self._mock_read_skopeo_progress('test', False)
 
     ###################################
@@ -587,7 +589,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




More information about the virt-tools-list mailing list