]>
git.proxmox.com Git - ceph.git/blob - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/strategies/test_filestore.py
2 from ceph_volume
.devices
.lvm
.strategies
import filestore
3 from ceph_volume
.api
import lvm
6 class TestSingleType(object):
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,
11 journal_size
=None, osd_ids
=[])
13 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=12073740000))
15 computed_osd
= filestore
.SingleType
.with_auto_devices(args
, devices
).computed
['osds'][0]
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'
21 def test_hdd_device_with_large_journal(self
, fakedevice
, factory
, conf_ceph
):
22 conf_ceph(get_safe
=lambda *a
: '5120')
23 args
= factory(filtered_devices
=[], osds_per_device
=1,
24 journal_size
=None, osd_ids
=[])
26 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=6073740000))
28 with pytest
.raises(RuntimeError) as error
:
29 filestore
.SingleType
.with_auto_devices(args
, devices
)
30 msg
= "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB"
31 assert msg
in str(error
.value
)
33 def test_ssd_device_is_large_enough(self
, fakedevice
, factory
, conf_ceph
):
34 conf_ceph(get_safe
=lambda *a
: '5120')
35 args
= factory(filtered_devices
=[], osds_per_device
=1,
36 journal_size
=None, osd_ids
=[])
38 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=False, sys_api
=dict(size
=12073740000))
40 computed_osd
= filestore
.SingleType
.with_auto_devices(args
, devices
).computed
['osds'][0]
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'
46 def test_ssd_device_with_large_journal(self
, fakedevice
, factory
, conf_ceph
):
47 conf_ceph(get_safe
=lambda *a
: '5120')
48 args
= factory(filtered_devices
=[], osds_per_device
=1,
49 journal_size
=None, osd_ids
=[])
51 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=False, sys_api
=dict(size
=6073740000))
53 with pytest
.raises(RuntimeError) as error
:
54 filestore
.SingleType
.with_auto_devices(args
, devices
)
55 msg
= "Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB"
56 assert msg
in str(error
.value
)
58 def test_ssd_device_multi_osd(self
, fakedevice
, factory
, conf_ceph
):
59 conf_ceph(get_safe
=lambda *a
: '5120')
60 args
= factory(filtered_devices
=[], osds_per_device
=4,
61 journal_size
=None, osd_ids
=[])
63 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=False, sys_api
=dict(size
=16073740000))
65 with pytest
.raises(RuntimeError) as error
:
66 filestore
.SingleType
.with_auto_devices(args
, devices
)
67 msg
= "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB"
68 assert msg
in str(error
.value
)
70 def test_hdd_device_multi_osd(self
, fakedevice
, factory
, conf_ceph
):
71 conf_ceph(get_safe
=lambda *a
: '5120')
72 args
= factory(filtered_devices
=[], osds_per_device
=4,
73 journal_size
=None, osd_ids
=[])
75 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=16073740000))
77 with pytest
.raises(RuntimeError) as error
:
78 filestore
.SingleType
.with_auto_devices(args
, devices
)
79 msg
= "Unable to use device 14.97 GB /dev/sda, LVs would be smaller than 5GB"
80 assert msg
in str(error
.value
)
82 def test_device_is_lvm_member_fails(self
, fakedevice
, factory
, conf_ceph
):
83 conf_ceph(get_safe
=lambda *a
: '5120')
84 args
= factory(filtered_devices
=[], osds_per_device
=1,
85 journal_size
=None, osd_ids
=[])
87 fakedevice(used_by_ceph
=False, is_lvm_member
=True, rotational
=True, sys_api
=dict(size
=12073740000))
89 with pytest
.raises(RuntimeError) as error
:
90 filestore
.SingleType
.with_auto_devices(args
, devices
)
91 assert 'Unable to use device, already a member of LVM' in str(error
.value
)
93 def test_hdd_device_with_small_configured_journal(self
, fakedevice
, factory
, conf_ceph
):
94 conf_ceph(get_safe
=lambda *a
: '120')
95 args
= factory(filtered_devices
=[], osds_per_device
=1,
96 journal_size
=None, osd_ids
=[])
98 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=6073740000))
100 with pytest
.raises(RuntimeError) as error
:
101 filestore
.SingleType
.with_auto_devices(args
, devices
)
102 msg
= "journal sizes must be larger than 2GB, detected: 120.00 MB"
103 assert msg
in str(error
.value
)
105 def test_ssd_device_with_small_configured_journal(self
, fakedevice
, factory
, conf_ceph
):
106 conf_ceph(get_safe
=lambda *a
: '120')
107 args
= factory(filtered_devices
=[], osds_per_device
=1,
108 journal_size
=None, osd_ids
=[])
110 fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=False, sys_api
=dict(size
=6073740000))
112 with pytest
.raises(RuntimeError) as error
:
113 filestore
.SingleType
.with_auto_devices(args
, devices
)
114 msg
= "journal sizes must be larger than 2GB, detected: 120.00 MB"
115 assert msg
in str(error
.value
)
118 class TestMixedType(object):
120 def test_minimum_size_is_not_met(self
, stub_vgs
, fakedevice
, factory
, conf_ceph
):
121 conf_ceph(get_safe
=lambda *a
: '120')
122 args
= factory(filtered_devices
=[], osds_per_device
=1,
123 journal_size
=None, osd_ids
=[])
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))
128 with pytest
.raises(RuntimeError) as error
:
129 filestore
.MixedType
.with_auto_devices(args
, devices
)
130 msg
= "journal sizes must be larger than 2GB, detected: 120.00 MB"
131 assert msg
in str(error
.value
)
133 def test_ssd_device_is_not_large_enough(self
, stub_vgs
, fakedevice
, factory
, conf_ceph
):
134 conf_ceph(get_safe
=lambda *a
: '7120')
135 args
= factory(filtered_devices
=[], osds_per_device
=1,
136 journal_size
=None, osd_ids
=[])
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))
141 with pytest
.raises(RuntimeError) as error
:
142 filestore
.MixedType
.with_auto_devices(args
, devices
)
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
.value
)
146 def test_hdd_device_is_lvm_member_fails(self
, stub_vgs
, fakedevice
, factory
, conf_ceph
):
147 conf_ceph(get_safe
=lambda *a
: '5120')
148 args
= factory(filtered_devices
=[], osds_per_device
=1,
149 journal_size
=None, osd_ids
=[])
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))
154 with pytest
.raises(RuntimeError) as error
:
155 filestore
.MixedType
.with_auto_devices(args
, devices
)
156 assert 'Unable to use device, already a member of LVM' in str(error
.value
)
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
='')
162 used_by_ceph
=False, is_lvm_member
=True, rotational
=False, sys_api
=dict(size
=6073740000), pvs_api
=[CephPV
]
164 hdd
= fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=6073740000))
165 # when get_api_vgs() gets called, it will return this one VG
168 vg_free
='7g', vg_name
='fast', lv_name
='foo',
169 lv_path
='/dev/vg/foo', lv_tags
="ceph.type=data"
173 conf_ceph(get_safe
=lambda *a
: '5120')
174 args
= factory(filtered_devices
=[], osds_per_device
=1,
175 journal_size
=None, osd_ids
=[])
177 result
= filestore
.MixedType
.with_auto_devices(args
, devices
).computed
['osds'][0]
178 assert result
['journal']['path'] == 'vg: fast'
179 assert result
['journal']['percentage'] == 71
180 assert result
['journal']['human_readable_size'] == '5.00 GB'
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
='')
187 used_by_ceph
=False, is_lvm_member
=True, rotational
=False, sys_api
=dict(size
=6073740000), pvs_api
=[CephPV1
]
190 used_by_ceph
=False, is_lvm_member
=True, rotational
=False, sys_api
=dict(size
=6073740000), pvs_api
=[CephPV2
]
192 hdd
= fakedevice(used_by_ceph
=False, is_lvm_member
=False, rotational
=True, sys_api
=dict(size
=6073740000))
193 # when get_api_vgs() gets called, it will return this one VG
196 vg_free
='7g', vg_name
='fast1', lv_name
='foo',
197 lv_path
='/dev/vg/fast1', lv_tags
="ceph.type=data"
200 vg_free
='7g', vg_name
='fast2', lv_name
='foo',
201 lv_path
='/dev/vg/fast2', lv_tags
="ceph.type=data"
205 conf_ceph(get_safe
=lambda *a
: '5120')
206 args
= factory(filtered_devices
=[], osds_per_device
=1,
207 journal_size
=None, osd_ids
=[])
208 devices
= [ssd1
, ssd2
, hdd
]
209 with pytest
.raises(RuntimeError) as error
:
210 filestore
.MixedType
.with_auto_devices(args
, devices
)
212 assert 'Could not find a common VG between devices' in str(error
.value
)
214 def test_ssd_device_fails_multiple_osds(self
, stub_vgs
, fakedevice
, factory
, conf_ceph
):
215 conf_ceph(get_safe
=lambda *a
: '15120')
216 args
= factory(filtered_devices
=[], osds_per_device
=2,
217 journal_size
=None, osd_ids
=[])
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))
222 with pytest
.raises(RuntimeError) as error
:
223 filestore
.MixedType
.with_auto_devices(args
, devices
)
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
.value
)
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, 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))
232 args
= factory(filtered_devices
=[data_dev
], osds_per_device
=1,
233 journal_size
=None, osd_ids
=[])
234 filestore
.MixedType(args
, [], [db_dev
])