[rhel7/master] Fix installing from a second iso (#1040722)

Brian C. Lane bcl at redhat.com
Wed Aug 27 00:15:42 UTC 2014


This fixes handling of the source from a second iso. eg. boot from a
boot.iso with a DVD iso in a second drive.

MOUNT_DIR has been changed from /mnt/install to /run/install so that the
mount path will match /proc/mounts. Mounting via a symlink shows up as
the real path, not the symlink.

This was causing it to use util.unmount to teardown the install_device
instead of the device's teardown method, leaving it in a state where it
could later raise an error if the teardown method was used.

This splits out parts of the YumPayload reset method and streamlines the
setup of the source so that it unmounts the previous source, then sets
up the new one, gets releasever and resets the yum object without the
previous hack of having to call _setupInstallDevice twice.

Resolves: rhbz#1040722
---
 pyanaconda/constants.py            |  2 +-
 pyanaconda/packaging/yumpayload.py | 33 +++++++++++++++++++--------------
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
index a16a79d..2c8ca11 100644
--- a/pyanaconda/constants.py
+++ b/pyanaconda/constants.py
@@ -66,7 +66,7 @@ ANACONDA_CLEANUP = "anaconda-cleanup"
 # This is a legacy variable; new code should use iutil.getSysroot()
 # or iutil.getTargetPhysicalRoot().
 ROOT_PATH = os.environ.get("ANACONDA_ROOT_PATH", "/mnt/sysimage")
-MOUNT_DIR = "/mnt/install"
+MOUNT_DIR = "/run/install"
 DRACUT_REPODIR = "/run/install/repo"
 DRACUT_ISODIR = "/run/install/source"
 ISO_DIR = MOUNT_DIR + "/isodir"
diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 5ba121a..935432f 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -78,7 +78,7 @@ from blivet.size import Size
 import blivet.util
 import blivet.arch
 
-from pyanaconda.image import opticalInstallMedia
+from pyanaconda.image import opticalInstallMedia, verifyMedia
 from pyanaconda.image import mountImage
 from pyanaconda.image import findFirstIsoImage
 
@@ -149,14 +149,15 @@ class YumPayload(PackagePayload):
 
         self.txID = None
 
+        self._groups = None
+        self._packages = []
         self._requiredPackages = []
         self._requiredGroups = []
 
         self.reset()
 
-    def reset(self, root=None, releasever=None):
-        """ Reset this instance to its initial (unconfigured) state. """
-
+    def _reset_install_device(self):
+        """ Unmount the previous base repo and reset the install_device """
         # cdrom: install_device.teardown (INSTALL_TREE)
         # hd: umount INSTALL_TREE, install_device.teardown (ISO_DIR)
         # nfs: umount INSTALL_TREE
@@ -183,14 +184,15 @@ class YumPayload(PackagePayload):
 
         self.install_device = None
 
+    def reset(self, root=None, releasever=None):
+        """ Reset this instance to its initial (unconfigured) state. """
+        self._reset_install_device()
+
         # This value comes from a default install of the x86_64 Fedora 18.  It
         # is meant as a best first guess only.  Once package metadata is
         # available we can use that as a better value.
         self._space_required = Size(spec="3000 MB")
 
-        self._groups = None
-        self._packages = []
-
         self._resetYum(root=root, releasever=releasever)
 
     def setup(self, storage):
@@ -204,6 +206,9 @@ class YumPayload(PackagePayload):
 
             Setup _yum.preconf -- DO NOT TOUCH IT OUTSIDE THIS METHOD
         """
+        self._groups = None
+        self._packages = []
+
         if root is None:
             root = self._root_dir
 
@@ -477,6 +482,7 @@ reposdir=%s
         """
         log.info("configuring base repo")
 
+        self._reset_install_device()
         try:
             url, mirrorlist, sslverify = self._setupInstallDevice(self.storage, checkmount)
         except PayloadSetupError:
@@ -493,12 +499,9 @@ reposdir=%s
                           method.method, e)
 
         # start with a fresh YumBase instance & tear down old install device
-        self.reset(root=root, releasever=releasever)
+        self._resetYum(root=root, releasever=releasever)
         self._yumCacheDirHack()
 
-        # This needs to be done again, reset tore it down.
-        url, mirrorlist, sslverify = self._setupInstallDevice(self.storage, checkmount)
-
         # If this is a kickstart install and no method has been set up, or
         # askmethod was given on the command line, we don't want to do
         # anything.  Just disable all repos and return.  This should avoid
@@ -785,6 +788,11 @@ reposdir=%s
         elif method.method == "cdrom" or (checkmount and not method.method):
             # Did dracut leave the DVD or NFS mounted for us?
             device = blivet.util.get_mount_device(DRACUT_REPODIR)
+
+            # Check for valid optical media if we didn't boot from one
+            if not verifyMedia(DRACUT_REPODIR):
+                self.install_device = opticalInstallMedia(storage.devicetree)
+
             # Only look at the dracut mount if we don't already have a cdrom
             if device and not self.install_device:
                 self.install_device = storage.devicetree.getDeviceByPath(device)
@@ -802,9 +810,6 @@ reposdir=%s
                     else:
                         method.method = "cdrom"
             else:
-                # cdrom or no method specified -- check for media
-                if not self.install_device:
-                    self.install_device = opticalInstallMedia(storage.devicetree)
                 if self.install_device:
                     if not method.method:
                         method.method = "cdrom"
-- 
1.9.3



More information about the anaconda-patches mailing list