[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