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