[PATCH 1/2] Revert "Restrict payload kernel versions to kernels in the payload (#1074358)"
David Shea
dshea at redhat.com
Wed Jan 21 22:58:33 UTC 2015
This reverts commit 850063aa6a19f87a6ffd6009e00f15c3418d1111.
This idea turned out to have some issues, such as not handling
kernel-core or kernel-debug packages.
---
pyanaconda/bootloader.py | 7 +-----
pyanaconda/packaging/__init__.py | 44 +++++++++++++++++++++++++++++--------
pyanaconda/packaging/dnfpayload.py | 7 ------
pyanaconda/packaging/livepayload.py | 34 ----------------------------
pyanaconda/packaging/tarpayload.py | 8 +++----
pyanaconda/packaging/yumpayload.py | 8 -------
6 files changed, 39 insertions(+), 69 deletions(-)
diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index b017265..ac9ac5c 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -27,7 +27,6 @@ import re
import struct
import blivet
from parted import PARTITION_BIOS_GRUB
-from glob import glob
from pyanaconda import iutil
from blivet.devicelibs import raid
@@ -2388,11 +2387,7 @@ def writeBootLoader(storage, payload, instClass, ksdata):
return
# get a list of installed kernel packages
- # add whatever rescue kernels we can find to the end
- kernel_versions = list(payload.kernelVersionList)
- kernel_versions += glob(iutil.getSysroot() + "/boot/vmlinuz-*-rescue-*")
- kernel_versions += glob(iutil.getSysroot() + "/boot/efi/EFI/%s/vmlinuz-*-rescue-*" % instClass.efi_dir)
-
+ kernel_versions = payload.kernelVersionList + payload.rescueKernelList
if not kernel_versions:
log.warning("no kernel was installed -- boot loader config unchanged")
return
diff --git a/pyanaconda/packaging/__init__.py b/pyanaconda/packaging/__init__.py
index 2438b6f..64985ac 100644
--- a/pyanaconda/packaging/__init__.py
+++ b/pyanaconda/packaging/__init__.py
@@ -72,15 +72,8 @@ from pyanaconda.product import productName, productVersion
import urlgrabber
urlgrabber.grabber.default_grabber.opts.user_agent = "%s (anaconda)/%s" %(productName, productVersion)
-from distutils.version import LooseVersion
-
REPO_NOT_SET = False
-def versionCmp(v1, v2):
- """ Compare two version number strings. """
-
- return LooseVersion(v1).__cmp__(LooseVersion(v2))
-
###
### ERROR HANDLING
###
@@ -135,6 +128,8 @@ class Payload(object):
self.data = data
self.storage = None
self.instclass = None
+ self._kernelVersionList = []
+ self._rescueVersionList = []
self.txID = None
def setup(self, storage, instClass):
@@ -307,6 +302,29 @@ class Payload(object):
self.data.packages.excludedGroupList.append(grp)
###
+ ### METHODS FOR WORKING WITH PACKAGES
+ ###
+ def _updateKernelVersionList(self):
+ try:
+ import yum
+ except ImportError:
+ cmpfunc = cmp
+ else:
+ cmpfunc = yum.rpmUtils.miscutils.compareVerOnly
+
+ files = glob(iutil.getSysroot() + "/boot/vmlinuz-*")
+ files.extend(glob(iutil.getSysroot() + "/boot/efi/EFI/%s/vmlinuz-*" % self.instclass.efi_dir))
+
+ versions = sorted((f.split("/")[-1][8:] for f in files if os.path.isfile(f)), 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
###
@property
@@ -316,8 +334,16 @@ class Payload(object):
@property
def kernelVersionList(self):
- """ An iterable of the kernel versions installed by the payload. """
- raise NotImplementedError()
+ if not self._kernelVersionList:
+ self._updateKernelVersionList()
+
+ return self._kernelVersionList[0]
+
+ @property
+ def rescueKernelList(self):
+ # do re-scan if looking for rescue kernel
+ self._updateKernelVersionList()
+ return self._kernelVersionList[1]
##
## METHODS FOR TREE VERIFICATION
diff --git a/pyanaconda/packaging/dnfpayload.py b/pyanaconda/packaging/dnfpayload.py
index 6cea430..0fd3ac3 100644
--- a/pyanaconda/packaging/dnfpayload.py
+++ b/pyanaconda/packaging/dnfpayload.py
@@ -820,10 +820,3 @@ class DNFPayload(packaging.PackagePayload):
log.error(e)
super(DNFPayload, self).postInstall()
-
- @property
- def kernelVersionList(self):
- return ('%s-%s.%s' % (p.version, p.release, p.arch) for p in
- sorted(self._base.sack.query().filter(name='kernel'),
- cmp=dnf.rpm.miscutils.compareEVR,
- key=lambda p: (p.epoch, p.version, p.release)))
diff --git a/pyanaconda/packaging/livepayload.py b/pyanaconda/packaging/livepayload.py
index 615bb61..17c1bac 100644
--- a/pyanaconda/packaging/livepayload.py
+++ b/pyanaconda/packaging/livepayload.py
@@ -56,7 +56,6 @@ from blivet.size import Size
import blivet.util
from pyanaconda.threads import threadMgr, AnacondaThread
from pyanaconda.i18n import _
-from pyanaconda.packaging import versionCmp
class LiveImagePayload(ImagePayload):
""" A LivePayload copies the source image onto the target system. """
@@ -68,8 +67,6 @@ class LiveImagePayload(ImagePayload):
self.pct_lock = None
self.source_size = 1
- self._kernelVersionList = []
-
def setup(self, storage, instClass):
super(LiveImagePayload, self).setup(storage, instClass)
@@ -83,9 +80,6 @@ class LiveImagePayload(ImagePayload):
if rc != 0:
raise PayloadInstallError("Failed to mount the install tree")
- # Grab the kernel version list now so it's available after umount
- self._updateKernelVersionList()
-
source = iutil.eintr_retry_call(os.statvfs, INSTALL_TREE)
self.source_size = source.f_frsize * (source.f_blocks - source.f_bfree)
@@ -186,17 +180,6 @@ class LiveImagePayload(ImagePayload):
def spaceRequired(self):
return Size(iutil.getDirSize("/")*1024)
- def _updateKernelVersionList(self):
- files = glob.glob(INSTALL_TREE + "/boot/vmlinuz-*")
- files.extend(glob.glob(INSTALL_TREE + "/boot/efi/EFI/%s/vmlinuz-*" % self.instclass.efi_dir))
-
- self._kernelVersionList = sorted((f.split("/")[-1][8:] for f in files
- if os.path.isfile(f) and "-rescue-" not in f), cmp=versionCmp)
-
- @property
- def kernelVersionList(self):
- return self._kernelVersionList
-
class URLGrabberProgress(object):
""" Provide methods for urlgrabber progress."""
def start(self, filename, url, basename, size, text):
@@ -405,7 +388,6 @@ class LiveImageKSPayload(LiveImagePayload):
# Nothing more to mount
if not os.path.exists(INSTALL_TREE+"/LiveOS"):
- self._updateKernelVersionList()
return
# Mount the first .img in the directory on INSTALL_TREE
@@ -433,8 +415,6 @@ class LiveImageKSPayload(LiveImagePayload):
if errorHandler.cb(exn) == ERROR_RAISE:
raise exn
- self._updateKernelVersionList()
-
source = iutil.eintr_retry_call(os.statvfs, INSTALL_TREE)
self.source_size = source.f_frsize * (source.f_blocks - source.f_bfree)
@@ -513,17 +493,3 @@ class LiveImageKSPayload(LiveImagePayload):
return Size(self._min_size)
else:
return Size(1024*1024*1024)
-
- @property
- def kernelVersionList(self):
- # If it doesn't look like a tarfile use the super's kernelVersionList
- if not self.is_tarfile:
- return super(LiveImageKSPayload, self).kernelVersionList
-
- import tarfile
- with tarfile.open(self.image_path) as archive:
- names = archive.getnames()
-
- # Strip out vmlinuz- from the names
- return sorted((n.split("/")[-1][8:] for n in names if "boot/vmlinuz-" in n),
- cmp=versionCmp)
diff --git a/pyanaconda/packaging/tarpayload.py b/pyanaconda/packaging/tarpayload.py
index 805515d..b6328e0 100644
--- a/pyanaconda/packaging/tarpayload.py
+++ b/pyanaconda/packaging/tarpayload.py
@@ -36,7 +36,7 @@ except ImportError:
log.error("import of tarfile failed")
tarfile = None
-from pyanaconda.packaging import ArchivePayload, PayloadError, versionCmp
+from pyanaconda.packaging import ArchivePayload, PayloadError
from pyanaconda import iutil
# TarPayload is not yet fully implemented
@@ -73,10 +73,8 @@ class TarPayload(ArchivePayload):
@property
def kernelVersionList(self):
names = self.archive.getnames()
-
- # Strip out vmlinuz- from the names
- return sorted((n.split("/")[-1][8:] for n in names if "boot/vmlinuz-" in n),
- cmp=versionCmp)
+ kernels = [n for n in names if "boot/vmlinuz-" in n]
+ return kernels
def install(self):
try:
diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 73caa49..742edad 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -988,14 +988,6 @@ reposdir=%s
else:
return environment.groups
- @property
- def kernelVersionList(self):
- with _yum_lock:
- return ("%s-%s.%s" % (p.version, p.release, p.arch) for p in
- sorted(self._yum.pkgSack.searchNames(['kernel']),
- cmp=yum.rpmUtils.miscutils.compareEVR,
- key=lambda p: (p.epoch, p.version, p.release)))
-
###
### METHODS FOR WORKING WITH GROUPS
###
--
2.1.0
More information about the anaconda-patches
mailing list