[PATCH 1/2] Add rescue kernels to the bootloader install list. (#1036349)

David Shea dshea at redhat.com
Mon Mar 10 20:58:44 UTC 2014


This adds a new property, rescueKernelList, to Payload.
kernelVersionList is unchanged, since most other places that use it
excluded rescue kernels for a reason.

Every bootloader but grub2 generates a config based on the list of
kernels provided by the Payload object, so every bootloader but grub2
was skipping the rescue kernels. This remedies that.
---
 pyanaconda/bootloader.py         |  2 +-
 pyanaconda/packaging/__init__.py | 48 ++++++++++++++++++++++++++--------------
 2 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index 0ea7984..8386b57 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -2343,7 +2343,7 @@ def writeBootLoader(storage, payload, instClass, ksdata):
         log.info("bootloader stage2 target device is %s", stage2_device.name)
 
     # get a list of installed kernel packages
-    kernel_versions = payload.kernelVersionList
+    kernel_versions = payload.kernelVersionList + payload.rescueKernelList
     if not kernel_versions:
         log.warning("no kernel was installed -- bootloader config unchanged")
         return
diff --git a/pyanaconda/packaging/__init__.py b/pyanaconda/packaging/__init__.py
index c85bbd1..7058672 100644
--- a/pyanaconda/packaging/__init__.py
+++ b/pyanaconda/packaging/__init__.py
@@ -113,6 +113,7 @@ class Payload(object):
         self.data = data
         self.storage = None
         self._kernelVersionList = []
+        self._rescueVersionList = []
         self._createdInitrds = False
         self.txID = None
 
@@ -318,6 +319,28 @@ class Payload(object):
 
         self.data.packages.excludedList.append(pkgid)
 
+    def _updateKernelVersionList(self):
+        import glob
+        try:
+            import yum
+        except ImportError:
+            cmpfunc = cmp
+        else:
+            cmpfunc = yum.rpmUtils.miscutils.compareVerOnly
+
+        files = glob.glob(ROOT_PATH + "/boot/vmlinuz-*")
+        files.extend(glob.glob(ROOT_PATH + "/boot/efi/EFI/redhat/vmlinuz-*"))
+
+        versions = [f.split("/")[-1][8:] for f in files if os.path.isfile(f)]
+        versions.sort(cmp=cmpfunc)
+        log.debug("kernel versions: %s", versions)
+
+        # Store regular and rescue kernels separately
+        self._kernelVersionList = (
+                [v for v in versions if "-rescue-" not in v],
+                [v for v in versions if "-rescue" in v]
+                )
+
     ###
     ### METHODS FOR QUERYING STATE
     ###
@@ -329,25 +352,16 @@ class Payload(object):
     @property
     def kernelVersionList(self):
         if not self._kernelVersionList:
-            import glob
-            try:
-                import yum
-            except ImportError:
-                cmpfunc = cmp
-            else:
-                cmpfunc = yum.rpmUtils.miscutils.compareVerOnly
+            self._updateKernelVersionList()
 
-            files = glob.glob(ROOT_PATH + "/boot/vmlinuz-*")
-            files.extend(glob.glob(ROOT_PATH + "/boot/efi/EFI/redhat/vmlinuz-*"))
-            # strip off everything up to and including vmlinuz- to get versions
-            # Ignore rescue kernels
-            versions = [f.split("/")[-1][8:] for f in files if os.path.isfile(f) \
-                        and "-rescue-" not in f]
-            versions.sort(cmp=cmpfunc)
-            log.debug("kernel versions: %s", versions)
-            self._kernelVersionList = versions
+        return self._kernelVersionList[0]
 
-        return self._kernelVersionList
+    @property
+    def rescueKernelList(self):
+        if not self._kernelVersionList:
+            self._updateKernelVersionList()
+
+        return self._kernelVersionList[1]
 
     ##
     ## METHODS FOR TREE VERIFICATION
-- 
1.8.5.3



More information about the anaconda-patches mailing list