]>
Commit | Line | Data |
---|---|---|
91327a77 AA |
1 | import pytest |
2 | from ceph_volume.devices.lvm.strategies import bluestore | |
eafe8130 | 3 | from ceph_volume.api import lvm |
91327a77 AA |
4 | |
5 | ||
6 | class 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 |
53 | class 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 |
67 | class 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 | ||
120 | class 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 | ||
173 | class 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) |