[blivet:master 06/26] Adjust RaidLevel hierarchy so that all raid level objects extend RAIDLevel

mulhern amulhern at redhat.com
Thu May 29 18:47:24 UTC 2014


Signed-off-by: mulhern <amulhern at redhat.com>
---
 blivet/devicelibs/raid.py | 58 ++++++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 26 deletions(-)

diff --git a/blivet/devicelibs/raid.py b/blivet/devicelibs/raid.py
index 86b584e..84f2aa1 100644
--- a/blivet/devicelibs/raid.py
+++ b/blivet/devicelibs/raid.py
@@ -34,18 +34,39 @@ def div_up(a,b):
     return (a + (b - 1))//b
 
 class RAIDLevel(object):
+    """An abstract class which is the parent of all classes which represent
+       a RAID level.
+
+       It ensures that RAIDLevel objects will really be singleton objects
+       by overriding copy methods.
+    """
+    __metaclass__ = abc.ABCMeta
+
+    name = abc.abstractproperty(doc="The canonical name for this level")
+    names = abc.abstractproperty(doc="List of recognized names for this level.")
+    min_members = abc.abstractproperty(doc=
+       "The minimum number of members required to make a fully functioning array.")
+
+    def __str__(self):
+        return self.name
+
+    def __copy__(self):
+        return self
+
+    def __deepcopy__(self, memo):
+        # pylint: disable=unused-argument
+        return self
+
+class RAIDn(RAIDLevel):
 
     """An abstract class which is the parent of classes which represent a
-       RAID level. A better word would be classification, since 'level'
+       numeric RAID level. A better word would be classification, since 'level'
        implies an ordering, but level is the canonical word.
 
        The abstract properties of the class are:
 
        - level: A string containing the number that designates this level
 
-       - min_members: The minimum number of members required for this
-           level to be sensibly used.
-
        - nick: A single nickname for this level, may be None
 
         All methods in this class fall into these categories:
@@ -66,10 +87,6 @@ class RAIDLevel(object):
 
     # ABSTRACT PROPERTIES
     level = abc.abstractproperty(doc="A code representing the level")
-
-    min_members = abc.abstractproperty(
-       doc="The minimum number of members required for this level")
-
     nick = abc.abstractproperty(doc="A nickname for this level")
 
     # PROPERTIES
@@ -234,10 +251,6 @@ class RAIDLevel(object):
         min_data_size = self._trim(min_size - superblock_size, chunk_size)
         return self.get_net_array_size(num_members, min_data_size)
 
-    def __str__(self):
-        return self.name
-
-
 class RAIDLevels(object):
     """A class which keeps track of registered RAID levels. This class
        may be extended, overriding the isRaid method to include any
@@ -283,14 +296,7 @@ class RAIDLevels(object):
            This method should not be overridden in any subclass so that it
            is so restrictive that a RAIDlevel object does not satisfy it.
         """
-        try:
-            name = level.names[0]
-            name = level.name
-            if name not in level.names:
-                return False
-        except (TypeError, AttributeError, IndexError):
-            return False
-        return True
+        return len(level.names) > 0 and level.name in level.names
 
     def raidLevel(self, descriptor):
         """Return RAID object corresponding to descriptor.
@@ -323,7 +329,7 @@ class RAIDLevels(object):
 
 ALL_LEVELS = RAIDLevels()
 
-class RAID0(RAIDLevel):
+class RAID0(RAIDn):
 
     level = property(lambda s: "0")
     min_members = property(lambda s: 2)
@@ -347,7 +353,7 @@ class RAID0(RAIDLevel):
 RAID0 = RAID0()
 ALL_LEVELS.addRaidLevel(RAID0)
 
-class RAID1(RAIDLevel):
+class RAID1(RAIDn):
     level = property(lambda s: "1")
     min_members = property(lambda s: 2)
     nick = property(lambda s: "mirror")
@@ -370,7 +376,7 @@ class RAID1(RAIDLevel):
 RAID1 = RAID1()
 ALL_LEVELS.addRaidLevel(RAID1)
 
-class RAID4(RAIDLevel):
+class RAID4(RAIDn):
     level = property(lambda s: "4")
     min_members = property(lambda s: 3)
     nick = property(lambda s: None)
@@ -393,7 +399,7 @@ class RAID4(RAIDLevel):
 RAID4 = RAID4()
 ALL_LEVELS.addRaidLevel(RAID4)
 
-class RAID5(RAIDLevel):
+class RAID5(RAIDn):
     level = property(lambda s: "5")
     min_members = property(lambda s: 3)
     nick = property(lambda s: None)
@@ -416,7 +422,7 @@ class RAID5(RAIDLevel):
 RAID5 = RAID5()
 ALL_LEVELS.addRaidLevel(RAID5)
 
-class RAID6(RAIDLevel):
+class RAID6(RAIDn):
     level = property(lambda s: "6")
     min_members = property(lambda s: 4)
     nick = property(lambda s: None)
@@ -439,7 +445,7 @@ class RAID6(RAIDLevel):
 RAID6 = RAID6()
 ALL_LEVELS.addRaidLevel(RAID6)
 
-class RAID10(RAIDLevel):
+class RAID10(RAIDn):
     level = property(lambda s: "10")
     min_members = property(lambda s: 4)
     nick = property(lambda s: None)
-- 
1.8.3.1



More information about the anaconda-patches mailing list