]>
Commit | Line | Data |
---|---|---|
91327a77 AA |
1 | import pytest |
2 | from ceph_volume.devices.lvm.strategies import filestore | |
3 | from ceph_volume.api import lvm | |
4 | ||
5 | ||
6 | class TestSingleType(object): | |
7 | ||
8 | def test_hdd_device_is_large_enough(self, fakedevice, factory, conf_ceph): | |
9 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
10 | args = factory(filtered_devices=[], osds_per_device=1, |
11 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
12 | devices = [ |
13 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=12073740000)) | |
14 | ] | |
11fdf7f2 | 15 | computed_osd = filestore.SingleType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
16 | assert computed_osd['data']['percentage'] == 55 |
17 | assert computed_osd['data']['parts'] == 1 | |
18 | assert computed_osd['data']['human_readable_size'] == '6.24 GB' | |
19 | assert computed_osd['data']['path'] == '/dev/sda' | |
20 | ||
21 | def test_hdd_device_with_large_journal(self, fakedevice, factory, conf_ceph): | |
22 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
23 | args = factory(filtered_devices=[], osds_per_device=1, |
24 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
25 | devices = [ |
26 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
27 | ] | |
28 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 29 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
30 | msg = "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB" |
31 | assert msg in str(error) | |
32 | ||
33 | def test_ssd_device_is_large_enough(self, fakedevice, factory, conf_ceph): | |
34 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
35 | args = factory(filtered_devices=[], osds_per_device=1, |
36 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
37 | devices = [ |
38 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=12073740000)) | |
39 | ] | |
11fdf7f2 | 40 | computed_osd = filestore.SingleType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
41 | assert computed_osd['data']['percentage'] == 55 |
42 | assert computed_osd['data']['parts'] == 1 | |
43 | assert computed_osd['data']['human_readable_size'] == '6.24 GB' | |
44 | assert computed_osd['data']['path'] == '/dev/sda' | |
45 | ||
46 | def test_ssd_device_with_large_journal(self, fakedevice, factory, conf_ceph): | |
47 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
48 | args = factory(filtered_devices=[], osds_per_device=1, |
49 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
50 | devices = [ |
51 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)) | |
52 | ] | |
53 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 54 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
55 | msg = "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB" |
56 | assert msg in str(error) | |
57 | ||
58 | def test_ssd_device_multi_osd(self, fakedevice, factory, conf_ceph): | |
59 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
60 | args = factory(filtered_devices=[], osds_per_device=4, |
61 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
62 | devices = [ |
63 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=16073740000)) | |
64 | ] | |
65 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 66 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
67 | msg = "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB" |
68 | assert msg in str(error) | |
69 | ||
70 | def test_hdd_device_multi_osd(self, fakedevice, factory, conf_ceph): | |
71 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
72 | args = factory(filtered_devices=[], osds_per_device=4, |
73 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
74 | devices = [ |
75 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=16073740000)) | |
76 | ] | |
77 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 78 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
79 | msg = "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB" |
80 | assert msg in str(error) | |
81 | ||
82 | def test_device_is_lvm_member_fails(self, fakedevice, factory, conf_ceph): | |
83 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
84 | args = factory(filtered_devices=[], osds_per_device=1, |
85 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
86 | devices = [ |
87 | fakedevice(used_by_ceph=False, is_lvm_member=True, sys_api=dict(rotational='1', size=12073740000)) | |
88 | ] | |
89 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 90 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
91 | assert 'Unable to use device, already a member of LVM' in str(error) |
92 | ||
93 | def test_hdd_device_with_small_configured_journal(self, fakedevice, factory, conf_ceph): | |
94 | conf_ceph(get_safe=lambda *a: '120') | |
11fdf7f2 TL |
95 | args = factory(filtered_devices=[], osds_per_device=1, |
96 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
97 | devices = [ |
98 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
99 | ] | |
100 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 101 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
102 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
103 | assert msg in str(error) | |
104 | ||
105 | def test_ssd_device_with_small_configured_journal(self, fakedevice, factory, conf_ceph): | |
106 | conf_ceph(get_safe=lambda *a: '120') | |
11fdf7f2 TL |
107 | args = factory(filtered_devices=[], osds_per_device=1, |
108 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
109 | devices = [ |
110 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)) | |
111 | ] | |
112 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 113 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 AA |
114 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
115 | assert msg in str(error) | |
116 | ||
117 | ||
118 | class TestMixedType(object): | |
119 | ||
120 | def test_minimum_size_is_not_met(self, stub_vgs, fakedevice, factory, conf_ceph): | |
121 | conf_ceph(get_safe=lambda *a: '120') | |
11fdf7f2 TL |
122 | args = factory(filtered_devices=[], osds_per_device=1, |
123 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
124 | devices = [ |
125 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)), | |
126 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
127 | ] | |
128 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 129 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 AA |
130 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
131 | assert msg in str(error) | |
132 | ||
133 | def test_ssd_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
134 | conf_ceph(get_safe=lambda *a: '7120') | |
11fdf7f2 TL |
135 | args = factory(filtered_devices=[], osds_per_device=1, |
136 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
137 | devices = [ |
138 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)), | |
139 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
140 | ] | |
141 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 142 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 AA |
143 | msg = "Not enough space in fast devices (5.66 GB) to create 1 x 6.95 GB journal LV" |
144 | assert msg in str(error) | |
145 | ||
146 | def test_hdd_device_is_lvm_member_fails(self, stub_vgs, fakedevice, factory, conf_ceph): | |
147 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
148 | args = factory(filtered_devices=[], osds_per_device=1, |
149 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
150 | devices = [ |
151 | fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)), | |
152 | fakedevice(used_by_ceph=False, is_lvm_member=True, sys_api=dict(rotational='1', size=6073740000)) | |
153 | ] | |
154 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 155 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 AA |
156 | assert 'Unable to use device, already a member of LVM' in str(error) |
157 | ||
158 | def test_ssd_is_lvm_member_doesnt_fail(self, volumes, stub_vgs, fakedevice, factory, conf_ceph): | |
159 | # fast PV, because ssd is an LVM member | |
160 | CephPV = lvm.PVolume(vg_name='fast', pv_name='/dev/sda', pv_tags='') | |
161 | ssd = fakedevice( | |
162 | used_by_ceph=False, is_lvm_member=True, sys_api=dict(rotational='0', size=6073740000), pvs_api=[CephPV] | |
163 | ) | |
164 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
165 | # when get_api_vgs() gets called, it will return this one VG | |
166 | stub_vgs([ | |
167 | dict( | |
168 | vg_free='7g', vg_name='fast', lv_name='foo', | |
169 | lv_path='/dev/vg/foo', lv_tags="ceph.type=data" | |
170 | ) | |
171 | ]) | |
172 | ||
173 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
174 | args = factory(filtered_devices=[], osds_per_device=1, |
175 | journal_size=None, osd_ids=[]) | |
91327a77 | 176 | devices = [ssd, hdd] |
11fdf7f2 | 177 | result = filestore.MixedType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
178 | assert result['journal']['path'] == 'vg: fast' |
179 | assert result['journal']['percentage'] == 71 | |
180 | assert result['journal']['human_readable_size'] == '5.00 GB' | |
181 | ||
182 | def test_no_common_vg(self, volumes, stub_vgs, fakedevice, factory, conf_ceph): | |
183 | # fast PV, because ssd is an LVM member | |
184 | CephPV1 = lvm.PVolume(vg_name='fast1', pv_name='/dev/sda', pv_tags='') | |
185 | CephPV2 = lvm.PVolume(vg_name='fast2', pv_name='/dev/sdb', pv_tags='') | |
186 | ssd1 = fakedevice( | |
187 | used_by_ceph=False, is_lvm_member=True, sys_api=dict(rotational='0', size=6073740000), pvs_api=[CephPV1] | |
188 | ) | |
189 | ssd2 = fakedevice( | |
190 | used_by_ceph=False, is_lvm_member=True, sys_api=dict(rotational='0', size=6073740000), pvs_api=[CephPV2] | |
191 | ) | |
192 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
193 | # when get_api_vgs() gets called, it will return this one VG | |
194 | stub_vgs([ | |
195 | dict( | |
196 | vg_free='7g', vg_name='fast1', lv_name='foo', | |
197 | lv_path='/dev/vg/fast1', lv_tags="ceph.type=data" | |
198 | ), | |
199 | dict( | |
200 | vg_free='7g', vg_name='fast2', lv_name='foo', | |
201 | lv_path='/dev/vg/fast2', lv_tags="ceph.type=data" | |
202 | ) | |
203 | ]) | |
204 | ||
205 | conf_ceph(get_safe=lambda *a: '5120') | |
11fdf7f2 TL |
206 | args = factory(filtered_devices=[], osds_per_device=1, |
207 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
208 | devices = [ssd1, ssd2, hdd] |
209 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 210 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 AA |
211 | |
212 | assert 'Could not find a common VG between devices' in str(error) | |
213 | ||
214 | def test_ssd_device_fails_multiple_osds(self, stub_vgs, fakedevice, factory, conf_ceph): | |
215 | conf_ceph(get_safe=lambda *a: '15120') | |
11fdf7f2 TL |
216 | args = factory(filtered_devices=[], osds_per_device=2, |
217 | journal_size=None, osd_ids=[]) | |
91327a77 AA |
218 | devices = [ |
219 | fakedevice(is_lvm_member=False, sys_api=dict(rotational='0', size=16073740000)), | |
220 | fakedevice(is_lvm_member=False, sys_api=dict(rotational='1', size=16073740000)) | |
221 | ] | |
222 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 223 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 AA |
224 | msg = "Not enough space in fast devices (14.97 GB) to create 2 x 14.77 GB journal LV" |
225 | assert msg in str(error) | |
11fdf7f2 TL |
226 | |
227 | def test_filter_all_data_devs(self, fakedevice, factory): | |
228 | # in this scenario the user passed a already used device to be used for | |
229 | # data and an unused device to be used as db device. | |
230 | db_dev = fakedevice(used_by_ceph=False, is_lvm_member=False, sys_api=dict(rotational='0', size=6073740000)) | |
231 | data_dev = fakedevice(used_by_ceph=True, is_lvm_member=False, sys_api=dict(rotational='1', size=6073740000)) | |
232 | args = factory(filtered_devices=[data_dev], osds_per_device=1, | |
233 | journal_size=None, osd_ids=[]) | |
234 | filestore.MixedType(args, [], [db_dev]) |