]>
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 | 12 | devices = [ |
81eedcae | 13 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=12073740000)) |
91327a77 | 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 | 25 | devices = [ |
81eedcae | 26 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
27 | ] |
28 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 29 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 30 | msg = "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB" |
81eedcae | 31 | assert msg in str(error.value) |
91327a77 AA |
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 | 37 | devices = [ |
81eedcae | 38 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=12073740000)) |
91327a77 | 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 | 50 | devices = [ |
81eedcae | 51 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
91327a77 AA |
52 | ] |
53 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 54 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 55 | msg = "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB" |
81eedcae | 56 | assert msg in str(error.value) |
91327a77 AA |
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 | 62 | devices = [ |
81eedcae | 63 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=16073740000)) |
91327a77 AA |
64 | ] |
65 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 66 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 67 | msg = "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB" |
81eedcae | 68 | assert msg in str(error.value) |
91327a77 AA |
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 | 74 | devices = [ |
81eedcae | 75 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=16073740000)) |
91327a77 AA |
76 | ] |
77 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 78 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 79 | msg = "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB" |
81eedcae | 80 | assert msg in str(error.value) |
91327a77 AA |
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 | 86 | devices = [ |
81eedcae | 87 | fakedevice(used_by_ceph=False, is_lvm_member=True, rotational=True, sys_api=dict(size=12073740000)) |
91327a77 AA |
88 | ] |
89 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 90 | filestore.SingleType.with_auto_devices(args, devices) |
81eedcae | 91 | assert 'Unable to use device, already a member of LVM' in str(error.value) |
91327a77 AA |
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 | 97 | devices = [ |
81eedcae | 98 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
99 | ] |
100 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 101 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 102 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
81eedcae | 103 | assert msg in str(error.value) |
91327a77 AA |
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 | 109 | devices = [ |
81eedcae | 110 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
91327a77 AA |
111 | ] |
112 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 113 | filestore.SingleType.with_auto_devices(args, devices) |
91327a77 | 114 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
81eedcae | 115 | assert msg in str(error.value) |
91327a77 AA |
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 | 124 | devices = [ |
81eedcae TL |
125 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)), |
126 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
127 | ] |
128 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 129 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 | 130 | msg = "journal sizes must be larger than 2GB, detected: 120.00 MB" |
81eedcae | 131 | assert msg in str(error.value) |
91327a77 AA |
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 | 137 | devices = [ |
81eedcae TL |
138 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)), |
139 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
140 | ] |
141 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 142 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 | 143 | msg = "Not enough space in fast devices (5.66 GB) to create 1 x 6.95 GB journal LV" |
81eedcae | 144 | assert msg in str(error.value) |
91327a77 AA |
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 | 150 | devices = [ |
81eedcae TL |
151 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)), |
152 | fakedevice(used_by_ceph=False, is_lvm_member=True, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
153 | ] |
154 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 155 | filestore.MixedType.with_auto_devices(args, devices) |
81eedcae | 156 | assert 'Unable to use device, already a member of LVM' in str(error.value) |
91327a77 AA |
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( | |
81eedcae | 162 | used_by_ceph=False, is_lvm_member=True, rotational=False, sys_api=dict(size=6073740000), pvs_api=[CephPV] |
91327a77 | 163 | ) |
81eedcae | 164 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
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( | |
81eedcae | 187 | used_by_ceph=False, is_lvm_member=True, rotational=False, sys_api=dict(size=6073740000), pvs_api=[CephPV1] |
91327a77 AA |
188 | ) |
189 | ssd2 = fakedevice( | |
81eedcae | 190 | used_by_ceph=False, is_lvm_member=True, rotational=False, sys_api=dict(size=6073740000), pvs_api=[CephPV2] |
91327a77 | 191 | ) |
81eedcae | 192 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
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 | 211 | |
81eedcae | 212 | assert 'Could not find a common VG between devices' in str(error.value) |
91327a77 AA |
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 | 218 | devices = [ |
81eedcae TL |
219 | fakedevice(is_lvm_member=False, rotational=False, sys_api=dict(size=16073740000)), |
220 | fakedevice(is_lvm_member=False, rotational=True, sys_api=dict(size=16073740000)) | |
91327a77 AA |
221 | ] |
222 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 223 | filestore.MixedType.with_auto_devices(args, devices) |
91327a77 | 224 | msg = "Not enough space in fast devices (14.97 GB) to create 2 x 14.77 GB journal LV" |
81eedcae | 225 | assert msg in str(error.value) |