[PATCH python-blivet rhel7-branch] Split ROOT_PATH usage into getTargetPhysicalRoot()/getSysroot()

Vratislav Podzimek vpodzime at redhat.com
Mon Jul 14 13:38:13 UTC 2014


On Mon, 2014-07-14 at 13:36 +0200, Radek Vykydal wrote:
> From: Colin Walters <walters at verbum.org>
> 
> This mirrors the change to Anaconda, in order to enable OSTree
> support.
> 
> For OSTree, the location of the OS checkout (and e.g. /etc/fstab) is
> really in /ostree/deploy/$osname/deploy/$revision/etc/fstab.
> 
> In order to properly support OSTree, Blivet will need to gain an
> understanding of the separation between the physical system / and the
> target root.
> 
> This patch will be used in Anaconda, which will call setSysroot()
> attribute after the root being installed is laid out.
> 
> After that, when we call write(), the fstab data will be correctly
> written into the target root.
> 
> Related: rhbz#1113535
> Port of rpmostreepayload patches from master
> commit 5b39c90ae582a8fb008c3633954a33b58394802c
> ---
>  blivet/__init__.py        | 102 +++++++++++++++++++++++++++++++++-------------
>  blivet/devicelibs/dasd.py |   4 +-
>  blivet/fcoe.py            |   8 ++--
>  blivet/iscsi.py           |  14 +++----
>  blivet/util.py            |   4 +-
>  blivet/zfcp.py            |   8 ++--
>  6 files changed, 92 insertions(+), 48 deletions(-)
> 
> diff --git a/blivet/__init__.py b/blivet/__init__.py
> index 85b67da..6b127d7 100644
> --- a/blivet/__init__.py
> +++ b/blivet/__init__.py
> @@ -30,7 +30,10 @@ __version__ = '0.18.34'
>  ## enable_installer_mode is called.
>  ##
>  isys = None
> +iutil = None
>  ROOT_PATH = '/'
> +_storageRoot = ROOT_PATH
> +_sysroot = ROOT_PATH
>  shortProductName = 'blivet'
>  productName = 'blivet'
>  bootLoaderError = Exception
> @@ -99,7 +102,10 @@ log = logging.getLogger("blivet")
>  
>  def enable_installer_mode():
>      global isys
> +    global iutil
>      global ROOT_PATH
> +    global _storageRoot
> +    global _sysroot
>      global shortProductName
>      global productName
>      global get_bootloader
> @@ -108,6 +114,7 @@ def enable_installer_mode():
>      global ERROR_RAISE
>  
>      from pyanaconda import isys
> +    from pyanaconda import iutil
>      from pyanaconda.constants import ROOT_PATH
>      from pyanaconda.constants import shortProductName
>      from pyanaconda.constants import productName
> @@ -116,11 +123,48 @@ def enable_installer_mode():
>      from pyanaconda.errors import errorHandler
>      from pyanaconda.errors import ERROR_RAISE
>  
> +    if hasattr(iutil, 'getTargetPhysicalRoot'):
> +        # Introduced in newer Anaconda
> +        _storageRoot = iutil.getTargetPhysicalRoot()
> +        _sysroot = iutil.getSysroot()
> +    else:
> +        _storageRoot = _sysroot = ROOT_PATH
> +
>      from pyanaconda.anaconda_log import program_log_lock
>      util.program_log_lock = program_log_lock
>  
>      flags.installer_mode = True
>  
> +def getSysroot():
> +    """Returns the path to the target OS installation.
> +
> +    For traditional installations, this is the same as the physical
> +    storage root.
> +    """
> +    return _sysroot
> +
> +def getTargetPhysicalRoot():
> +    """Returns the path to the "physical" storage root.
> +
> +    This may be distinct from the sysroot, which could be a
> +    chroot-type subdirectory of the physical root.  This is used for
> +    example by all OSTree-based installations.
> +    """
> +    return _storageRoot
> +
> +def setSysroot(storageRoot, sysroot=None):
> +    """Change the OS root path.
> +       :param storageRoot: The root of physical storage
> +       :param sysroot: An optional chroot subdirectory of storageRoot
> +
> +    Change the
Some leftover ^^^?

> +    """
> +    global _storageRoot
> +    global _sysroot
> +    _storageRoot = _sysroot = storageRoot
> +    if sysroot is not None:
> +        _sysroot = sysroot
> +
>  def storageInitialize(storage, ksdata, protected):
>      """ Perform installer-specific storage initialization. """
>      from pyanaconda.flags import flags as anaconda_flags
> @@ -202,7 +246,7 @@ def writeEscrowPackets(storage):
>      backupPassphrase = generateBackupPassphrase()
>  
>      try:
> -        escrowDir = ROOT_PATH + "/root"
> +        escrowDir = _sysroot + "/root"
>          log.debug("escrow: writing escrow packets to %s", escrowDir)
>          util.makedirs(escrowDir)
>          for device in escrowDevices:
> @@ -1665,22 +1709,22 @@ class Blivet(object):
>          return list(pkgs)
>  
>      def write(self):
> -        if not os.path.isdir("%s/etc" % ROOT_PATH):
> -            os.mkdir("%s/etc" % ROOT_PATH)
> +        if not os.path.isdir("%s/etc" % _sysroot):
> +            os.mkdir("%s/etc" % _sysroot)
>  
>          self.fsset.write()
>          self.makeMtab()
> -        self.iscsi.write(ROOT_PATH, self)
> -        self.fcoe.write(ROOT_PATH)
> -        self.zfcp.write(ROOT_PATH)
> -        write_dasd_conf(self.dasd, ROOT_PATH)
> +        self.iscsi.write(_sysroot, self)
> +        self.fcoe.write(_sysroot)
> +        self.zfcp.write(_sysroot)
> +        write_dasd_conf(self.dasd, _sysroot)
>  
>      def turnOnSwap(self, upgrading=None):
> -        self.fsset.turnOnSwap(rootPath=ROOT_PATH,
> +        self.fsset.turnOnSwap(rootPath=_sysroot,
>                                upgrading=upgrading)
>  
>      def mountFilesystems(self, raiseErrors=None, readOnly=None, skipRoot=False):
> -        self.fsset.mountFilesystems(rootPath=ROOT_PATH,
> +        self.fsset.mountFilesystems(rootPath=_sysroot,
>                                      raiseErrors=raiseErrors,
>                                      readOnly=readOnly, skipRoot=skipRoot)
>  
> @@ -1797,7 +1841,7 @@ class Blivet(object):
>      def makeMtab(self):
>          path = "/etc/mtab"
>          target = "/proc/self/mounts"
> -        path = os.path.normpath("%s/%s" % (ROOT_PATH, path))
> +        path = os.path.normpath("%s/%s" % (_sysroot, path))
>  
>          if os.path.islink(path):
>              # return early if the mtab symlink is already how we like it
> @@ -2130,7 +2174,7 @@ def mountExistingSystem(fsset, rootDevice,
>                          allowDirty=None, dirtyCB=None,
>                          readOnly=None):
>      """ Mount filesystems specified in rootDevice's /etc/fstab file. """
> -    rootPath = ROOT_PATH
> +    rootPath = _sysroot
>      if dirtyCB is None:
>          dirtyCB = lambda l: False
>  
> @@ -2172,7 +2216,7 @@ def mountExistingSystem(fsset, rootDevice,
>      if dirtyDevs and (not allowDirty or dirtyCB(dirtyDevs)):
>          raise DirtyFSError("\n".join(dirtyDevs))
>  
> -    fsset.mountFilesystems(rootPath=ROOT_PATH, readOnly=readOnly, skipRoot=True)
> +    fsset.mountFilesystems(rootPath=_sysroot, readOnly=readOnly, skipRoot=True)
>  
> 
>  class BlkidTab(object):
> @@ -2529,7 +2573,7 @@ class FSSet(object):
>                  loop mounts?
>          """
>          if not chroot or not os.path.isdir(chroot):
> -            chroot = ROOT_PATH
> +            chroot = _sysroot
>  
>          path = "%s/etc/fstab" % chroot
>          if not os.access(path, os.R_OK):
> @@ -2703,10 +2747,10 @@ class FSSet(object):
>          self.active = False
>  
>      def createSwapFile(self, device, size):
> -        """ Create and activate a swap file under ROOT_PATH. """
> +        """ Create and activate a swap file under storage root. """
>          filename = "/SWAP"
>          count = 0
> -        basedir = os.path.normpath("%s/%s" % (ROOT_PATH,
> +        basedir = os.path.normpath("%s/%s" % (getTargetPhysicalRoot(),
>                                                device.format.mountpoint))
>          while os.path.exists("%s/%s" % (basedir, filename)) or \
>                self.devicetree.getDeviceByName(filename):
> @@ -2727,10 +2771,10 @@ class FSSet(object):
>  
>      def mkDevRoot(self):
>          root = self.rootDevice
> -        dev = "%s/%s" % (ROOT_PATH, root.path)
> -        if not os.path.exists("%s/dev/root" %(ROOT_PATH,)) and os.path.exists(dev):
> +        dev = "%s/%s" % (_sysroot, root.path)
> +        if not os.path.exists("%s/dev/root" %(_sysroot,)) and os.path.exists(dev):
>              rdev = os.stat(dev).st_rdev
> -            os.mknod("%s/dev/root" % (ROOT_PATH,), stat.S_IFBLK | 0600, rdev)
> +            os.mknod("%s/dev/root" % (_sysroot,), stat.S_IFBLK | 0600, rdev)
>  
>      @property
>      def swapDevices(self):
> @@ -2742,7 +2786,7 @@ class FSSet(object):
>  
>      @property
>      def rootDevice(self):
> -        for path in ["/", ROOT_PATH]:
> +        for path in ["/", getTargetPhysicalRoot()]:
>              for device in self.devices:
>                  try:
>                      mountpoint = device.format.mountpoint
> @@ -2755,19 +2799,19 @@ class FSSet(object):
>      def write(self):
>          """ write out all config files based on the set of filesystems """
>          # /etc/fstab
> -        fstab_path = os.path.normpath("%s/etc/fstab" % ROOT_PATH)
> +        fstab_path = os.path.normpath("%s/etc/fstab" % _sysroot)
>          fstab = self.fstab()
>          open(fstab_path, "w").write(fstab)
>  
>          # /etc/crypttab
> -        crypttab_path = os.path.normpath("%s/etc/crypttab" % ROOT_PATH)
> +        crypttab_path = os.path.normpath("%s/etc/crypttab" % _sysroot)
>          crypttab = self.crypttab()
>          origmask = os.umask(0077)
>          open(crypttab_path, "w").write(crypttab)
>          os.umask(origmask)
>  
>          # /etc/mdadm.conf
> -        mdadm_path = os.path.normpath("%s/etc/mdadm.conf" % ROOT_PATH)
> +        mdadm_path = os.path.normpath("%s/etc/mdadm.conf" % _sysroot)
>          mdadm_conf = self.mdadmConf()
>          if mdadm_conf:
>              open(mdadm_path, "w").write(mdadm_conf)
> @@ -2900,11 +2944,11 @@ def getReleaseString():
>      relVer = None
>  
>      try:
> -        relArch = util.capture_output(["arch"], root=ROOT_PATH).strip()
> +        relArch = util.capture_output(["arch"], root=_sysroot).strip()
>      except:
>          relArch = None
>  
> -    filename = "%s/etc/redhat-release" % ROOT_PATH
> +    filename = "%s/etc/redhat-release" % getSysroot()
>      if os.access(filename, os.R_OK):
>          with open(filename) as f:
>              try:
> @@ -2923,8 +2967,8 @@ def getReleaseString():
>      return (relArch, relName, relVer)
>  
>  def findExistingInstallations(devicetree):
> -    if not os.path.exists(ROOT_PATH):
> -        util.makedirs(ROOT_PATH)
> +    if not os.path.exists(getTargetPhysicalRoot()):
> +        util.makedirs(getTargetPhysicalRoot())
>  
>      roots = []
>      for device in devicetree.leaves:
> @@ -2940,7 +2984,7 @@ def findExistingInstallations(devicetree):
>  
>          options = device.format.options + ",ro"
>          try:
> -            device.format.mount(options=options, mountpoint=ROOT_PATH)
> +            device.format.mount(options=options, mountpoint=getSysroot())
>          except Exception as e:
>              log.warning("mount of %s as %s failed: %s" % (device.name,
>                                                            device.format.type,
> @@ -2948,7 +2992,7 @@ def findExistingInstallations(devicetree):
>              device.teardown()
>              continue
>  
> -        if not os.access(ROOT_PATH + "/etc/fstab", os.R_OK):
> +        if not os.access(getSysroot() + "/etc/fstab", os.R_OK):
>              device.teardown(recursive=True)
>              continue
>  
> @@ -3000,7 +3044,7 @@ class Root(object):
>  def parseFSTab(devicetree, chroot=None):
>      """ parse /etc/fstab and return a tuple of a mount dict and swap list """
>      if not chroot or not os.path.isdir(chroot):
> -        chroot = ROOT_PATH
> +        chroot = _sysroot
>  
>      mounts = {}
>      swaps = []
> diff --git a/blivet/devicelibs/dasd.py b/blivet/devicelibs/dasd.py
> index 7eb2551..5beb11d 100644
> --- a/blivet/devicelibs/dasd.py
> +++ b/blivet/devicelibs/dasd.py
> @@ -110,14 +110,14 @@ def dasd_needs_format(dasd):
>      return False
>  
> 
> -def write_dasd_conf(disks, ROOT_PATH):
> +def write_dasd_conf(disks, root):
>      """ Write /etc/dasd.conf to target system for all DASD devices
>          configured during installation.
>      """
>      if not (arch.isS390() or disks):
>          return
>  
> -    with open(os.path.realpath(ROOT_PATH + "/etc/dasd.conf"), "w") as f:
> +    with open(os.path.realpath(root + "/etc/dasd.conf"), "w") as f:
>          for dasd in sorted(disks, key=lambda d: d.name):
>              fields = [dasd.busid] + dasd.getOpts()
>              f.write("%s\n" % " ".join(fields),)
> diff --git a/blivet/fcoe.py b/blivet/fcoe.py
> index 42d7550..71ffbcb 100644
> --- a/blivet/fcoe.py
> +++ b/blivet/fcoe.py
> @@ -149,15 +149,15 @@ class fcoe(object):
>  
>          return error_msg
>  
> -    def write(self, ROOT_PATH):
> +    def write(self, root):
>          if not self.nics:
>              return
>  
> -        if not os.path.isdir(ROOT_PATH + "/etc/fcoe"):
> -            os.makedirs(ROOT_PATH + "/etc/fcoe", 0755)
> +        if not os.path.isdir(root + "/etc/fcoe"):
> +            os.makedirs(root + "/etc/fcoe", 0755)
>  
>          for nic, dcb, auto_vlan in self.nics:
> -            fd = os.open(ROOT_PATH + "/etc/fcoe/cfg-" + nic,
> +            fd = os.open(root + "/etc/fcoe/cfg-" + nic,
>                           os.O_RDWR | os.O_CREAT)
>              os.write(fd, '# Created by anaconda\n')
>              os.write(fd, '# Enable/Disable FCoE service at the Ethernet port\n')
> diff --git a/blivet/iscsi.py b/blivet/iscsi.py
> index fceb881..eb640cd 100644
> --- a/blivet/iscsi.py
> +++ b/blivet/iscsi.py
> @@ -360,7 +360,7 @@ class iscsi(object):
>  
>          self.stabilize()
>  
> -    def write(self, ROOT_PATH, storage):
> +    def write(self, root, storage):
>          if not self.initiatorSet:
>              return
>  
> @@ -377,17 +377,17 @@ class iscsi(object):
>              if autostart:
>                  node.setParameter("node.startup", "automatic")
>  
> -        if not os.path.isdir(ROOT_PATH + "/etc/iscsi"):
> -            os.makedirs(ROOT_PATH + "/etc/iscsi", 0755)
> -        fd = os.open(ROOT_PATH + INITIATOR_FILE, os.O_RDWR | os.O_CREAT)
> +        if not os.path.isdir(root + "/etc/iscsi"):
> +            os.makedirs(root + "/etc/iscsi", 0755)
> +        fd = os.open(root + INITIATOR_FILE, os.O_RDWR | os.O_CREAT)
>          os.write(fd, "InitiatorName=%s\n" %(self.initiator))
>          os.close(fd)
>  
>          # copy "db" files.  *sigh*
> -        if os.path.isdir(ROOT_PATH + "/var/lib/iscsi"):
> -            shutil.rmtree(ROOT_PATH + "/var/lib/iscsi")
> +        if os.path.isdir(root + "/var/lib/iscsi"):
> +            shutil.rmtree(root + "/var/lib/iscsi")
>          if os.path.isdir("/var/lib/iscsi"):
> -            shutil.copytree("/var/lib/iscsi", ROOT_PATH + "/var/lib/iscsi",
> +            shutil.copytree("/var/lib/iscsi", root + "/var/lib/iscsi",
>                              symlinks=True)
>  
>      def getNode(self, name, address, port, iface):
> diff --git a/blivet/util.py b/blivet/util.py
> index d43b252..505acc6 100644
> --- a/blivet/util.py
> +++ b/blivet/util.py
> @@ -277,13 +277,13 @@ def makedirs(path):
>  
>  def copy_to_system(source):
>      # do the import now because enable_installer_mode() has finally been called.
> -    from . import ROOT_PATH
> +    from . import getSysroot
>  
>      if not os.access(source, os.R_OK):
>          log.info("copy_to_system: source '%s' does not exist." % source)
>          return False
>  
> -    target = ROOT_PATH + source
> +    target = getSysroot() + source
>      target_dir = os.path.dirname(target)
>      log.debug("copy_to_system: '%s' -> '%s'." % (source, target))
>      if not os.path.isdir(target_dir):
> diff --git a/blivet/zfcp.py b/blivet/zfcp.py
> index cf8ec40..565c201 100644
> --- a/blivet/zfcp.py
> +++ b/blivet/zfcp.py
> @@ -409,15 +409,15 @@ class ZFCP:
>              except ValueError as e:
>                  log.warn(str(e))
>  
> -    def write(self, ROOT_PATH):
> +    def write(self, root):
>          if len(self.fcpdevs) == 0:
>              return
> -        f = open(ROOT_PATH + zfcpconf, "w")
> +        f = open(root + zfcpconf, "w")
>          for d in self.fcpdevs:
>              f.write("%s\n" %(d,))
>          f.close()
> -        
> -        f = open(ROOT_PATH + "/etc/modprobe.conf", "a")
> +
> +        f = open(root + "/etc/modprobe.conf", "a")
>          f.write("alias scsi_hostadapter zfcp\n")
>          f.close()
>  

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list