]>
Commit | Line | Data |
---|---|---|
91327a77 AA |
1 | import pytest |
2 | from ceph_volume.devices.lvm.strategies import bluestore | |
3 | ||
4 | ||
5 | class TestSingleType(object): | |
6 | ||
7 | def test_hdd_device_is_large_enough(self, fakedevice, factory): | |
11fdf7f2 TL |
8 | args = factory(filtered_devices=[], osds_per_device=1, |
9 | block_db_size=None, osd_ids=[]) | |
91327a77 | 10 | devices = [ |
81eedcae | 11 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 | 12 | ] |
11fdf7f2 | 13 | computed_osd = bluestore.SingleType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
14 | assert computed_osd['data']['percentage'] == 100 |
15 | assert computed_osd['data']['parts'] == 1 | |
16 | assert computed_osd['data']['human_readable_size'] == '5.66 GB' | |
17 | assert computed_osd['data']['path'] == '/dev/sda' | |
18 | ||
19 | def test_sdd_device_is_large_enough(self, fakedevice, factory): | |
11fdf7f2 TL |
20 | args = factory(filtered_devices=[], osds_per_device=1, |
21 | block_db_size=None, osd_ids=[]) | |
91327a77 | 22 | devices = [ |
81eedcae | 23 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
91327a77 | 24 | ] |
11fdf7f2 | 25 | computed_osd = bluestore.SingleType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
26 | assert computed_osd['data']['percentage'] == 100 |
27 | assert computed_osd['data']['parts'] == 1 | |
28 | assert computed_osd['data']['human_readable_size'] == '5.66 GB' | |
29 | assert computed_osd['data']['path'] == '/dev/sda' | |
30 | ||
31 | def test_device_cannot_have_many_osds_per_device(self, fakedevice, factory): | |
11fdf7f2 TL |
32 | args = factory(filtered_devices=[], osds_per_device=3, |
33 | block_db_size=None, osd_ids=[]) | |
91327a77 | 34 | devices = [ |
81eedcae | 35 | fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
36 | ] |
37 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 38 | bluestore.SingleType.with_auto_devices(args, devices) |
81eedcae | 39 | assert 'Unable to use device 5.66 GB /dev/sda' in str(error.value) |
91327a77 AA |
40 | |
41 | def test_device_is_lvm_member_fails(self, fakedevice, factory): | |
11fdf7f2 TL |
42 | args = factory(filtered_devices=[], osds_per_device=1, |
43 | block_db_size=None, osd_ids=[]) | |
91327a77 | 44 | devices = [ |
81eedcae | 45 | fakedevice(used_by_ceph=False, is_lvm_member=True, rotational=True, sys_api=dict(size=6073740000)) |
91327a77 AA |
46 | ] |
47 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 48 | bluestore.SingleType.with_auto_devices(args, devices) |
81eedcae | 49 | assert 'Unable to use device, already a member of LVM' in str(error.value) |
91327a77 AA |
50 | |
51 | ||
11fdf7f2 TL |
52 | class TestMixedType(object): |
53 | ||
54 | def test_filter_all_data_devs(self, fakedevice, factory): | |
55 | # in this scenario the user passed a already used device to be used for | |
56 | # data and an unused device to be used as db device. | |
81eedcae TL |
57 | db_dev = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
58 | data_dev = fakedevice(used_by_ceph=True, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
11fdf7f2 TL |
59 | args = factory(filtered_devices=[data_dev], osds_per_device=1, |
60 | block_db_size=None, block_wal_size=None, | |
61 | osd_ids=[]) | |
62 | bluestore.MixedType(args, [], [db_dev], []) | |
63 | ||
64 | ||
91327a77 AA |
65 | class TestMixedTypeConfiguredSize(object): |
66 | # uses a block.db size that has been configured via ceph.conf, instead of | |
67 | # defaulting to 'as large as possible' | |
68 | ||
69 | def test_hdd_device_is_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
70 | # 3GB block.db in ceph.conf | |
71 | conf_ceph(get_safe=lambda *a: 3147483640) | |
11fdf7f2 TL |
72 | args = factory(filtered_devices=[], osds_per_device=1, |
73 | block_db_size=None, block_wal_size=None, | |
74 | osd_ids=[]) | |
81eedcae TL |
75 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
76 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
77 | devices = [ssd, hdd] |
78 | ||
11fdf7f2 | 79 | osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
80 | assert osd['data']['percentage'] == 100 |
81 | assert osd['data']['human_readable_size'] == '5.66 GB' | |
82 | assert osd['data']['path'] == '/dev/sda' | |
83 | # a new vg will be created | |
84 | assert osd['block.db']['path'] == 'vg: vg/lv' | |
85 | assert osd['block.db']['percentage'] == 100 | |
86 | ||
87 | def test_ssd_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
88 | # 7GB block.db in ceph.conf | |
89 | conf_ceph(get_safe=lambda *a: 7747483640) | |
11fdf7f2 TL |
90 | args = factory(filtered_devices=[], osds_per_device=1, |
91 | block_db_size=None, block_wal_size=None, | |
92 | osd_ids=[]) | |
81eedcae TL |
93 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
94 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
95 | devices = [ssd, hdd] |
96 | ||
97 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 98 | bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 | 99 | expected = 'Not enough space in fast devices (5.66 GB) to create 1 x 7.22 GB block.db LV' |
81eedcae | 100 | assert expected in str(error.value) |
91327a77 AA |
101 | |
102 | def test_multi_hdd_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
103 | # 3GB block.db in ceph.conf | |
104 | conf_ceph(get_safe=lambda *a: 3147483640) | |
11fdf7f2 TL |
105 | args = factory(filtered_devices=[], osds_per_device=2, |
106 | block_db_size=None, block_wal_size=None, | |
107 | osd_ids=[]) | |
81eedcae TL |
108 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60737400000)) |
109 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
110 | devices = [ssd, hdd] |
111 | ||
112 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 113 | bluestore.MixedType.with_auto_devices(args, devices) |
91327a77 | 114 | expected = 'Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB' |
81eedcae | 115 | assert expected in str(error.value) |
91327a77 AA |
116 | |
117 | ||
118 | class TestMixedTypeLargeAsPossible(object): | |
119 | ||
120 | def test_hdd_device_is_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
121 | conf_ceph(get_safe=lambda *a: None) | |
11fdf7f2 TL |
122 | args = factory(filtered_devices=[], osds_per_device=1, |
123 | block_db_size=None, block_wal_size=None, | |
124 | osd_ids=[]) | |
81eedcae TL |
125 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000)) |
126 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
127 | devices = [ssd, hdd] |
128 | ||
11fdf7f2 | 129 | osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
130 | assert osd['data']['percentage'] == 100 |
131 | assert osd['data']['human_readable_size'] == '5.66 GB' | |
132 | assert osd['data']['path'] == '/dev/sda' | |
133 | # a new vg will be created | |
134 | assert osd['block.db']['path'] == 'vg: vg/lv' | |
135 | # as large as possible | |
136 | assert osd['block.db']['percentage'] == 100 | |
137 | ||
138 | def test_multi_hdd_device_is_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
139 | conf_ceph(get_safe=lambda *a: None) | |
11fdf7f2 TL |
140 | args = factory(filtered_devices=[], osds_per_device=2, |
141 | block_db_size=None, block_wal_size=None, | |
142 | osd_ids=[]) | |
81eedcae TL |
143 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60073740000)) |
144 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000)) | |
91327a77 AA |
145 | devices = [ssd, hdd] |
146 | ||
11fdf7f2 | 147 | osd = bluestore.MixedType.with_auto_devices(args, devices).computed['osds'][0] |
91327a77 AA |
148 | assert osd['data']['percentage'] == 50 |
149 | assert osd['data']['human_readable_size'] == '27.97 GB' | |
150 | assert osd['data']['path'] == '/dev/sda' | |
151 | # a new vg will be created | |
152 | assert osd['block.db']['path'] == 'vg: vg/lv' | |
153 | # as large as possible | |
154 | assert osd['block.db']['percentage'] == 50 | |
155 | ||
156 | def test_multi_hdd_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
157 | conf_ceph(get_safe=lambda *a: None) | |
11fdf7f2 TL |
158 | args = factory(filtered_devices=[], osds_per_device=2, |
159 | block_db_size=None, block_wal_size=None, | |
160 | osd_ids=[]) | |
81eedcae TL |
161 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60737400000)) |
162 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000)) | |
91327a77 AA |
163 | devices = [ssd, hdd] |
164 | ||
165 | with pytest.raises(RuntimeError) as error: | |
11fdf7f2 | 166 | bluestore.MixedType.with_auto_devices(args, devices) |
91327a77 | 167 | expected = 'Unable to use device 5.66 GB /dev/sda, LVs would be smaller than 5GB' |
81eedcae | 168 | assert expected in str(error.value) |
11fdf7f2 TL |
169 | |
170 | ||
171 | class TestMixedTypeWithExplicitDevices(object): | |
172 | ||
173 | def test_multi_hdd_device_is_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
174 | conf_ceph(get_safe=lambda *a: None) | |
175 | args = factory(filtered_devices=[], osds_per_device=2, | |
176 | block_db_size=None, block_wal_size=None, | |
177 | osd_ids=[]) | |
81eedcae TL |
178 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=60073740000)) |
179 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000)) | |
11fdf7f2 TL |
180 | |
181 | osd = bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0] | |
182 | assert osd['data']['percentage'] == 50 | |
183 | assert osd['data']['human_readable_size'] == '27.97 GB' | |
184 | assert osd['data']['path'] == '/dev/sda' | |
185 | # a new vg will be created | |
186 | assert osd['block.wal']['path'] == 'vg: vg/lv' | |
187 | # as large as possible | |
188 | assert osd['block.wal']['percentage'] == 50 | |
189 | ||
190 | def test_wal_device_is_not_large_enough(self, stub_vgs, fakedevice, factory, conf_ceph): | |
191 | conf_ceph(get_safe=lambda *a: None) | |
192 | args = factory(filtered_devices=[], osds_per_device=2, | |
193 | block_db_size=None, block_wal_size=None, | |
194 | osd_ids=[]) | |
81eedcae TL |
195 | ssd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=1610612736)) |
196 | hdd = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=True, sys_api=dict(size=60073740000)) | |
11fdf7f2 TL |
197 | |
198 | with pytest.raises(RuntimeError) as error: | |
199 | bluestore.MixedType(args, [hdd], [], [ssd]).computed['osds'][0] | |
200 | expected = 'Unable to use device 1.50 GB /dev/sda, LVs would be smaller than 1GB' | |
81eedcae | 201 | assert expected in str(error.value), str(error) |