[PATCH][f21] Fix handling of md fwraid names in kickstart bootloader command. (#1156354)

David Lehman dlehman at redhat.com
Fri Oct 24 21:33:30 UTC 2014


udev.resolve_devspec cannot resolve md names.
blivet.DeviceTree.resolveDevice can.
---
 pyanaconda/kickstart.py | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index 39f5086..f75c530 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -171,14 +171,31 @@ def getEscrowCertificate(escrowCerts, url):
 
     return escrowCerts[url]
 
-def deviceMatches(spec):
+def deviceMatches(spec, devicetree=None):
+    """ Return names of block devices matching the provided specification.
+
+        :param str spec: a device identifier (name, UUID=<uuid>, &c)
+        :keyword devicetree: device tree to look up devices in (optional)
+        :type devicetree: :class:`blivet.DeviceTree`
+
+        parse methods will not have access to a devicetree, while execute
+        methods will. The devicetree is superior in that it can resolve md
+        array names and in that it reflects scheduled device removals, but for
+        normal local disks udev.resolve_devspec should suffice.
+    """
     full_spec = spec
     if not full_spec.startswith("/dev/"):
         full_spec = os.path.normpath("/dev/" + full_spec)
 
     # the regular case
     matches = udev.resolve_glob(full_spec)
-    dev = udev.resolve_devspec(full_spec)
+
+    if devicetree is None:
+        dev = udev.resolve_devspec(spec)
+    else:
+        # using spec here intentionally instead of full_spec
+        dev = getattr(devicetree.resolveDevice(spec), "name", None)
+
     # udev.resolve_devspec returns None if there's no match, but we don't
     # want that ending up in the list.
     if dev and dev not in matches:
@@ -366,7 +383,7 @@ class Bootloader(commands.bootloader.F21_Bootloader):
         diskSet = set(disk_names)
 
         for drive in self.driveorder[:]:
-            matches = set(deviceMatches(drive))
+            matches = set(deviceMatches(drive, devicetree=storage.devicetree))
             if matches.isdisjoint(diskSet):
                 log.warning("requested drive %s in boot drive order doesn't exist or cannot be used", drive)
                 self.driveorder.remove(drive)
@@ -374,7 +391,8 @@ class Bootloader(commands.bootloader.F21_Bootloader):
         storage.bootloader.disk_order = self.driveorder
 
         if self.bootDrive:
-            matches = set(deviceMatches(self.bootDrive))
+            matches = set(deviceMatches(self.bootDrive,
+                                        devicetree=storage.devicetree))
             if len(matches) > 1:
                 raise KickstartValueError(formatErrorMsg(self.lineno,
                         msg=_("More than one match found for given boot drive \"%s\".") % self.bootDrive))
-- 
1.9.3



More information about the anaconda-patches mailing list