Apparently when I made pylint a part of my development process I stopped running the unit tests.
From: David Lehman dlehman@redhat.com
--- tests/storagetestcase.py | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/tests/storagetestcase.py b/tests/storagetestcase.py index 7ac48d3..8a2c89a 100644 --- a/tests/storagetestcase.py +++ b/tests/storagetestcase.py @@ -68,6 +68,9 @@ def partition_probe(device): self.partition_probe = PartitionDevice.probe PartitionDevice.probe = partition_probe
+ self.get_active_mounts = blivet.formats.fs.mountsCache._getActiveMounts + blivet.formats.fs.mountsCache._getActiveMounts = Mock() + def tearDown(self): blivet.devices.StorageDevice.status = self.storage_status blivet.devices.DMDevice.status = self.dm_status @@ -83,6 +86,8 @@ def tearDown(self):
blivet.devices.PartitionDevice.probe = self.partition_probe
+ blivet.formats.fs.mountsCache._getActiveMounts = self.get_active_mounts + def newDevice(self, *args, **kwargs): """ Return a new Device instance suitable for testing. """ device_class = kwargs.pop("device_class")
From: David Lehman dlehman@redhat.com
All of the RAID functionality is at the volume level. --- blivet/devices/btrfs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py index d336f91..f598a4b 100644 --- a/blivet/devices/btrfs.py +++ b/blivet/devices/btrfs.py @@ -474,7 +474,7 @@ def populateKSData(self, data): data.devices = ["btrfs.%d" % p.id for p in self.parents] data.preexist = self.exists
-class BTRFSSubVolumeDevice(BTRFSDevice, RaidDevice): +class BTRFSSubVolumeDevice(BTRFSDevice): """ A btrfs subvolume pseudo-device. """ _type = "btrfs subvolume" _formatImmutable = True
From: David Lehman dlehman@redhat.com
--- blivet/devices/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devices/storage.py b/blivet/devices/storage.py index 69d5274..a54c32a 100644 --- a/blivet/devices/storage.py +++ b/blivet/devices/storage.py @@ -111,6 +111,7 @@ def __init__(self, name, fmt=None, uuid=None, # The size will be overridden by a call to updateSize at the end of this # method for existing and active devices. self._size = Size(util.numeric_type(size)) + self._targetSize = self._size self._currentSize = self._size if self.exists else Size(0) self.major = util.numeric_type(major) self.minor = util.numeric_type(minor) @@ -126,7 +127,6 @@ def __init__(self, name, fmt=None, uuid=None, self.format = fmt self.originalFormat = copy.deepcopy(self.format) self.fstabComment = "" - self._targetSize = self._size
self.deviceLinks = []
From: David Lehman dlehman@redhat.com
MD firmware RAID has an intermediate layer (the container). RAID level checking and size calculation need to be able to access the list of member devices. --- blivet/devices/btrfs.py | 4 +++ blivet/devices/md.py | 15 ++++------ blivet/devices/raid.py | 6 ++-- tests/devices_test/device_properties_test.py | 42 ++++++++++++++-------------- 4 files changed, 34 insertions(+), 33 deletions(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py index f598a4b..02aeb0a 100644 --- a/blivet/devices/btrfs.py +++ b/blivet/devices/btrfs.py @@ -212,6 +212,10 @@ def __init__(self, *args, **kwargs):
self._defaultSubVolumeID = None
+ @property + def members(self): + return list(self.parents) + def _setLevel(self, value, data): """ Sets a valid level for this device and level type.
diff --git a/blivet/devices/md.py b/blivet/devices/md.py index b204e43..6425dd9 100644 --- a/blivet/devices/md.py +++ b/blivet/devices/md.py @@ -224,7 +224,7 @@ def size(self): """ if not self.exists or not self.mediaPresent: try: - size = self.level.get_size([d.size for d in self.devices], + size = self.level.get_size([d.size for d in self.members], self.memberDevices, self.chunkSize, self.getSuperBlockSize) @@ -436,11 +436,6 @@ def complete(self): """ return (self.memberDevices <= len(self.members)) or not self.exists
- @property - def devices(self): - """ Return a list of this array's member device instances. """ - return self.parents - def _postSetup(self): super(MDRaidArrayDevice, self)._postSetup() self.updateSysfsPath() @@ -450,7 +445,7 @@ def _setup(self, orig=False): log_method_call(self, self.name, orig=orig, status=self.status, controllable=self.controllable) disks = [] - for member in self.devices: + for member in self.members: member.setup(orig=orig) disks.append(member.path)
@@ -500,14 +495,14 @@ def _postCreate(self): # XXX this won't work for containers since no UUID is reported for them info = blockdev.md.detail(self.path) self.uuid = info.uuid - for member in self.devices: + for member in self.members: member.format.mdUuid = self.uuid
def _create(self): """ Create the device. """ log_method_call(self, self.name, status=self.status) - disks = [disk.path for disk in self.devices] - spares = len(self.devices) - self.memberDevices + disks = [disk.path for disk in self.members] + spares = len(self.members) - self.memberDevices level = None if self.level: level = str(self.level) diff --git a/blivet/devices/raid.py b/blivet/devices/raid.py index 60fb5a2..85e1ece 100644 --- a/blivet/devices/raid.py +++ b/blivet/devices/raid.py @@ -31,6 +31,8 @@ @add_metaclass(abc.ABCMeta) class RaidDevice(StorageDevice): """ Metaclass for devices that support RAID in some form. """ + members = abc.abstractproperty(lambda s: [], + doc="A list of the member device instances")
def _validateRaidLevel(self, level, parent_diff=0): """ Returns an error message if the RAID level is invalid for this @@ -47,8 +49,8 @@ def _validateRaidLevel(self, level, parent_diff=0): number of parents. The number is positive for added parents, negative for removed parents. """ - num_parents = len(self.parents) + parent_diff - if not self.exists and num_parents < level.min_members: + num_members = len(self.members) + parent_diff # pylint: disable=no-member + if not self.exists and num_members < level.min_members: message = P_( "RAID level %(raidLevel)s requires that device have at least %(minMembers)d member.", "RAID level %(raidLevel)s requires that device have at least %(minMembers)d members.", diff --git a/tests/devices_test/device_properties_test.py b/tests/devices_test/device_properties_test.py index aad60a1..a72f27d 100644 --- a/tests/devices_test/device_properties_test.py +++ b/tests/devices_test/device_properties_test.py @@ -112,12 +112,12 @@ def __init__(self, methodName='runTest'): state_functions = { "createBitmap" : xform(lambda d, a: self.assertFalse), "description" : xform(self.assertIsNotNone), - "devices" : xform(lambda x, m: self.assertEqual(len(x), 0, m) and - self.assertIsInstance(x, ParentList, m)), "formatClass" : xform(self.assertIsNotNone), "level" : xform(self.assertIsNone), "mdadmFormatUUID" : xform(self.assertIsNone), "memberDevices" : xform(lambda x, m: self.assertEqual(x, 0, m)), + "members" : xform(lambda x, m: self.assertEqual(len(x), 0, m) and + self.assertIsInstance(x, list, m)), "metadataVersion" : xform(lambda x, m: self.assertEqual(x, "default", m)), "spares" : xform(lambda x, m: self.assertEqual(x, 0, m)), "totalDevices" : xform(lambda x, m: self.assertEqual(x, 0, m)) @@ -365,35 +365,35 @@ def testMDRaidArrayDeviceInit(self): ## level tests ## self.stateCheck(self.dev1, - devices=xform(lambda x, m: self.assertEqual(len(x), 1, m)), level=xform(lambda x, m: self.assertEqual(x.name, "container", m)), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), mediaPresent=xform(self.assertFalse), + members=xform(lambda x, m: self.assertEqual(len(x), 1, m)), type=xform(lambda x, m: self.assertEqual(x, "mdcontainer", m))) self.stateCheck(self.dev2, createBitmap=xform(self.assertFalse), - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 2, m))) self.stateCheck(self.dev3, - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 2, m))) self.stateCheck(self.dev4, - devices=xform(lambda x, m: self.assertEqual(len(x), 3, m)), level=xform(lambda x, m: self.assertEqual(x.number, 4, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 3, m))) self.stateCheck(self.dev5, - devices=xform(lambda x, m: self.assertEqual(len(x), 3, m)), level=xform(lambda x, m: self.assertEqual(x.number, 5, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 3, m))) self.stateCheck(self.dev6, - devices=xform(lambda x, m: self.assertEqual(len(x), 4, m)), level=xform(lambda x, m: self.assertEqual(x.number, 6, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 4, m))) self.stateCheck(self.dev7, - devices=xform(lambda x, m: self.assertEqual(len(x), 4, m)), level=xform(lambda x, m: self.assertEqual(x.number, 10, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 4, m)))
## @@ -410,10 +410,10 @@ def testMDRaidArrayDeviceInit(self): ## self.stateCheck(self.dev9, createBitmap=xform(self.assertFalse), - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), isDisk=xform(self.assertTrue), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), partitionable=xform(self.assertTrue), totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), @@ -424,16 +424,16 @@ def testMDRaidArrayDeviceInit(self): ## self.stateCheck(self.dev10, createBitmap=xform(self.assertFalse), - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 2, m)), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)))
self.stateCheck(self.dev11, - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), isDisk=xform(self.assertTrue), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), partitionable=xform(self.assertTrue), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), @@ -441,10 +441,10 @@ def testMDRaidArrayDeviceInit(self): type=xform(lambda x, m: self.assertEqual(x, "mdbiosraidarray", m)))
self.stateCheck(self.dev12, - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), isDisk=xform(self.assertTrue), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), partitionable=xform(self.assertTrue), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), @@ -453,9 +453,9 @@ def testMDRaidArrayDeviceInit(self):
self.stateCheck(self.dev13, createBitmap=xform(self.assertFalse), - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("3 MiB"), m)), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), @@ -463,60 +463,60 @@ def testMDRaidArrayDeviceInit(self):
self.stateCheck(self.dev14, createBitmap=xform(self.assertTrue), - devices=xform(lambda x, m: self.assertEqual(len(x), 3, m)), level=xform(lambda x, m: self.assertEqual(x.number, 4, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 3, m)))
self.stateCheck(self.dev15, createBitmap=xform(self.assertTrue), - devices=xform(lambda x, m: self.assertEqual(len(x), 3, m)), level=xform(lambda x, m: self.assertEqual(x.number, 5, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 3, m)))
self.stateCheck(self.dev16, createBitmap=xform(self.assertTrue), - devices=xform(lambda x, m: self.assertEqual(len(x), 4, m)), level=xform(lambda x, m: self.assertEqual(x.number, 6, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 4, m)))
self.stateCheck(self.dev17, createBitmap=xform(self.assertTrue), - devices=xform(lambda x, m: self.assertEqual(len(x), 4, m)), level=xform(lambda x, m: self.assertEqual(x.number, 10, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 4, m)))
self.stateCheck(self.dev18, createBitmap=xform(self.assertTrue), - devices=xform(lambda x, m: self.assertEqual(len(x), 4, m)), level=xform(lambda x, m: self.assertEqual(x.number, 10, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), spares=xform(lambda x, m: self.assertEqual(x, 1, m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 5, m)))
self.stateCheck(self.dev19, - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), mdadmFormatUUID=xform(lambda x, m: self.assertEqual(x, blockdev.md.get_md_uuid(self.dev19.uuid), m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 2, m)), uuid=xform(lambda x, m: self.assertEqual(x, self.dev19.uuid, m)))
self.stateCheck(self.dev20, - devices=xform(lambda x, m: self.assertEqual(len(x), 2, m)), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), + members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 2, m)), uuid=xform(lambda x, m: self.assertEqual(x, self.dev20.uuid, m)))
From: David Lehman dlehman@redhat.com
--- blivet/devices/md.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/blivet/devices/md.py b/blivet/devices/md.py index e4156f8..b204e43 100644 --- a/blivet/devices/md.py +++ b/blivet/devices/md.py @@ -556,11 +556,11 @@ def model(self):
@property def partitionable(self): - return self.exists and all(p.partitionable for p in self.parents) + return self.exists and self.parents and all(p.partitionable for p in self.members)
@property def isDisk(self): - return self.exists and all(p.isDisk for p in self.parents) + return self.exists and self.parents and all(p.isDisk for p in self.members)
def dracutSetupArgs(self): return set(["rd.md.uuid=%s" % self.mdadmFormatUUID])
From: David Lehman dlehman@redhat.com
--- tests/devices_test/lvm_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/devices_test/lvm_test.py b/tests/devices_test/lvm_test.py index 5acee64..e8d0290 100644 --- a/tests/devices_test/lvm_test.py +++ b/tests/devices_test/lvm_test.py @@ -47,9 +47,9 @@ def testLVMSnapShotDeviceInit(self): lv.exists = True snap1 = LVMSnapShotDevice("snap1", parents=[vg], origin=lv)
- self.assertEqual(snap1.format, lv.format) - snap1.format = blivet.formats.getFormat("DM_snapshot_cow", exists=True) - self.assertEqual(snap1.format, lv.format) + self.assertEqual(snap1.format.type, lv.format.type) + lv.format = blivet.formats.getFormat("DM_snapshot_cow", exists=True) + self.assertEqual(snap1.format.type, lv.format.type)
self.assertEqual(snap1.isleaf, True) self.assertEqual(snap1.direct, True)
From: David Lehman dlehman@redhat.com
--- blivet/devices/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devices/storage.py b/blivet/devices/storage.py index a54c32a..8872961 100644 --- a/blivet/devices/storage.py +++ b/blivet/devices/storage.py @@ -106,7 +106,7 @@ def __init__(self, name, fmt=None, uuid=None,
super(StorageDevice, self).__init__(name, parents=parents)
- self._format = None + self._format = getFormat(None)
# The size will be overridden by a call to updateSize at the end of this # method for existing and active devices.
From: David Lehman dlehman@redhat.com
--- blivet/devices/md.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/blivet/devices/md.py b/blivet/devices/md.py index 6425dd9..592936a 100644 --- a/blivet/devices/md.py +++ b/blivet/devices/md.py @@ -297,7 +297,8 @@ def _setMemberDevices(self, number): raise ValueError("memberDevices cannot be greater than totalDevices") self._memberDevices = number
- memberDevices = property(_getMemberDevices, _setMemberDevices, + memberDevices = property(lambda d: d._getMemberDevices(), + lambda d, m: d._setMemberDevices(m), doc="number of member devices")
def _getSpares(self): @@ -655,7 +656,35 @@ def members(self): # If the array is a BIOS RAID array then its unique parent # is a container and its actual member devices are the # container's parents. - return list(self.parents[0].parents) + return self.parents[0].members + + @property + def devices(self): + return self.parents[0].devices + + @property + def totalDevices(self): + return self.parents[0].totalDevices + + def _getMemberDevices(self): + return self.parents[0].memberDevices + + def _addParent(self, member): + # pylint: disable=bad-super-call + super(MDRaidArrayDevice, self)._addParent(member) + + if self.status and member.format.exists: + # we always probe since the device may not be set up when we want + # information about it + self._size = self.currentSize + + def _removeParent(self, member): + error_msg = self._validateParentRemoval(self.level, member) + if error_msg: + raise errors.DeviceError(error_msg) + + # pylint: disable=bad-super-call + super(MDRaidArrayDevice, self)._removeParent(member)
def teardown(self, recursive=None): log_method_call(self, self.name, status=self.status,
From: David Lehman dlehman@redhat.com
The MD classes have a circular dependency between level, parents, size, and format. Setting the format a bit late is a simple way to break it. --- blivet/devices/md.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/blivet/devices/md.py b/blivet/devices/md.py index 592936a..6efafe9 100644 --- a/blivet/devices/md.py +++ b/blivet/devices/md.py @@ -106,7 +106,7 @@ def __init__(self, name, level=None, major=None, minor=None, size=None, # avoid attribute-defined-outside-init pylint warning self._level = None
- super(MDRaidArrayDevice, self).__init__(name, fmt=fmt, uuid=uuid, + super(MDRaidArrayDevice, self).__init__(name, uuid=uuid, exists=exists, size=size, parents=parents, sysfsPath=sysfsPath) @@ -131,6 +131,8 @@ def __init__(self, name, level=None, major=None, minor=None, size=None, else: self.metadataVersion = metadataVersion
+ self.format = fmt + if self.parents and self.parents[0].type == "mdcontainer" and self.type != "mdbiosraidarray": raise errors.DeviceError("A device with mdcontainer member must be mdbiosraidarray.")
From: David Lehman dlehman@redhat.com
It also fixes several of the MD property tests that weren't doing anything useful. --- tests/devices_test/dependencies_test.py | 6 +- tests/devices_test/device_properties_test.py | 182 +++++++++++++-------------- 2 files changed, 90 insertions(+), 98 deletions(-)
diff --git a/tests/devices_test/dependencies_test.py b/tests/devices_test/dependencies_test.py index 78d3416..1547d28 100644 --- a/tests/devices_test/dependencies_test.py +++ b/tests/devices_test/dependencies_test.py @@ -15,6 +15,8 @@
from blivet.formats import getFormat
+from blivet.size import Size + from blivet.tasks import availability
class DeviceDependenciesTestCase(unittest.TestCase): @@ -37,10 +39,10 @@ class MockingDeviceDependenciesTestCase(unittest.TestCase): """Test availability of external device dependencies. """
def setUp(self): - dev1 = DiskDevice("name", fmt=getFormat("mdmember")) + dev1 = DiskDevice("name", fmt=getFormat("mdmember"), size=Size("1 GiB")) dev2 = DiskDevice("other") self.part = PartitionDevice("part", fmt=getFormat("mdmember"), parents=[dev2]) - self.dev = MDRaidArrayDevice("dev", level="raid1", parents=[dev1, self.part], fmt=getFormat("luks")) + self.dev = MDRaidArrayDevice("dev", level="raid1", parents=[dev1, self.part], fmt=getFormat("luks"), totalDevices=2, memberDevices=2) self.luks = LUKSDevice("luks", parents=[self.dev], fmt=getFormat("ext4"))
self.mdraid_method = availability.BLOCKDEV_MDRAID_PLUGIN._method diff --git a/tests/devices_test/device_properties_test.py b/tests/devices_test/device_properties_test.py index a72f27d..db51110 100644 --- a/tests/devices_test/device_properties_test.py +++ b/tests/devices_test/device_properties_test.py @@ -25,10 +25,13 @@ from blivet.devices import StorageDevice from blivet.devices import ParentList from blivet.devicelibs import btrfs +from blivet.devicelibs import mdraid from blivet.size import Size
from blivet.formats import getFormat
+BTRFS_MIN_MEMBER_SIZE = getFormat("btrfs").minSize + def xform(func): """ Simple wrapper function that transforms a function that takes a precalculated value and a message to a function that takes @@ -125,16 +128,22 @@ def __init__(self, methodName='runTest'): self._state_functions.update(state_functions)
def setUp(self): + self.md_chunk_size = mdraid.MD_CHUNK_SIZE + mdraid.MD_CHUNK_SIZE = Size("1 MiB") + self.get_super_block_size = MDRaidArrayDevice.getSuperBlockSize + MDRaidArrayDevice.getSuperBlockSize = lambda a, s: Size(0) + parents = [ DiskDevice("name1", fmt=getFormat("mdmember")) ] - self.dev1 = MDContainerDevice("dev1", level="container", parents=parents) + self.dev1 = MDContainerDevice("dev1", level="container", parents=parents, totalDevices=1, memberDevices=1)
parents = [ - DiskDevice("name1", fmt=getFormat("mdmember")), - DiskDevice("name2", fmt=getFormat("mdmember")) + DiskDevice("name1", fmt=getFormat("mdmember"), size=Size("1 GiB")), + DiskDevice("name2", fmt=getFormat("mdmember"), size=Size("1 GiB")) ] - self.dev2 = MDRaidArrayDevice("dev2", level="raid0", parents=parents) + self.dev2 = MDRaidArrayDevice("dev2", level="raid0", parents=parents, + totalDevices=2, memberDevices=2)
parents = [ DiskDevice("name1", fmt=getFormat("mdmember")), @@ -176,29 +185,23 @@ def setUp(self):
parents_1 = [ - DiskDevice("name1", fmt=getFormat("mdmember")) + DiskDevice("name1", fmt=getFormat("mdmember")), + DiskDevice("name2", fmt=getFormat("mdmember")) ] dev_1 = MDContainerDevice( "parent", level="container", - parents=parents_1 - ) - parents_2 = [ - DiskDevice("name1", fmt=getFormat("mdmember")), - DiskDevice("name2", fmt=getFormat("mdmember")) - ] - dev_2 = MDRaidArrayDevice( - "other", - level=0, - fmt=getFormat("mdmember"), - parents=parents_2 + parents=parents_1, + totalDevices=2, + memberDevices=2 ) self.dev9 = MDBiosRaidArrayDevice( "dev9", level="raid0", - memberDevices=2, - parents=[dev_1, dev_2], - totalDevices=2 + memberDevices=1, + parents=[dev_1], + totalDevices=1, + exists=True )
parents = [ @@ -212,55 +215,34 @@ def setUp(self): size=Size("32 MiB"))
parents_1 = [ - DiskDevice("name1", fmt=getFormat("mdmember")) + DiskDevice("name1", fmt=getFormat("mdmember")), + DiskDevice("name2", fmt=getFormat("mdmember")) ] dev_1 = MDContainerDevice( "parent", level="container", - parents=parents - ) - parents_2 = [ - DiskDevice("name1", fmt=getFormat("mdmember")), - DiskDevice("name2", fmt=getFormat("mdmember")) - ] - dev_2 = MDRaidArrayDevice( - "other", - level=0, - fmt=getFormat("mdmember"), - parents=parents_2 + parents=parents, + totalDevices=2, + memberDevices=2 ) self.dev11 = MDBiosRaidArrayDevice( "dev11", level=1, - memberDevices=2, - parents=[dev_1, dev_2], - size=Size("32 MiB"), - totalDevices=2) - - self.dev12 = MDBiosRaidArrayDevice( - "dev12", - level=1, - memberDevices=2, - parents=[ - Mock(**{"type": "mdcontainer", - "size": Size("4 MiB"), - "format": getFormat(None)}), - Mock(**{"size": Size("2 MiB"), - "format": getFormat("mdmember")})], - size=Size("32 MiB"), - totalDevices=2) + exists=True, + parents=[dev_1], + size=Size("32 MiB"))
self.dev13 = MDRaidArrayDevice( "dev13", level=0, - memberDevices=3, + memberDevices=2, parents=[ Mock(**{"size": Size("4 MiB"), "format": getFormat("mdmember")}), Mock(**{"size": Size("2 MiB"), "format": getFormat("mdmember")})], size=Size("32 MiB"), - totalDevices=3) + totalDevices=2)
self.dev14 = MDRaidArrayDevice( "dev14", @@ -355,6 +337,10 @@ def setUp(self): uuid='Just-pretending' )
+ def tearDown(self): + mdraid.MD_CHUNK_SIZE = self.md_chunk_size + MDRaidArrayDevice.getSuperBlockSize = self.get_super_block_size + def testMDRaidArrayDeviceInit(self): """Tests the state of a MDRaidArrayDevice after initialization. For some combinations of arguments the initializer will throw @@ -367,14 +353,19 @@ def testMDRaidArrayDeviceInit(self): self.stateCheck(self.dev1, level=xform(lambda x, m: self.assertEqual(x.name, "container", m)), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - mediaPresent=xform(self.assertFalse), + memberDevices=xform(lambda x, m: self.assertEqual(x, 1, m)), members=xform(lambda x, m: self.assertEqual(len(x), 1, m)), + mediaPresent=xform(self.assertFalse), + totalDevices=xform(lambda x, m: self.assertEqual(x, 1, m)), type=xform(lambda x, m: self.assertEqual(x, "mdcontainer", m))) self.stateCheck(self.dev2, createBitmap=xform(self.assertFalse), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), + memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), - parents=xform(lambda x, m: self.assertEqual(len(x), 2, m))) + size=xform(lambda x, m: self.assertEqual(x, Size("2 GiB"), m)), + parents=xform(lambda x, m: self.assertEqual(len(x), 2, m)), + totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m))) self.stateCheck(self.dev3, level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), @@ -411,9 +402,11 @@ def testMDRaidArrayDeviceInit(self): self.stateCheck(self.dev9, createBitmap=xform(self.assertFalse), isDisk=xform(self.assertTrue), + exists=xform(self.assertTrue), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), + metadataVersion=xform(lambda x, m: self.assertEqual(x, None, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), partitionable=xform(self.assertTrue), totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), @@ -431,35 +424,29 @@ def testMDRaidArrayDeviceInit(self):
self.stateCheck(self.dev11, isDisk=xform(self.assertTrue), + exists=xform(lambda x, m: self.assertEqual(x, True, m)), level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), + currentSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), + maxSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), + metadataVersion=xform(lambda x, m: self.assertEqual(x, None, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), partitionable=xform(self.assertTrue), + size=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), type=xform(lambda x, m: self.assertEqual(x, "mdbiosraidarray", m)))
- self.stateCheck(self.dev12, - isDisk=xform(self.assertTrue), - level=xform(lambda x, m: self.assertEqual(x.number, 1, m)), - memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), - members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), - parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - partitionable=xform(self.assertTrue), - targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), - totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), - type = xform(lambda x, m: self.assertEqual(x, "mdbiosraidarray", m))) - self.stateCheck(self.dev13, createBitmap=xform(self.assertFalse), level=xform(lambda x, m: self.assertEqual(x.number, 0, m)), - memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), + memberDevices=xform(lambda x, m: self.assertEqual(x, 2, m)), members=xform(lambda x, m: self.assertEqual(len(x), 2, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("3 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), targetSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), - totalDevices=xform(lambda x, m: self.assertEqual(x, 3, m))) + totalDevices=xform(lambda x, m: self.assertEqual(x, 2, m)))
self.stateCheck(self.dev14, createBitmap=xform(self.assertTrue), @@ -467,7 +454,7 @@ def testMDRaidArrayDeviceInit(self): memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 3, m)))
self.stateCheck(self.dev15, @@ -476,7 +463,7 @@ def testMDRaidArrayDeviceInit(self): memberDevices=xform(lambda x, m: self.assertEqual(x, 3, m)), members=xform(lambda x, m: self.assertEqual(len(x), 3, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 3, m)))
self.stateCheck(self.dev16, @@ -485,7 +472,7 @@ def testMDRaidArrayDeviceInit(self): memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 4, m)))
self.stateCheck(self.dev17, @@ -494,7 +481,7 @@ def testMDRaidArrayDeviceInit(self): memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 4, m)))
self.stateCheck(self.dev18, @@ -503,7 +490,7 @@ def testMDRaidArrayDeviceInit(self): memberDevices=xform(lambda x, m: self.assertEqual(x, 4, m)), members=xform(lambda x, m: self.assertEqual(len(x), 4, m)), parents=xform(lambda x, m: self.assertNotEqual(x, [], m)), - size=xform(lambda x, m: self.assertEqual(x, Size("2 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("4 MiB"), m)), spares=xform(lambda x, m: self.assertEqual(x, 1, m)), totalDevices=xform(lambda x, m: self.assertEqual(x, 5, m)))
@@ -573,7 +560,7 @@ def setUp(self): self.dev1 = BTRFSVolumeDevice("dev1", parents=[StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), - size=btrfs.MIN_MEMBER_SIZE)]) + size=BTRFS_MIN_MEMBER_SIZE)])
self.dev2 = BTRFSSubVolumeDevice("dev2", parents=[self.dev1], @@ -581,7 +568,7 @@ def setUp(self):
dev = StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), - size=Size("32 MiB")) + size=Size("500 MiB")) self.dev3 = BTRFSVolumeDevice("dev3", parents=[dev])
@@ -592,51 +579,53 @@ def testBTRFSDeviceInit(self): """
self.stateCheck(self.dev1, - currentSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + currentSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), dataLevel=xform(self.assertIsNone), isleaf=xform(self.assertFalse), - maxSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + maxSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), metaDataLevel=xform(self.assertIsNone), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - size=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + size=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), type=xform(lambda x, m: self.assertEqual(x, "btrfs volume", m)))
self.stateCheck(self.dev2, - currentSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), - maxSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + targetSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), + currentSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), + maxSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - size=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + size=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), type=xform(lambda x, m: self.assertEqual(x, "btrfs subvolume", m)), vol_id=xform(self.assertIsNone))
self.stateCheck(self.dev3, - currentSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), + currentSize=xform(lambda x, m: self.assertEqual(x, Size("500 MiB"), m)), dataLevel=xform(self.assertIsNone), - maxSize=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), + maxSize=xform(lambda x, m: self.assertEqual(x, Size("500 MiB"), m)), metaDataLevel=xform(self.assertIsNone), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - size=xform(lambda x, m: self.assertEqual(x, Size("32 MiB"), m)), + size=xform(lambda x, m: self.assertEqual(x, Size("500 MiB"), m)), type=xform(lambda x, m: self.assertEqual(x, "btrfs volume", m)))
with self.assertRaisesRegex(ValueError, "BTRFSDevice.*must have at least one parent"): BTRFSVolumeDevice("dev")
with self.assertRaisesRegex(ValueError, "format"): - BTRFSVolumeDevice("dev", parents=[StorageDevice("deva", size=btrfs.MIN_MEMBER_SIZE)]) + BTRFSVolumeDevice("dev", parents=[StorageDevice("deva", size=BTRFS_MIN_MEMBER_SIZE)])
with self.assertRaisesRegex(DeviceError, "btrfs subvolume.*must be a btrfs volume"): fmt = blivet.formats.getFormat("btrfs") - device = StorageDevice("deva", fmt=fmt, size=btrfs.MIN_MEMBER_SIZE) + device = StorageDevice("deva", fmt=fmt, size=BTRFS_MIN_MEMBER_SIZE) BTRFSSubVolumeDevice("dev1", parents=[device])
- deva = OpticalDevice("deva", fmt=blivet.formats.getFormat("btrfs")) + deva = OpticalDevice("deva", fmt=blivet.formats.getFormat("btrfs", exists=True), + exists=True) with self.assertRaisesRegex(BTRFSValueError, "at least"): BTRFSVolumeDevice("dev1", dataLevel="raid1", parents=[deva])
- deva = StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), size=btrfs.MIN_MEMBER_SIZE) + deva = StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), size=BTRFS_MIN_MEMBER_SIZE) self.assertIsNotNone(BTRFSVolumeDevice("dev1", metaDataLevel="dup", parents=[deva]))
- deva = StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), size=btrfs.MIN_MEMBER_SIZE) + deva = StorageDevice("deva", fmt=blivet.formats.getFormat("btrfs"), size=BTRFS_MIN_MEMBER_SIZE) with self.assertRaisesRegex(BTRFSValueError, "invalid"): BTRFSVolumeDevice("dev1", dataLevel="dup", parents=[deva])
@@ -663,10 +652,10 @@ def testBTRFSDeviceMethods(self):
# size with self.assertRaisesRegex(RuntimeError, "cannot directly set size of btrfs volume"): - self.dev1.size = 32 + self.dev1.size = Size("500 MiB")
def testBTRFSSnapShotDeviceInit(self): - parents = [StorageDevice("p1", fmt=blivet.formats.getFormat("btrfs"), size=btrfs.MIN_MEMBER_SIZE)] + parents = [StorageDevice("p1", fmt=blivet.formats.getFormat("btrfs"), size=BTRFS_MIN_MEMBER_SIZE)] vol = BTRFSVolumeDevice("test", parents=parents) with self.assertRaisesRegex(ValueError, "non-existent btrfs snapshots must have a source"): BTRFSSnapShotDevice("snap1", parents=[vol]) @@ -677,7 +666,7 @@ def testBTRFSSnapShotDeviceInit(self): with self.assertRaisesRegex(ValueError, "btrfs snapshot source must be a btrfs subvolume"): BTRFSSnapShotDevice("snap1", parents=[vol], source=parents[0])
- parents2 = [StorageDevice("p1", fmt=blivet.formats.getFormat("btrfs"), size=btrfs.MIN_MEMBER_SIZE)] + parents2 = [StorageDevice("p1", fmt=blivet.formats.getFormat("btrfs"), size=BTRFS_MIN_MEMBER_SIZE)] vol2 = BTRFSVolumeDevice("test2", parents=parents2, exists=True) with self.assertRaisesRegex(ValueError, ".*snapshot and source must be in the same volume"): BTRFSSnapShotDevice("snap1", parents=[vol], source=vol2) @@ -688,21 +677,22 @@ def testBTRFSSnapShotDeviceInit(self): parents=[vol], source=vol) self.stateCheck(snap, - currentSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), - maxSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + currentSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), + targetSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), + maxSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - size=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + size=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), type=xform(lambda x, m: self.assertEqual(x, "btrfs snapshot", m)), vol_id=xform(self.assertIsNone)) self.stateCheck(vol, - currentSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + currentSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), dataLevel=xform(self.assertIsNone), exists=xform(self.assertTrue), isleaf=xform(self.assertFalse), - maxSize=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + maxSize=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), metaDataLevel=xform(self.assertIsNone), parents=xform(lambda x, m: self.assertEqual(len(x), 1, m)), - size=xform(lambda x, m: self.assertEqual(x, btrfs.MIN_MEMBER_SIZE, m)), + size=xform(lambda x, m: self.assertEqual(x, BTRFS_MIN_MEMBER_SIZE, m)), type=xform(lambda x, m: self.assertEqual(x, "btrfs volume", m)))
self.assertEqual(snap.isleaf, True)
Added label: ACK.
Looks good to me too.
Closed.
I pushed this today. For some reason I had it in my mind that, since it was for anaconda, I had to rebase instead of merge. Whatever.
anaconda-patches@lists.fedorahosted.org