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