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