[blivet:master 7/9] Make has_redundancy a method rather than a property.
mulhern
amulhern at redhat.com
Mon Aug 4 15:56:54 UTC 2014
Originally, has_redundancy was set to False for Container so that it
could be a simple property. But this feels like a cheap trick, since
whether or not a Container level has intrinsic redundancy is not
a reasonable question. Now, raise an exception for Container.has_redundancy.
Change calling code appropriately. making sure that the exception is not
raised by that code and also that reasonably behavior occurs.
---
blivet/devicelibs/raid.py | 49 ++++++++++++++++++++++++++++++++++++-----------
blivet/devices.py | 6 +++---
2 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/blivet/devicelibs/raid.py b/blivet/devicelibs/raid.py
index 50d19dc..d231c80 100644
--- a/blivet/devicelibs/raid.py
+++ b/blivet/devicelibs/raid.py
@@ -48,8 +48,17 @@ class RAIDLevel(object):
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.")
- has_redundancy = abc.abstractproperty(doc=
- "Whether this RAID level incorporates inherent redundancy.")
+ @abc.abstractmethod
+ def has_redundancy(self):
+ """ Whether this RAID level incorporates inherent redundancy.
+
+ Note that for some RAID levels, the notion of redundancy is
+ meaningless.
+
+ :rtype: boolean
+ :returns: True if this RAID level has inherent redundancy
+ """
+ raise NotImplementedError()
is_uniform = abc.abstractproperty(doc=
"Whether data is uniformly distributed across all devices.")
@@ -389,7 +398,9 @@ class RAID0(RAIDn):
level = property(lambda s: "0")
min_members = property(lambda s: 2)
nick = property(lambda s: "stripe")
- has_redundancy = property(lambda s: False)
+
+ def has_redundancy(self):
+ return False
def _get_max_spares(self, member_count):
return 0
@@ -416,7 +427,9 @@ class RAID1(RAIDn):
level = property(lambda s: "1")
min_members = property(lambda s: 2)
nick = property(lambda s: "mirror")
- has_redundancy = property(lambda s: True)
+
+ def has_redundancy(self):
+ return True
def _get_max_spares(self, member_count):
return member_count - self.min_members
@@ -443,7 +456,9 @@ class RAID4(RAIDn):
level = property(lambda s: "4")
min_members = property(lambda s: 3)
nick = property(lambda s: None)
- has_redundancy = property(lambda s: True)
+
+ def has_redundancy(self):
+ return True
def _get_max_spares(self, member_count):
return member_count - self.min_members
@@ -470,7 +485,9 @@ class RAID5(RAIDn):
level = property(lambda s: "5")
min_members = property(lambda s: 3)
nick = property(lambda s: None)
- has_redundancy = property(lambda s: True)
+
+ def has_redundancy(self):
+ return True
def _get_max_spares(self, member_count):
return member_count - self.min_members
@@ -497,7 +514,9 @@ class RAID6(RAIDn):
level = property(lambda s: "6")
min_members = property(lambda s: 4)
nick = property(lambda s: None)
- has_redundancy = property(lambda s: True)
+
+ def has_redundancy(self):
+ return True
def _get_max_spares(self, member_count):
return member_count - self.min_members
@@ -524,7 +543,9 @@ class RAID10(RAIDn):
level = property(lambda s: "10")
min_members = property(lambda s: 4)
nick = property(lambda s: None)
- has_redundancy = property(lambda s: True)
+
+ def has_redundancy(self):
+ return True
def _get_max_spares(self, member_count):
return member_count - self.min_members
@@ -551,9 +572,11 @@ class Container(RAIDLevel):
name = "container"
names = [name]
min_members = 1
- has_redundancy = property(lambda s: False)
is_uniform = property(lambda s: False)
+ def has_redundancy(self):
+ raise NotImplementedError("redundancy is not a concept that applies to containers")
+
def get_max_spares(self, member_count):
# pylint: disable=unused-argument
raise RaidError("get_max_spares is not defined for level container")
@@ -579,9 +602,11 @@ class ErsatzRAID(RAIDLevel):
distinct subclasses which have different names.
"""
min_members = 1
- has_redundancy = property(lambda s: False)
is_uniform = property(lambda s: False)
+ def has_redundancy(self):
+ return False
+
def get_max_spares(self, member_count):
return member_count - self.min_members
@@ -631,9 +656,11 @@ class Dup(RAIDLevel):
name = 'dup'
names = [name]
min_members = 1
- has_redundancy = property(lambda s: True)
is_uniform = property(lambda s: False)
+ def has_redundancy(self):
+ return True
+
Dup = Dup()
ALL_LEVELS.addRaidLevel(Dup)
diff --git a/blivet/devices.py b/blivet/devices.py
index c238e94..c4259f5 100644
--- a/blivet/devices.py
+++ b/blivet/devices.py
@@ -3679,7 +3679,7 @@ class MDRaidArrayDevice(ContainerDevice):
If the array has no redundancy, a bitmap is just pointless.
"""
- return self.level.has_redundancy and self.size >= 1000 and self.format.type != "swap"
+ return not self.level is raid.Container and self.level.has_redundancy() and self.size >= 1000 and self.format.type != "swap"
def getSuperBlockSize(self, raw_array_size):
"""Estimate the superblock size for a member of an array,
@@ -3862,7 +3862,7 @@ class MDRaidArrayDevice(ContainerDevice):
appears to have formatting and therefore probably data on it,
removing one of its devices is a bad idea.
"""
- if not self.level.has_redundancy and self.exists and member.format.exists:
+ if not self.level is raid.Container and not self.level.has_redundancy() and self.exists and member.format.exists:
raise errors.DeviceError("cannot remove members from existing %s array" % self.level)
super(MDRaidArrayDevice, self)._removeParent(member)
@@ -4057,7 +4057,7 @@ class MDRaidArrayDevice(ContainerDevice):
def _add(self, member):
self.setup()
- if self.level.has_redundancy:
+ if self.level is raid.Container or self.level.has_redundancy():
raid_devices = None
else:
raid_devices = self.memberDevices
--
1.9.3
More information about the anaconda-patches
mailing list