[blivet:master 03/16] No longer use _standard_levels as the default set of RAID levels.
mulhern
amulhern at redhat.com
Tue May 6 16:42:28 UTC 2014
The notion of a "standard" RAID level is being eroded too rapidly to make it
really useful. ALL_LEVELS is a better notion.
This change has the added benefit of simplifying the RAIDlevels constructor.
Also, make _raid_levels property a set instead of a list since no real
ordering make sense.
Signed-off-by: mulhern <amulhern at redhat.com>
---
blivet/devicelibs/mdraid.py | 2 +-
blivet/devicelibs/raid.py | 77 ++++++++++++--------------------------
tests/devicelibs_test/raid_test.py | 4 +-
3 files changed, 26 insertions(+), 57 deletions(-)
diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py
index 387e6a8..7c4b314 100644
--- a/blivet/devicelibs/mdraid.py
+++ b/blivet/devicelibs/mdraid.py
@@ -44,7 +44,7 @@ class MDRaidLevels(raid.RAIDLevels):
except AttributeError:
return False
-_RAID_levels = MDRaidLevels()
+_RAID_levels = MDRaidLevels(["raid0", "raid1", "raid4", "raid5", "raid6", "raid10"])
class Container(object):
name = "container"
diff --git a/blivet/devicelibs/raid.py b/blivet/devicelibs/raid.py
index e59e5e3..f1d6e18 100644
--- a/blivet/devicelibs/raid.py
+++ b/blivet/devicelibs/raid.py
@@ -245,38 +245,24 @@ class RAIDLevels(object):
for its RAID levels.
"""
- def __init__(self, levels=True):
+ def __init__(self, levels=None):
"""Add the specified standard levels to the levels in this object.
- :param levels: the standard levels to be added to this object
- :type levels: bool or a list of valid RAID level descriptors
+ :param levels: the levels to be added to this object
+ :type levels: list of valid RAID level descriptors
If levels is True, add all standard levels. Else, levels
must be a list of valid level descriptors of standard levels.
Duplicate descriptors are ignored.
"""
- self._raid_levels = []
- if levels is False:
- pass
- elif levels is True:
- for l in self.standard_levels:
- self.addRaidLevel(l)
- else:
- try:
- for level in levels:
- matches = [l for l in self.standard_levels if level in l.names]
- if len(matches) != 1:
- raise RaidError("invalid standard RAID level descriptor %s" % level)
- else:
- self.addRaidLevel(matches[0])
- except TypeError:
- raise RaidError("levels must be a boolean or an iterable")
-
-
- _standard_levels = []
-
- standard_levels = property(lambda s: s._standard_levels,
- doc="any standard RAID level classes defined in this package.")
+ levels = levels or []
+ self._raid_levels = set()
+ for level in levels:
+ matches = [l for l in ALL_LEVELS if level in l.names]
+ if len(matches) != 1:
+ raise RaidError("invalid standard RAID level descriptor %s" % level)
+ else:
+ self.addRaidLevel(matches[0])
@classmethod
def isRaidLevel(cls, level):
@@ -291,34 +277,16 @@ class RAIDLevels(object):
The name property must be defined; it should be one of the
elements in the names list.
- All RAID objects in standard_levels are guaranteed to pass these
+ All RAID objects that extend RAIDlevel are guaranteed to pass these
minimum requirements.
This method should not be overridden in any subclass so that it
- is so restrictive that a RAID object in standard_levels does
- not satisfy it.
+ is so restrictive that a RAIDlevel object does not satisfy it.
"""
return hasattr(level, 'names') and \
hasattr(level, 'name') and \
level.name in level.names
- @classmethod
- def addRAIDLevelToStandardLevels(cls, level):
- """Adds this RAID level to the internal list of standard RAID levels
- defined in this package.
-
- :param level: an object representing a RAID level
- :type level: object
-
- Raises a RaidError if level is not a valid RAID level.
-
- Does not allow duplicate level objects.
- """
- if not cls.isRaidLevel(level):
- raise RaidError('level is not a valid RAID level')
- if not level in cls._standard_levels:
- cls._standard_levels.append(level)
-
def raidLevel(self, descriptor):
"""Return RAID object corresponding to descriptor.
@@ -336,7 +304,7 @@ class RAIDLevels(object):
raise RaidError("invalid RAID level descriptor %s" % descriptor)
def addRaidLevel(self, level):
- """Adds level to the list of levels if it is not already there.
+ """Adds level to levels if it is not already there.
:param object level: an object representing a RAID level
@@ -346,12 +314,13 @@ class RAIDLevels(object):
"""
if not self.isRaidLevel(level):
raise RaidError("level is not a valid RAID level")
- if not level in self._raid_levels:
- self._raid_levels.append(level)
+ self._raid_levels.add(level)
def __iter__(self):
return iter(self._raid_levels)
+ALL_LEVELS = RAIDLevels()
+
class RAID0(RAIDLevel):
level = property(lambda s: "0")
@@ -374,7 +343,7 @@ class RAID0(RAIDLevel):
return member_count * 16
RAID0 = RAID0()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID0)
+ALL_LEVELS.addRaidLevel(RAID0)
class RAID1(RAIDLevel):
level = property(lambda s: "1")
@@ -397,7 +366,7 @@ class RAID1(RAIDLevel):
return None
RAID1 = RAID1()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID1)
+ALL_LEVELS.addRaidLevel(RAID1)
class RAID4(RAIDLevel):
level = property(lambda s: "4")
@@ -420,7 +389,7 @@ class RAID4(RAIDLevel):
return (member_count - 1) * 16
RAID4 = RAID4()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID4)
+ALL_LEVELS.addRaidLevel(RAID4)
class RAID5(RAIDLevel):
level = property(lambda s: "5")
@@ -443,7 +412,7 @@ class RAID5(RAIDLevel):
return (member_count - 1) * 16
RAID5 = RAID5()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID5)
+ALL_LEVELS.addRaidLevel(RAID5)
class RAID6(RAIDLevel):
level = property(lambda s: "6")
@@ -466,7 +435,7 @@ class RAID6(RAIDLevel):
return None
RAID6 = RAID6()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID6)
+ALL_LEVELS.addRaidLevel(RAID6)
class RAID10(RAIDLevel):
level = property(lambda s: "10")
@@ -489,4 +458,4 @@ class RAID10(RAIDLevel):
return None
RAID10 = RAID10()
-RAIDLevels.addRAIDLevelToStandardLevels(RAID10)
+ALL_LEVELS.addRaidLevel(RAID10)
diff --git a/tests/devicelibs_test/raid_test.py b/tests/devicelibs_test/raid_test.py
index 52a8fba..a2e5fd1 100644
--- a/tests/devicelibs_test/raid_test.py
+++ b/tests/devicelibs_test/raid_test.py
@@ -8,8 +8,8 @@ from blivet.size import Size
class RaidTestCase(unittest.TestCase):
def setUp(self):
- self.levels = raid.RAIDLevels()
- self.levels_none = raid.RAIDLevels(False)
+ self.levels = raid.RAIDLevels(["raid0", "raid1", "raid4", "raid5", "raid6", "raid10"])
+ self.levels_none = raid.RAIDLevels([])
self.levels_some = raid.RAIDLevels(["mirror", 6])
def testRaid(self):
--
1.8.3.1
More information about the anaconda-patches
mailing list