Skip to content

Commit de3c153

Browse files
committed
Allow using uninitialized disks in device factory
Fixes: #725 Fixes: #1030
1 parent a6f2156 commit de3c153

File tree

2 files changed

+48
-21
lines changed

2 files changed

+48
-21
lines changed

blivet/devicefactory.py

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,26 @@ def _set_container_members(self):
699699
def _set_container_raid_level(self):
700700
pass
701701

702+
def _filter_disks(self, disks, min_free, initialize=True):
703+
filtered_disks = []
704+
705+
for d in disks:
706+
if not d.partitioned and d.format.type is None and initialize:
707+
log.info("Partition set factory: initializing disk %s")
708+
self.storage.initialize_disk(d)
709+
710+
if not d.partitioned and d.format.type is not None:
711+
log.debug("Ignoring disk %s: format %s found on disk", d.name, d.format.type)
712+
if not d.format.supported:
713+
log.debug("Ignoring disk %s: format %s is not supported", d.name, d.format.name)
714+
elif d.format.free < min_free:
715+
log.debug("Ignoring disk %s: not enough free space. Required: %s, free: %s",
716+
d.name, min_free, d.format.free)
717+
else:
718+
filtered_disks.append(d)
719+
720+
return filtered_disks
721+
702722
#
703723
# properties and methods related to the factory device
704724
#
@@ -1086,15 +1106,7 @@ def _get_new_device(self, *args, **kwargs):
10861106
return device
10871107

10881108
def _configure(self):
1089-
disks = []
1090-
for disk in self.disks:
1091-
if not disk.partitioned:
1092-
log.debug("removing unpartitioned disk %s", disk.name)
1093-
elif not disk.format.supported:
1094-
log.debug("removing disk with unsupported format %s", disk.name)
1095-
else:
1096-
disks.append(disk)
1097-
1109+
disks = self._filter_disks(self.disks, min_free=Size(0))
10981110
if not disks:
10991111
raise DeviceFactoryError("no usable disks specified for partition")
11001112

@@ -1195,18 +1207,7 @@ def configure(self):
11951207

11961208
# drop any new disks that don't have free space
11971209
min_free = min(Size("500MiB"), self.parent_factory.size)
1198-
1199-
for d in add_disks:
1200-
if not d.partitioned:
1201-
log.debug("Ignoring disk %s: disk is not partitioned", d.name)
1202-
elif not d.format.supported:
1203-
log.debug("Ignoring disk %s: format %s is not supported", d.name, d.format.name)
1204-
elif d.format.free < min_free:
1205-
log.debug("Ignoring disk %s: not enough free space. Required: %s, free: %s",
1206-
d.name, min_free, d.format.free)
1207-
1208-
add_disks = [d for d in add_disks if d.partitioned and
1209-
d.format.supported and d.format.free >= min_free]
1210+
add_disks = self._filter_disks(add_disks, min_free)
12101211

12111212
log.debug("add_disks: %s", [d.name for d in add_disks])
12121213
log.debug("remove_disks: %s", [d.name for d in remove_disks])

tests/unit_tests/devicefactory_test.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ class DeviceFactoryTestCase(unittest.TestCase):
6060
def setUp(self, *args): # pylint: disable=unused-argument,arguments-differ
6161
if self.device_type is None:
6262
raise unittest.SkipTest("abstract base class")
63+
self._prepare_storage()
6364

65+
def _prepare_storage(self):
6466
self.b = blivet.Blivet() # don't populate it
6567
self.disk_files = [create_sparse_tempfile("factorytest", self._disk_size),
6668
create_sparse_tempfile("factorytest", self._disk_size)]
@@ -360,6 +362,18 @@ def _get_size_delta(self, devices=None):
360362
return delta
361363

362364

365+
class PartitionFactoryUnitializedTestCase(PartitionFactoryTestCase):
366+
def _prepare_storage(self):
367+
self.b = blivet.Blivet() # don't populate it
368+
self.disk_files = [create_sparse_tempfile("factorytest", self._disk_size),
369+
create_sparse_tempfile("factorytest", self._disk_size)]
370+
for filename in self.disk_files:
371+
disk = DiskFile(filename)
372+
self.b.devicetree._add_device(disk)
373+
374+
self.addCleanup(self._clean_up_disk_files)
375+
376+
363377
class LVMFactoryTestCase(DeviceFactoryTestCase):
364378
device_class = LVMLogicalVolumeDevice
365379
device_type = devicefactory.DeviceTypes.LVM
@@ -601,6 +615,18 @@ def test_lv_unique_name(self, *args): # pylint: disable=unused-argument,argumen
601615
self.assertEqual(device2.lvname, "name00")
602616

603617

618+
class LVMFactoryUninitializedTestCase(LVMFactoryTestCase):
619+
def _prepare_storage(self):
620+
self.b = blivet.Blivet() # don't populate it
621+
self.disk_files = [create_sparse_tempfile("factorytest", self._disk_size),
622+
create_sparse_tempfile("factorytest", self._disk_size)]
623+
for filename in self.disk_files:
624+
disk = DiskFile(filename)
625+
self.b.devicetree._add_device(disk)
626+
627+
self.addCleanup(self._clean_up_disk_files)
628+
629+
604630
class LVMThinPFactoryTestCase(LVMFactoryTestCase):
605631
# TODO: check that the LV we get is a thin pool
606632
device_class = LVMLogicalVolumeDevice

0 commit comments

Comments
 (0)