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

[PATCH 1/2] When creating a new md array check we have enough members (#533027)



Make MDRaidArrayDevice.__init__ raise a value exception when creating
a new (so non existing) raid set and there are not enough members for
the requested raid level.

And catch this value exception in the GUI raid dialog and kickstart raid
commands.
---
 iw/raid_dialog_gui.py |    7 ++++++-
 kickstart.py          |    5 ++++-
 storage/devices.py    |    6 ++++++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/iw/raid_dialog_gui.py b/iw/raid_dialog_gui.py
index e2ffe9a..8431e71 100644
--- a/iw/raid_dialog_gui.py
+++ b/iw/raid_dialog_gui.py
@@ -201,12 +201,17 @@ class RaidEditor:
                 format = fmt_class(mountpoint=mountpoint)
                 members = len(raidmembers) - spares
 
-                request = self.storage.newMDArray(minor=raidminor,
+                try:
+                    request = self.storage.newMDArray(minor=raidminor,
                                                   level=raidlevel,
                                                   format=format,
                                                   parents=raidmembers,
                                                   totalDevices=len(raidmembers),
                                                   memberDevices=members)
+                except ValueError, e:
+                    self.intf.messageWindow(_("Error"), str(e),
+                                            custom_icon="error")
+                    continue
 
                 # we must destroy luks leaf before original raid request
                 if self.origrequest.format.type == "luks":
diff --git a/kickstart.py b/kickstart.py
index 147431b..aca5319 100644
--- a/kickstart.py
+++ b/kickstart.py
@@ -877,7 +877,10 @@ class Raid(commands.raid.F12_Raid):
             except KeyError:
                 pass
 
-            request = storage.newMDArray(**kwargs)
+            try:
+                request = storage.newMDArray(**kwargs)
+            except ValueError, e:
+                raise KickstartValueError, formatErrorMsg(self.lineno, msg=str(e))
 
             # FIXME: no way to specify an fsprofile right now
             # if pd.fsprofile:
diff --git a/storage/devices.py b/storage/devices.py
index 7b4b314..5049765 100644
--- a/storage/devices.py
+++ b/storage/devices.py
@@ -2197,6 +2197,12 @@ class MDRaidArrayDevice(StorageDevice):
         elif level is not None:
             self.level = mdraid.raidLevel(level)
 
+        # For new arrays check if we have enough members
+        if (not exists and parents and
+                len(parents) < mdraid.get_raid_min_members(self.level)):
+            raise ValueError, _("A RAID%d set requires atleast %d members") % (
+                           self.level, mdraid.get_raid_min_members(self.level))
+
         self.uuid = uuid
         self._totalDevices = numeric_type(totalDevices)
         self._memberDevices = numeric_type(memberDevices)
-- 
1.6.5.2


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