[rhinstaller/blivet/pulls/47 master] Dynamic mountpoint detection

mulkieran installerbot-noreply at redhat.com
Wed Mar 18 13:33:27 UTC 2015


> @@ -0,0 +1,137 @@
> +# mounts.py
> +# Active mountpoints cache.
> +#
> +# Copyright (C) 2015  Red Hat, Inc.
> +#
> +# This copyrighted material is made available to anyone wishing to use,
> +# modify, copy, or redistribute it subject to the terms and conditions of
> +# the GNU General Public License v.2, or (at your option) any later version.
> +# This program is distributed in the hope that it will be useful, but WITHOUT
> +# ANY WARRANTY expressed or implied, including the implied warranties of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
> +# Public License for more details.  You should have received a copy of the
> +# GNU General Public License along with this program; if not, write to the
> +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
> +# source code or documentation are not subject to the GNU General Public
> +# License and may only be used or replicated with the express permission of
> +# Red Hat, Inc.
> +#
> +# Red Hat Author(s): Vojtech Trefny <vtrefny at redhat.com>
> +#
> +
> +from . import util
> +
> +import logging
> +log = logging.getLogger("blivet")
> +
> +class MountsCache(object):
> +
> +    def __init__(self):
> +        self.mountsHash = 0
> +        self.mountpoints = {}
> +
> +        # new device manually added to cache since last check
> +        self.newDevice = False
> +
> +    def add(self, devspec, subvolspec=None):
> +        """ Add device to cache
> +
> +            :param devscpec: device specification, eg. "/dev/vda1"
> +            :type devspec: str
> +            :param subvolspec: btrfs subvolume specification, eg. ID or name
> +            :type subvolspec: str
> +
> +        """
> +
> +        self.mountpoints[(devspec, subvolspec)] = None
> +        self.newDevice = True
> +
> +    def remove(self, devspec, subvolspec=None):
> +        """ Remove device from cache
> +
> +            :param devscpec: device specification, eg. "/dev/vda1"
> +            :type devspec: str
> +            :param subvolspec: btrfs subvolume specification, eg. ID or name
> +            :type subvolspec: str
> +
> +        """
> +
> +        if (devspec, subvolspec) in self.mountpoints:
> +            del self.mountpoints[(devspec, subvolspec)]
> +
> +    def clear(self):
> +        """ Clear cache
> +        """
> +
> +        for key in self.mountpoints.keys():
> +            self.mountpoints[key] = None
> +
> +        self._getActiveMounts()
> +
> +    def getMountpoint(self, devspec, subvolspec=None):
> +        """ Get mountpoint for selected device
> +
> +            :param devscpec: device specification, eg. "/dev/vda1"
> +            :type devspec: str
> +            :param subvolspec: btrfs subvolume specification, eg. ID or name
> +            :type subvolspec: str
> +            :returns: mountpoint (path)
> +            :rtype: str
> +
> +        """
> +
> +        self._cacheCheck()
> +
> +        if (devspec, subvolspec) not in self.mountpoints.keys():
> +            return None
> +
> +        else:
> +            return self.mountpoints[(devspec, subvolspec)]
> +
> +    def _getActiveMounts(self):
> +
> +        for line in open("/proc/mounts").readlines():
> +            try:
> +                (devspec, mountpoint, fstype, options, _rest) = line.split(None, 4)
> +            except ValueError:
> +                log.error("failed to parse /proc/mounts line: %s", line)
> +                continue
> +
> +            if fstype == "btrfs":
> +                # get the subvol name from /proc/self/mountinfo
> +                for line in open("/proc/self/mountinfo").readlines():
> +                    fields = line.split()
> +                    _subvol = fields[3]
> +                    _mountpoint = fields[4]
> +                    _devspec = fields[9]
> +                    if _mountpoint == mountpoint and _devspec == devspec:
> +                        # empty _subvol[1:] means it is a top-level volume
> +                        subvolspec = _subvol[1:] or 5
> +
> +                        fmt = self._resolveFormat(devspec, subvolspec)
> +
> +            else:
> +                fmt = self._resolveFormat(devspec)
> +
> +            if fmt:
> +                self.mountpoints[fmt] = mountpoint
> +
> +    def _resolveFormat(self, devspec, subvolspec=None):
> +
> +        for fmt in self.mountpoints.keys():
> +            if fmt[0] == devspec:
> +                if not fmt[1]:
> +                    return fmt
> +
> +                elif fmt[1] == subvolspec:
> +                    return fmt

```
return next((f for (d, s) in self.mountpoints.keys() if d == devspec and (not s or s == subvolspec)), None)
```
should do the same thing and also explicitly returns None.

This method is probably worth a doc string.

-- 
To view this pull request on github, visit https://github.com/rhinstaller/blivet/pull/47#discussion_r26662242


More information about the anaconda-patches mailing list