[PATCH] Add support for doing a liveimg kickstart with local file (#1140358)

Brian C. Lane bcl at redhat.com
Tue Nov 4 22:15:49 UTC 2014


When using a local file as the disk image it doesn't need to be
downloaded. Use it directly and decrease the amount of estimated space
for the installation.

eg. liveimg --url=file:///run/install/repo/disk.img

--- Thanks for the patch Gene, give this one a try. It uses the file in place
--- but uses mostly the same code paths as the network case.
---
 pyanaconda/packaging/livepayload.py | 67 +++++++++++++++++++++++++++----------
 1 file changed, 49 insertions(+), 18 deletions(-)

diff --git a/pyanaconda/packaging/livepayload.py b/pyanaconda/packaging/livepayload.py
index d6db00b..c660ef6 100644
--- a/pyanaconda/packaging/livepayload.py
+++ b/pyanaconda/packaging/livepayload.py
@@ -233,12 +233,10 @@ class LiveImageKSPayload(LiveImagePayload):
         """ Return True if the url ends with a tar suffix """
         return any(self.data.method.url.endswith(suffix) for suffix in TAR_SUFFIX)
 
-    def setup(self, storage, instClass):
-        """ Check the availability and size of the image.
+    def _setup_url_image(self):
+        """ Check to make sure the url is available and estimate the space
+            needed to download and install it.
         """
-        # This is on purpose, we don't want to call LiveImagePayload's setup method.
-        ImagePayload.setup(self, storage, instClass)
-
         self._proxies = {}
         if self.data.method.proxy:
             try:
@@ -252,6 +250,12 @@ class LiveImageKSPayload(LiveImagePayload):
         error = None
         try:
             req = urllib.urlopen(self.data.method.url, proxies=self._proxies)
+
+            # At this point we know we can get the image and what its size is
+            # Make a guess as to minimum size needed:
+            # Enough space for image and image * 3
+            if req.info().get("content-length"):
+                self._min_size = int(req.info().get("content-length")) * 4
         except IOError as e:
             log.error("Error opening liveimg: %s", e)
             error = e
@@ -261,26 +265,38 @@ class LiveImageKSPayload(LiveImagePayload):
             if method.startswith("http") and req.getcode() != 200:
                 error = "http request returned %s" % req.getcode()
 
+        return error
+
+    def _setup_file_image(self):
+        """ Check to make sure the file is available and estimate the space
+            needed to install it.
+        """
+        if not os.path.exists(self.data.method.url[7:]):
+            return "file does not exist: %s" % self.data.method.url
+
+        self._min_size = os.stat(self.data.method.url[7:])[stat.ST_SIZE] * 3
+        return None
+
+    def setup(self, storage, instClass):
+        """ Check the availability and size of the image.
+        """
+        # This is on purpose, we don't want to call LiveImagePayload's setup method.
+        ImagePayload.setup(self, storage, instClass)
+
+        if self.data.method.url.startswith("file://"):
+            error = self._setup_file_image()
+        else:
+            error = self._setup_url_image()
+
         if error:
             exn = PayloadInstallError(str(error))
             if errorHandler.cb(exn) == ERROR_RAISE:
                 raise exn
 
-        # At this point we know we can get the image and what its size is
-        # Make a guess as to minimum size needed:
-        # Enough space for image and image * 3
-        if req.info().get("content-length"):
-            self._min_size = int(req.info().get("content-length")) * 4
-
         log.debug("liveimg size is %s", self._min_size)
 
-    def preInstall(self, *args, **kwargs):
-        """ Download image and loopback mount it.
-
-            This is called after partitioning is setup, we now have space
-            to grab the image. Download it to sysroot and provide feedback
-            during the download (using urlgrabber callback).
-        """
+    def _preInstall_url_image(self):
+        """ Download the image using urlgrabber """
         # Setup urlgrabber and call back to download image to sysroot
         progress = URLGrabberProgress()
         ugopts = {"ssl_verify_peer": not self.data.method.noverifyssl,
@@ -301,6 +317,21 @@ class LiveImageKSPayload(LiveImagePayload):
                 error = "Failed to download %s, file doesn't exist" % self.data.method.url
                 log.error(error)
 
+    def preInstall(self, *args, **kwargs):
+        """ Get image and loopback mount it.
+
+            This is called after partitioning is setup, we now have space to
+            grab the image. If it is a network source Download it to sysroot
+            and provide feedback during the download (using urlgrabber
+            callback).
+
+            If it is a file:// source then use the file directly.
+        """
+        if self.data.method.url.startswith("file://"):
+            self.image_path = self.data.method.url[7:]
+        else:
+            error = self._preInstall_url_image()
+
         if error:
             exn = PayloadInstallError(str(error))
             if errorHandler.cb(exn) == ERROR_RAISE:
-- 
1.9.3



More information about the anaconda-patches mailing list