Re: [PATCH] Add a list that lvm should ignore.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Any reviewers.  would like to commit this tomorrow :)

regards
On Thu, Mar 12, 2009 at 07:14:41PM +0100, Joel Granados Moreno wrote:
> We use the --config argument from lvm to pass a list of devices from
> devicetree.ignoredDisks to lvm so those disks can be ignored in lvm
> commands.
> 
> * storage/devicelibs/lvm.py (config_args): Add global variable that
>   will contain the "--config" argument.  The argument will be a list
>   ["--config", STRING_ARGS]
> * storage/devicelibs/lvm.py (composeConfig): Add function to create the
>   config_args argument.
> * storage/devicelibs/lvm.py (lvm_cc_addFilterRejectRegexp): New function
>   to regenerate the config_args with a new regular expression.
> * storage/devicelibs/lvm.py (pv*, lv*, vg*): Use the global variable for
>   each LVM command.
> * storage/devicetree.py (DeviceTree): Instead of doing a
>   self.ignoredDisk.append(DISK), we create a new function that adds DISK
>   to the devicetree list and to the lvm list and whatever else we need.
> ---
>  storage/devicelibs/lvm.py |  186 ++++++++++++++++++++++++++++++++++-----------
>  storage/devicetree.py     |   24 ++++--
>  2 files changed, 155 insertions(+), 55 deletions(-)
> 
> diff --git a/storage/devicelibs/lvm.py b/storage/devicelibs/lvm.py
> index 0faee10..0a19711 100644
> --- a/storage/devicelibs/lvm.py
> +++ b/storage/devicelibs/lvm.py
> @@ -49,6 +49,56 @@ def has_lvm():
>  
>      return has_lvm
>  
> +# Start config_args handling code
> +#
> +# Theoretically we can handle all that can be handled with the LVM --config
> +# argument.  For every time we call an lvm_cc (lvm compose config) funciton
> +# we regenerate the config_args with all global info.
> +config_args = [] # Holds the final argument list
> +config_args_data = { "filterRejects": [],    # regular expressions to reject.
> +                            "filterAccepts": [] }   # regexp to accept
> +
> +def _composeConfig():
> +    """lvm command accepts lvm.conf type arguments preceded by --config. """
> +    global config_args, config_args_data
> +    config_args = []
> +
> +    filter_string = ""
> +    rejects = config_args_data["filterRejects"]
> +    # we don't need the accept for now.
> +    # accepts = config_args_data["filterAccepts"]
> +    # if len(accepts) > 0:
> +    #   for i in range(len(rejects)):
> +    #       filter_string = filter_string + ("\"a|%s|\", " % accpets[i])
> +
> +    if len(rejects) > 0:
> +        for i in range(len(rejects)):
> +            filter_string = filter_string + ("\"r|%s|\", " % rejects[i])
> +
> +
> +    filter_string = " filter=[%s] " % filter_string.strip(",")
> +
> +    # As we add config strings we should check them all.
> +    if filter_string == "":
> +        # Nothing was really done.
> +        return
> +
> +    # devices_string can have (inside the brackets) "dir", "scan",
> +    # "preferred_names", "filter", "cache_dir", "write_cache_state",
> +    # "types", "sysfs_scan", "md_component_detection".  see man lvm.conf.
> +    devices_string = " devices { %s } " % (filter_string) # strings can be added
> +    config_string = devices_string # more strings can be added.
> +    config_args = ["--config", config_string]
> +
> +def lvm_cc_addFilterRejectRegexp(regexp):
> +    """ Add a regular expression to the --config string."""
> +    global config_args_data
> +    config_args_data["filterRejects"].append(regexp)
> +
> +    # compoes config once more.
> +    _composeConfig()
> +# End config_args handling code.
> +
>  def getPossiblePhysicalExtents(floor=0):
>      """Returns a list of integers representing the possible values for
>         the physical extent of a volume group.  Value is in KB.
> @@ -108,8 +158,11 @@ def clampSize(size, pesize, roundup=None):
>      return long(round(float(size)/float(pesize)) * pesize)
>  
>  def pvcreate(device):
> -    rc = iutil.execWithRedirect("lvm",
> -                                ["pvcreate", device],
> +    args = ["pvcreate"] + \
> +            config_args + \
> +            [device]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -117,11 +170,12 @@ def pvcreate(device):
>          raise LVMError("pvcreate failed for %s" % device)
>  
>  def pvresize(device, size):
> -    size_arg = "%dm" % size
> -    rc = iutil.execWithRedirect("lvm",
> -                                ["pvresize",
> -                                 "--setphysicalvolumesize", size_arg,
> -                                 device],
> +    args = ["pvresize"] + \
> +            ["--setphysicalvolumesize", ("%dm" % size)] + \
> +            config_args + \
> +            [device]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -129,8 +183,11 @@ def pvresize(device, size):
>          raise LVMError("pvresize failed for %s" % device)
>  
>  def pvremove(device):
> -    rc = iutil.execWithRedirect("lvm",
> -                                ["pvremove", device],
> +    args = ["pvremove"] + \
> +            config_args + \
> +            [device]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -147,12 +204,13 @@ def pvinfo(device):
>              'devices { scan = "/dev" filter = ["a/loop0/", "r/.*/"] }'
>      """
>      #cfg = "'devices { scan = \"/dev\" filter = [\"a/%s/\", \"r/.*/\"] }'" 
> -    rc = iutil.execWithCapture("lvm",
> -                               ["pvs", "--noheadings",
> -                                "--units", "m",
> -                                "-o",
> -                                "pv_name,pv_mda_count,vg_name,vg_uuid",
> -                                device],
> +    args = ["pvs", "--noheadings"] + \
> +            ["--units", "m"] + \
> +            ["-o", "pv_name,pv_mda_count,vg_name,vg_uuid"] + \
> +            config_args + \
> +            [device]
> +
> +    rc = iutil.execWithCapture("lvm", args,
>                                  stderr = "/dev/tty5")
>      vals = rc.split()
>      if not vals:
> @@ -175,10 +233,11 @@ def vgcreate(vg_name, pv_list, pe_size):
>      argv = ["vgcreate"]
>      if pe_size:
>          argv.extend(["-s", "%dM" % pe_size])
> +    argv.extend(config_args)
>      argv.append(vg_name)
>      argv.extend(pv_list)
> -    rc = iutil.execWithRedirect("lvm",
> -                                argv,
> +
> +    rc = iutil.execWithRedirect("lvm", argv,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -187,7 +246,11 @@ def vgcreate(vg_name, pv_list, pe_size):
>          raise LVMError("vgcreate failed for %s" % vg_name)
>  
>  def vgremove(vg_name):
> -    rc = iutil.execWithRedirect("lvm", ["vgremove", vg_name],
> +    args = ["vgremove"] + \
> +            config_args +\
> +            [vg_name]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -196,7 +259,11 @@ def vgremove(vg_name):
>          raise LVMError("vgremove failed for %s" % vg_name)
>  
>  def vgactivate(vg_name):
> -    rc = iutil.execWithRedirect("lvm", ["vgchange", "-a", "y", vg_name],
> +    args = ["vgchange", "-a", "y"] + \
> +            config_args + \
> +            [vg_name]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -204,7 +271,11 @@ def vgactivate(vg_name):
>          raise LVMError("vgactivate failed for %s" % vg_name)
>  
>  def vgdeactivate(vg_name):
> -    rc = iutil.execWithRedirect("lvm", ["vgchange", "-a", "n", vg_name],
> +    args = ["vgchange", "-a", "n"] + \
> +            config_args + \
> +            [vg_name]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -213,7 +284,12 @@ def vgdeactivate(vg_name):
>          raise LVMError("vgdeactivate failed for %s" % vg_name)
>  
>  def vgreduce(vg_name, pv_list):
> -    rc = iutil.execWithRedirect("lvm", ["vgreduce", vg_name] + pv_list,
> +    args = ["vgreduce"] + \
> +            config_args + \
> +            [vg_name] + \
> +            pv_list
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -222,11 +298,15 @@ def vgreduce(vg_name, pv_list):
>          raise LVMError("vgreduce failed for %s" % vg_name)
>  
>  def vginfo(vg_name):
> +    args = ["vgs", "--noheadings", "--nosuffix"] + \
> +            ["--units", "m"] + \
> +            ["-o", "uuid,size,free,extent_size,extent_count,free_count,pv_count"] + \
> +            config_args + \
> +            [vg_name]
> +
>      buf = iutil.execWithCapture("lvm",
> -                ["vgs", "--noheadings", "--nosuffix", "--units", "m", "-o", 
> -                 "uuid,size,free,extent_size,extent_count,free_count,pv_count",
> -                 vg_name],
> -                 stderr="/dev/tty5")
> +                                args,
> +                                stderr="/dev/tty5")
>      info = buf.split()
>      if len(info) != 7:
>          raise LVMError(_("vginfo failed for %s" % vg_name))
> @@ -237,10 +317,14 @@ def vginfo(vg_name):
>      return d
>  
>  def lvs(vg_name):
> +    args = ["lvs", "--noheadings", "--nosuffix"] + \
> +            ["--units", "m"] + \
> +            ["-o", "lv_name,lv_uuid,lv_size"] + \
> +            config_args + \
> +            [vg_name]
> +
>      buf = iutil.execWithCapture("lvm",
> -                                ["lvs", "--noheadings", "--nosuffix",
> -                                 "--units", "m", "-o",
> -                                 "lv_name,lv_uuid,lv_size", vg_name],
> +                                args,
>                                  stderr="/dev/tty5")
>  
>      lvs = {}
> @@ -258,12 +342,13 @@ def lvs(vg_name):
>      return lvs
>  
>  def lvcreate(vg_name, lv_name, size):
> -    size_arg = "%dm" % size
> -    rc = iutil.execWithRedirect("lvm",
> -                                ["lvcreate",
> -                                 "-L", size_arg,
> -                                 "-n", lv_name,
> -                                 vg_name],
> +    args = ["lvcreate"] + \
> +            ["-L", "%dm" % size] + \
> +            ["-n", lv_name] + \
> +            config_args + \
> +            [vg_name]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -272,8 +357,11 @@ def lvcreate(vg_name, lv_name, size):
>          raise LVMError("lvcreate failed for %s/%s" % (vg_name, lv_name))
>  
>  def lvremove(vg_name, lv_name):
> -    lv_path = "%s/%s" % (vg_name, lv_name)
> -    rc = iutil.execWithRedirect("lvm", ["lvremove", lv_path],
> +    args = ["lvremove"] + \
> +            config_args + \
> +            ["%s/%s" % (vg_name, lv_name)]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -282,12 +370,12 @@ def lvremove(vg_name, lv_name):
>          raise LVMError("lvremove failed for %s" % lv_path)
>  
>  def lvresize(vg_name, lv_name, size):
> -    lv_path = "%s/%s" % (vg_name, lv_name)
> -    size_arg = "%dm" % size
> -    rc = iutil.execWithRedirect("lvm",
> -                                ["lvresize",
> -                                 "-L", size_arg,
> -                                 lv_path],
> +    args = ["lvresize"] + \
> +            ["-L", "%dm" % size] + \
> +            config_args + \
> +            ["%s/%s" % (vg_name, lv_name)]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -297,8 +385,11 @@ def lvresize(vg_name, lv_name, size):
>  
>  def lvactivate(vg_name, lv_name):
>      # see if lvchange accepts paths of the form 'mapper/$vg-$lv'
> -    lv_path = "%s/%s" % (vg_name, lv_name)
> -    rc = iutil.execWithRedirect("lvm", ["lvchange", "-a", "y", lv_path],
> +    args = ["lvchange", "-a", "y"] + \
> +            config_args + \
> +            ["%s/%s" % (vg_name, lv_name)]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> @@ -306,8 +397,11 @@ def lvactivate(vg_name, lv_name):
>          raise LVMError("lvactivate failed for %s" % lv_path)
>  
>  def lvdeactivate(vg_name, lv_name):
> -    lv_path = "%s/%s" % (vg_name, lv_name)
> -    rc = iutil.execWithRedirect("lvm", ["lvchange", "-a", "n", lv_path],
> +    args = ["lvchange", "-a", "n"] + \
> +            config_args + \
> +            ["%s/%s" % (vg_name, lv_name)]
> +
> +    rc = iutil.execWithRedirect("lvm", args,
>                                  stdout = "/dev/tty5",
>                                  stderr = "/dev/tty5",
>                                  searchPath=1)
> diff --git a/storage/devicetree.py b/storage/devicetree.py
> index 49f551c..58e725d 100644
> --- a/storage/devicetree.py
> +++ b/storage/devicetree.py
> @@ -162,13 +162,19 @@ class DeviceTree(object):
>          self._actions = []
>  
>          self.intf = intf
> -        self.ignoredDisks = ignored
>          self.exclusiveDisks = exclusive
>          self.zeroMbr = zeroMbr
>          self.__passphrase = passphrase
>          self.__luksDevs = {}
>          if luksDict and isinstance(luksDict, dict):
>              self.__luksDevs = luksDict
> +        self._ignoredDisks = []
> +        for disk in ignored:
> +            self.addIgnoredDisk(disk)
> +
> +    def addIgnoredDisk(self, disk):
> +        self._ignoredDisks.append(disk)
> +        lvm.lvm_cc_addFilterRejectRegexp(disk)
>  
>      def pruneActions(self):
>          """ Prune loops and redundant actions from the queue. """
> @@ -790,10 +796,10 @@ class DeviceTree(object):
>          if not sysfs_path:
>              return None
>  
> -        if name in self.ignoredDisks:
> +        if name in self._ignoredDisks:
>              return True
>  
> -        for ignored in self.ignoredDisks:
> +        for ignored in self._ignoredDisks:
>              if ignored == os.path.basename(os.path.dirname(sysfs_path)):
>                  # this is a partition on a disk in the ignore list
>                  return True
> @@ -881,7 +887,7 @@ class DeviceTree(object):
>                                             exists=True, \
>                                             parents=[disk])
>                      self._addDevice(device)
> -                    #self.ignoredDisks.append(name)
> +                    #self.addIgnoredDisk(name)
>  
>                  # if we get here, we found all of the slave devices and
>                  # something must be wrong -- if all of the slaves are in
> @@ -984,7 +990,7 @@ class DeviceTree(object):
>                                      initcb=cb)
>                      self._addDevice(device)
>                  except DeviceUserDeniedFormatError: #drive not initialized?
> -                    self.ignoredDisks.append(name)
> +                    self.addIgnoredDisk(name)
>          elif udev_device_is_partition(info):
>              log.debug("%s is a partition" % name)
>              device = self.getDeviceByName(name)
> @@ -1134,12 +1140,12 @@ class DeviceTree(object):
>                  if rs is None:
>                      # we ignore the device in the hope that all the devices
>                      # from this set will be ignored.
> -                    self.ignoredDisks.append(device.name)
> +                    self.addIgnoredDisk(device.name)
>                      return
>  
>                  elif rs.name in self.ignoredDisks:
>                      # If the rs is being ignored, we should ignore device too.
> -                    self.ignoredDisks.append(device.name)
> +                    self.addIgnoredDisk(device.name)
>                      return
>  
>                  else:
> @@ -1175,8 +1181,8 @@ class DeviceTree(object):
>                              #        major=major, minor=minor, uuid=uuid, name=name)
>                          except DeviceUserDeniedFormatError:
>                              # We should ignore the dmriad and its components
> -                            self.ignoredDisks.append(rs.name)
> -                            self.ignoredDisks.append(device.name)
> +                            self.addIgnoredDisk(rs.name)
> +                            self.addIgnoredDisk(device.name)
>                              rs.deactivate()
>              elif format.type == "lvmpv":
>                  # lookup/create the VG and LVs
> -- 
> 1.6.0.6
> 
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list

-- 
Joel Andres Granados
Brno, Czech Republic, Red Hat.

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux