those LVs would be large enough to accommodate a block.db
"""
# validate minimum size for all devices
- validators.minimum_device_size(self.devices, osds_per_device=self.osds_per_device)
+ validators.minimum_device_size(self.data_devs + self.db_or_journal_devs,
+ osds_per_device=self.osds_per_device)
+ validators.minimum_device_size(self.wal_devs,
+ osds_per_device=self.osds_per_device,
+ min_size=1)
# make sure that data devices do not have any LVs
validators.no_lvm_membership(self.data_devs)
from ceph_volume.api import lvm
-def minimum_device_size(devices, osds_per_device=1):
+def minimum_device_size(devices, osds_per_device=1, min_size=5):
"""
Ensure that the minimum requirements for this type of scenario is
met, raise an error if the provided devices would not work
"""
- msg = 'Unable to use device %s %s, LVs would be smaller than 5GB'
+ msg = 'Unable to use device %s %s, LVs would be smaller than {}GB'.format(min_size)
for device in devices:
device_size = disk.Size(b=device.lvm_size.b)
lv_size = device_size / osds_per_device
- if lv_size < disk.Size(gb=5):
+ if lv_size < disk.Size(gb=min_size):
raise RuntimeError(msg % (device_size, device.path))
bluestore.MixedType.with_auto_devices(args, devices)
expected = 'Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB'
assert expected in str(error)
+
+
+class TestMixedTypeWithExplicitDevices(object):
+
+ def test_multi_hdd_device_is_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph):
+ conf_ceph(get_safe=lambda *a: None)
+ args = factory(filtered_devices=[], osds_per_device=2,
+ block_db_size=None, block_wal_size=None,
+ osd_ids=[])
+ ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=60073740000))
+ hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=60073740000))
+
+ osd = bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0]
+ assert osd['data']['percentage'] == 50
+ assert osd['data']['human_readable_size'] == '27.97 GB'
+ assert osd['data']['path'] == '/dev/sda'
+ # a new vg will be created
+ assert osd['block.wal']['path'] == 'vg: vg/lv'
+ # as large as possible
+ assert osd['block.wal']['percentage'] == 50
+
+ def test_wal_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph):
+ conf_ceph(get_safe=lambda *a: None)
+ args = factory(filtered_devices=[], osds_per_device=2,
+ block_db_size=None, block_wal_size=None,
+ osd_ids=[])
+ ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=1610612736))
+ hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=60073740000))
+
+ with pytest.raises(RuntimeError) as error:
+ bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0]
+ expected = 'Unable to use device 1.50 GB /dev/sda, LVs would be smaller than 1GB'
+ assert expected in str(error), str(error)