From: Jan Fajerski Date: Thu, 24 Jan 2019 17:10:45 +0000 (+0100) Subject: ceph-volume: add a wal device specific unit test and size validator X-Git-Tag: v14.1.0~243^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=833c6a3ecfc11394a2ca12a36c98f2829c4581fa;p=ceph.git ceph-volume: add a wal device specific unit test and size validator Signed-off-by: Jan Fajerski --- diff --git a/src/ceph-volume/ceph_volume/devices/lvm/strategies/bluestore.py b/src/ceph-volume/ceph_volume/devices/lvm/strategies/bluestore.py index 0024d4428c9..07116661c57 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/strategies/bluestore.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/strategies/bluestore.py @@ -396,7 +396,11 @@ class MixedType(MixedStrategy): 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) diff --git a/src/ceph-volume/ceph_volume/devices/lvm/strategies/validators.py b/src/ceph-volume/ceph_volume/devices/lvm/strategies/validators.py index 3d01e577837..f67d6ffaa97 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/strategies/validators.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/strategies/validators.py @@ -2,16 +2,16 @@ from ceph_volume.util import disk 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)) diff --git a/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_bluestore.py b/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_bluestore.py index 1af580c631a..4f19405a762 100644 --- a/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_bluestore.py +++ b/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_bluestore.py @@ -153,3 +153,36 @@ class TestMixedTypeLargeAsPossible(object): 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)