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

[PATCH] Try to include error messages in lvm/mdadm exceptions.



This should reduce the dogpiling in bugzilla for overly-generic
errors like "lvcreate failed for VolGroup/lv_root".
---
 storage/devicelibs/lvm.py    |  153 ++++++++++++++++++-----------------------
 storage/devicelibs/mdraid.py |   85 +++++++++++------------
 2 files changed, 107 insertions(+), 131 deletions(-)

diff --git a/storage/devicelibs/lvm.py b/storage/devicelibs/lvm.py
index 5fa9198..1f7e1c7 100644
--- a/storage/devicelibs/lvm.py
+++ b/storage/devicelibs/lvm.py
@@ -157,17 +157,30 @@ def clampSize(size, pesize, roundup=None):
 
     return long(round(float(size)/float(pesize)) * pesize)
 
+def lvm(args):
+    rc = iutil.execWithRedirect("lvm", args,
+                                stdout = "/dev/tty5",
+                                stderr = "/dev/tty5",
+                                searchPath=1)
+    if not rc:
+        return
+
+    try:
+        msg = open("/tmp/program.log").readlines()[-1].strip()
+    except Exception:
+        msg = ""
+
+    raise LVMError(msg)
+
 def pvcreate(device):
     args = ["pvcreate"] + \
             config_args + \
             [device]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-    if rc:
-        raise LVMError("pvcreate failed for %s" % device)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("pvcreate failed for %s: %s" % (device, msg))
 
 def pvresize(device, size):
     args = ["pvresize"] + \
@@ -175,24 +188,20 @@ def pvresize(device, size):
             config_args + \
             [device]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-    if rc:
-        raise LVMError("pvresize failed for %s" % device)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("pvresize failed for %s: %s" % (device, msg))
 
 def pvremove(device):
     args = ["pvremove"] + \
             config_args + \
             [device]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-    if rc:
-        raise LVMError("pvremove failed for %s" % device)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("pvremove failed for %s: %s" % (device, msg))
 
 def pvinfo(device):
     """
@@ -237,51 +246,40 @@ def vgcreate(vg_name, pv_list, pe_size):
     argv.append(vg_name)
     argv.extend(pv_list)
 
-    rc = iutil.execWithRedirect("lvm", argv,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("vgcreate failed for %s" % vg_name)
+    try:
+        lvm(argv)
+    except LVMError as msg:
+        raise LVMError("vgcreate failed for %s: %s" % (vg_name, msg))
 
 def vgremove(vg_name):
     args = ["vgremove"] + \
             config_args +\
             [vg_name]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("vgremove failed for %s" % vg_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("vgremove failed for %s: %s" % (vg_name, msg))
 
 def vgactivate(vg_name):
     args = ["vgchange", "-a", "y"] + \
             config_args + \
             [vg_name]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-    if rc:
-        raise LVMError("vgactivate failed for %s" % vg_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("vgactivate failed for %s: %s" % (vg_name, msg))
 
 def vgdeactivate(vg_name):
     args = ["vgchange", "-a", "n"] + \
             config_args + \
             [vg_name]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("vgdeactivate failed for %s" % vg_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("vgdeactivate failed for %s: %s" % (vg_name, msg))
 
 def vgreduce(vg_name, pv_list, rm=False):
     """ Reduce a VG.
@@ -296,13 +294,10 @@ def vgreduce(vg_name, pv_list, rm=False):
     else:
         args.extend([vg_name] + pv_list)
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("vgreduce failed for %s" % vg_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("vgreduce failed for %s: %s" % (vg_name, msg))
 
 def vginfo(vg_name):
     args = ["vgs", "--noheadings", "--nosuffix"] + \
@@ -372,26 +367,20 @@ def lvcreate(vg_name, lv_name, size):
             config_args + \
             [vg_name]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("lvcreate failed for %s/%s" % (vg_name, lv_name))
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("lvcreate failed for %s/%s: %s" % (vg_name, lv_name, msg))
 
 def lvremove(vg_name, lv_name):
     args = ["lvremove"] + \
             config_args + \
             ["%s/%s" % (vg_name, lv_name)]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("lvremove failed for %s" % lv_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("lvremove failed for %s: %s" % (lv_name, msg))
 
 def lvresize(vg_name, lv_name, size):
     args = ["lvresize"] + \
@@ -399,13 +388,10 @@ def lvresize(vg_name, lv_name, size):
             config_args + \
             ["%s/%s" % (vg_name, lv_name)]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise LVMError("lvresize failed for %s" % lv_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("lvresize failed for %s: %s" % (lv_name, msg))
 
 def lvactivate(vg_name, lv_name):
     # see if lvchange accepts paths of the form 'mapper/$vg-$lv'
@@ -413,23 +399,18 @@ def lvactivate(vg_name, lv_name):
             config_args + \
             ["%s/%s" % (vg_name, lv_name)]
 
-    rc = iutil.execWithRedirect("lvm", args,
-                                stdout = "/dev/tty5",
-                                stderr = "/dev/tty5",
-                                searchPath=1)
-    if rc:
-        raise LVMError("lvactivate failed for %s" % lv_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("lvactivate failed for %s: %s" % (lv_name, msg))
 
 def lvdeactivate(vg_name, lv_name):
     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)
-
-    if rc:
-        raise LVMError("lvdeactivate failed for %s" % lv_name)
+    try:
+        lvm(args)
+    except LVMError as msg:
+        raise LVMError("lvdeactivate failed for %s: %s" % (lv_name, msg))
 
diff --git a/storage/devicelibs/mdraid.py b/storage/devicelibs/mdraid.py
index b082c7b..73099c4 100644
--- a/storage/devicelibs/mdraid.py
+++ b/storage/devicelibs/mdraid.py
@@ -119,6 +119,21 @@ def get_raid_max_spares(raidlevel, nummembers):
 
     raise ValueError, "invalid raid level %d" % raidlevel
 
+def mdadm(args):
+    rc = iutil.execWithRedirect("mdadm", args,
+                                stdout = "/dev/tty5",
+                                stderr = "/dev/tty5",
+                                searchPath=1)
+    if not rc:
+        return
+
+    try:
+        msg = open("/tmp/program.log").readlines()[-1].strip()
+    except Exception:
+        msg = ""
+
+    raise MDRaidError(msg)
+
 def mdcreate(device, level, disks, spares=0):
     argv = ["--create", device, "--run", "--level=%s" % level]
     raid_devs = len(disks) - spares
@@ -127,27 +142,18 @@ def mdcreate(device, level, disks, spares=0):
         argv.append("--spare-devices=%d" % spares)
     argv.extend(disks)
     
-    rc = iutil.execWithRedirect("mdadm",
-                                argv,
-                                stderr = "/dev/tty5",
-                                stdout = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise MDRaidError("mdcreate failed for %s" % device)
-
-    # mdadm insists on starting the new array, so we have to stop it here
-    #self.mddeactivate(device)
+    try:
+        mdadm(argv)
+    except MDRaidError as msg:
+        raise MDRaidError("mdcreate failed for %s: %s" % (device, msg))
 
 def mddestroy(device):
-    rc = iutil.execWithRedirect("mdadm",
-                                ["--zero-superblock", device],
-                                stderr = "/dev/tty5",
-                                stdout = "/dev/tty5",
-                                searchPath=1)
+    args = ["--zero-superblock", device]
 
-    if rc:
-        raise MDRaidError("mddestroy failed for %s" % device)
+    try:
+        mdadm(args)
+    except MDRaidError as msg:
+        raise MDRaidError("mddestroy failed for %s: %s" % (device, msg))
 
 def mdadd(device, no_degraded=False):
     args = ["--incremental", "--quiet"]
@@ -155,14 +161,10 @@ def mdadd(device, no_degraded=False):
         args.append("--no-degraded")
     args.append(device)
 
-    rc = iutil.execWithRedirect("mdadm",
-                                args,
-                                stderr = "/dev/tty5",
-                                stdout = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise MDRaidError("mdadd failed for %s" % device)
+    try:
+        mdadm(args)
+    except MDRaidError as msg:
+        raise MDRaidError("mdadd failed for %s: %s" % (device, msg))
 
 def mdactivate(device, members=[], super_minor=None, update_super_minor=False,
                uuid=None):
@@ -181,29 +183,22 @@ def mdactivate(device, members=[], super_minor=None, update_super_minor=False,
     else:
         extra_args = [ ]
 
-    rc = iutil.execWithRedirect("mdadm",
-                                ["--assemble",
-                                 device,
-                                 identifier,
-                                 "--run",
-                                 "--auto=md"] + extra_args + members,
-                                stderr = "/dev/tty5",
-                                stdout = "/dev/tty5",
-                                searchPath=1)
-
-    if rc:
-        raise MDRaidError("mdactivate failed for %s" % device)
+    args = ["--assemble", device, identifier, "--run", "--auto=md"]
+    args += extra_args
+    args += members
 
+    try:
+        mdadm(args)
+    except MDRaidError as msg:
+        raise MDRaidError("mdactivate failed for %s: %s" % (device, msg))
 
 def mddeactivate(device):
-    rc = iutil.execWithRedirect("mdadm",
-                                ["--stop", device],
-                                stderr = "/dev/tty5",
-                                stdout = "/dev/tty5",
-                                searchPath=1)
+    args = ["--stop", device]
 
-    if rc:
-        raise MDRaidError("mddeactivate failed for %s" % device)
+    try:
+        mdadm(args)
+    except MDRaidError as msg:
+        raise MDRaidError("mddeactivate failed for %s: %s" % (device, msg))
 
 def mdexamine(device):
     vars = iutil.execWithCapture("mdadm",
-- 
1.6.0.6


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