]> git.proxmox.com Git - ceph.git/blame - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_bluestore.py
import 15.2.5
[ceph.git] / ceph / src / ceph-volume / ceph_volume / tests / devices / lvm / strategies / test_bluestore.py
CommitLineData
91327a77
AA
1import pytest
2from ceph_volume.devices.lvm.strategies import bluestore
eafe8130 3from ceph_volume.api import lvm
91327a77
AA
4
5
6class TestSingleType(object):
7
8 def test_hdd_device_is_large_enough(self, fakedevice, factory):
11fdf7f2
TL
9 args = factory(filtered_devices=[], osds_per_device=1,
10 block_db_size=None, osd_ids=[])
91327a77 11 devices = [
81eedcae 12 fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77 13 ]
11fdf7f2 14 computed_osd = bluestore.SingleType.with_auto_devices(args, devices).computed['osds'][0]
91327a77
AA
15 assert computed_osd['data']['percentage'] == 100
16 assert computed_osd['data']['parts'] == 1
92f5a8d4 17 assert computed_osd['data']['human_readable_size'] == '5.00 GB'
91327a77
AA
18 assert computed_osd['data']['path'] == '/dev/sda'
19
20 def test_sdd_device_is_large_enough(self, fakedevice, factory):
11fdf7f2
TL
21 args = factory(filtered_devices=[], osds_per_device=1,
22 block_db_size=None, osd_ids=[])
91327a77 23 devices = [
81eedcae 24 fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
91327a77 25 ]
11fdf7f2 26 computed_osd = bluestore.SingleType.with_auto_devices(args, devices).computed['osds'][0]
91327a77
AA
27 assert computed_osd['data']['percentage'] == 100
28 assert computed_osd['data']['parts'] == 1
92f5a8d4 29 assert computed_osd['data']['human_readable_size'] == '5.00 GB'
91327a77
AA
30 assert computed_osd['data']['path'] == '/dev/sda'
31
32 def test_device_cannot_have_many_osds_per_device(self, fakedevice, factory):
11fdf7f2
TL
33 args = factory(filtered_devices=[], osds_per_device=3,
34 block_db_size=None, osd_ids=[])
91327a77 35 devices = [
81eedcae 36 fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
37 ]
38 with pytest.raises(RuntimeError) as error:
11fdf7f2 39 bluestore.SingleType.with_auto_devices(args, devices)
81eedcae 40 assert 'Unable to use device 5.66 GB /dev/sda' in str(error.value)
91327a77
AA
41
42 def test_device_is_lvm_member_fails(self, fakedevice, factory):
11fdf7f2
TL
43 args = factory(filtered_devices=[], osds_per_device=1,
44 block_db_size=None, osd_ids=[])
91327a77 45 devices = [
81eedcae 46 fakedevice(used_by_ceph=False, is_lvm_member=True, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
47 ]
48 with pytest.raises(RuntimeError) as error:
11fdf7f2 49 bluestore.SingleType.with_auto_devices(args, devices)
81eedcae 50 assert 'Unable to use device, already a member of LVM' in str(error.value)
91327a77
AA
51
52
11fdf7f2
TL
53class TestMixedType(object):
54
eafe8130 55 def test_filter_all_data_devs(self, fakedevice, factory, monkeypatch):
11fdf7f2
TL
56 # in this scenario the user passed a already used device to be used for
57 # data and an unused device to be used as db device.
81eedcae
TL
58 db_dev = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
59 data_dev = fakedevice(used_by_ceph=True, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
11fdf7f2
TL
60 args = factory(filtered_devices=[data_dev], osds_per_device=1,
61 block_db_size=None, block_wal_size=None,
62 osd_ids=[])
eafe8130 63 monkeypatch.setattr(lvm, 'VolumeGroup', lambda x, **kw: [])
11fdf7f2
TL
64 bluestore.MixedType(args, [], [db_dev], [])
65
66
91327a77
AA
67class TestMixedTypeConfiguredSize(object):
68 # uses a block.db size that has been configured via ceph.conf, instead of
69 # defaulting to 'as large as possible'
70
f6b5b4d7 71 def test_hdd_device_is_large_enough(self, fakedevice, factory, conf_ceph):
91327a77
AA
72 # 3GB block.db in ceph.conf
73 conf_ceph(get_safe=lambda *a: 3147483640)
11fdf7f2
TL
74 args = factory(filtered_devices=[], osds_per_device=1,
75 block_db_size=None, block_wal_size=None,
76 osd_ids=[])
81eedcae
TL
77 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
78 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
79 devices = [ssd, hdd]
80
11fdf7f2 81 osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0]
91327a77
AA
82 assert osd['data']['percentage'] == 100
83 assert osd['data']['human_readable_size'] == '5.66 GB'
84 assert osd['data']['path'] == '/dev/sda'
85 # a new vg will be created
86 assert osd['block.db']['path'] == 'vg: vg/lv'
87 assert osd['block.db']['percentage'] == 100
88
f6b5b4d7 89 def test_ssd_device_is_not_large_enough(self, fakedevice, factory, conf_ceph):
91327a77
AA
90 # 7GB block.db in ceph.conf
91 conf_ceph(get_safe=lambda *a: 7747483640)
11fdf7f2
TL
92 args = factory(filtered_devices=[], osds_per_device=1,
93 block_db_size=None, block_wal_size=None,
94 osd_ids=[])
81eedcae
TL
95 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
96 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
97 devices = [ssd, hdd]
98
99 with pytest.raises(RuntimeError) as error:
11fdf7f2 100 bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0]
91327a77 101 expected = 'Not enough space in fast devices (5.66 GB) to create 1 x 7.22 GB block.db LV'
81eedcae 102 assert expected in str(error.value)
91327a77 103
f6b5b4d7 104 def test_multi_hdd_device_is_not_large_enough(self, fakedevice, factory, conf_ceph):
91327a77
AA
105 # 3GB block.db in ceph.conf
106 conf_ceph(get_safe=lambda *a: 3147483640)
11fdf7f2
TL
107 args = factory(filtered_devices=[], osds_per_device=2,
108 block_db_size=None, block_wal_size=None,
109 osd_ids=[])
81eedcae
TL
110 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60737400000))
111 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
112 devices = [ssd, hdd]
113
114 with pytest.raises(RuntimeError) as error:
11fdf7f2 115 bluestore.MixedType.with_auto_devices(args, devices)
91327a77 116 expected = 'Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB'
81eedcae 117 assert expected in str(error.value)
91327a77
AA
118
119
120class TestMixedTypeLargeAsPossible(object):
121
f6b5b4d7 122 def test_hdd_device_is_large_enough(self, fakedevice, factory, conf_ceph):
91327a77 123 conf_ceph(get_safe=lambda *a: None)
11fdf7f2
TL
124 args = factory(filtered_devices=[], osds_per_device=1,
125 block_db_size=None, block_wal_size=None,
126 osd_ids=[])
81eedcae
TL
127 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
128 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
129 devices = [ssd, hdd]
130
11fdf7f2 131 osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0]
91327a77
AA
132 assert osd['data']['percentage'] == 100
133 assert osd['data']['human_readable_size'] == '5.66 GB'
134 assert osd['data']['path'] == '/dev/sda'
135 # a new vg will be created
136 assert osd['block.db']['path'] == 'vg: vg/lv'
137 # as large as possible
138 assert osd['block.db']['percentage'] == 100
139
f6b5b4d7 140 def test_multi_hdd_device_is_large_enough(self, fakedevice, factory, conf_ceph):
91327a77 141 conf_ceph(get_safe=lambda *a: None)
11fdf7f2
TL
142 args = factory(filtered_devices=[], osds_per_device=2,
143 block_db_size=None, block_wal_size=None,
144 osd_ids=[])
81eedcae
TL
145 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60073740000))
146 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000))
91327a77
AA
147 devices = [ssd, hdd]
148
11fdf7f2 149 osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0]
91327a77
AA
150 assert osd['data']['percentage'] == 50
151 assert osd['data']['human_readable_size'] == '27.97 GB'
152 assert osd['data']['path'] == '/dev/sda'
153 # a new vg will be created
154 assert osd['block.db']['path'] == 'vg: vg/lv'
155 # as large as possible
156 assert osd['block.db']['percentage'] == 50
157
f6b5b4d7 158 def test_multi_hdd_device_is_not_large_enough(self, fakedevice, factory, conf_ceph):
91327a77 159 conf_ceph(get_safe=lambda *a: None)
11fdf7f2
TL
160 args = factory(filtered_devices=[], osds_per_device=2,
161 block_db_size=None, block_wal_size=None,
162 osd_ids=[])
81eedcae
TL
163 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60737400000))
164 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
91327a77
AA
165 devices = [ssd, hdd]
166
167 with pytest.raises(RuntimeError) as error:
11fdf7f2 168 bluestore.MixedType.with_auto_devices(args, devices)
91327a77 169 expected = 'Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB'
81eedcae 170 assert expected in str(error.value)
11fdf7f2
TL
171
172
173class TestMixedTypeWithExplicitDevices(object):
174
f6b5b4d7 175 def test_multi_hdd_device_is_large_enough(self, fakedevice, factory, conf_ceph):
11fdf7f2
TL
176 conf_ceph(get_safe=lambda *a: None)
177 args = factory(filtered_devices=[], osds_per_device=2,
178 block_db_size=None, block_wal_size=None,
179 osd_ids=[])
81eedcae
TL
180 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60073740000))
181 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000))
11fdf7f2
TL
182
183 osd = bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0]
184 assert osd['data']['percentage'] == 50
185 assert osd['data']['human_readable_size'] == '27.97 GB'
186 assert osd['data']['path'] == '/dev/sda'
187 # a new vg will be created
188 assert osd['block.wal']['path'] == 'vg: vg/lv'
189 # as large as possible
190 assert osd['block.wal']['percentage'] == 50
191
f6b5b4d7 192 def test_wal_device_is_not_large_enough(self, fakedevice, factory, conf_ceph):
11fdf7f2
TL
193 conf_ceph(get_safe=lambda *a: None)
194 args = factory(filtered_devices=[], osds_per_device=2,
195 block_db_size=None, block_wal_size=None,
196 osd_ids=[])
81eedcae
TL
197 ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=1610612736))
198 hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000))
11fdf7f2
TL
199
200 with pytest.raises(RuntimeError) as error:
201 bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0]
202 expected = 'Unable to use device 1.50 GB /dev/sda, LVs would be smaller than 1GB'
81eedcae 203 assert expected in str(error.value), str(error)