]> git.proxmox.com Git - ceph.git/blame - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_filestore.py
import ceph nautilus 14.2.2
[ceph.git] / ceph / src / ceph-volume / ceph_volume / tests / devices / lvm / strategies / test_filestore.py
CommitLineData
91327a77
AA
1import pytest
2from ceph_volume.devices.lvm.strategies import filestore
3from ceph_volume.api import lvm
4
5
6class 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
118class 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)
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.
81eedcae
TL
230 db_dev = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
231 data_dev = fakedevice(used_by_ceph=True, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
11fdf7f2
TL
232 args = factory(filtered_devices=[data_dev], osds_per_device=1,
233 journal_size=None, osd_ids=[])
234 filestore.MixedType(args, [], [db_dev])