]>
git.proxmox.com Git - ceph.git/blob - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_activate.py
2 from copy
import deepcopy
3 from ceph_volume
.devices
.lvm
import activate
4 from ceph_volume
.api
import lvm
as api
5 from ceph_volume
.tests
.conftest
import Capture
10 def __init__(self
, **kw
):
12 self
.bluestore
= False
13 self
.filestore
= False
14 self
.no_systemd
= False
15 self
.auto_detect_objectstore
= None
16 for k
, v
in kw
.items():
20 class TestActivate(object):
22 # these tests are very functional, hence the heavy patching, it is hard to
23 # test the negative side effect with an actual functional run, so we must
24 # setup a perfect scenario for this test to check it can really work
26 def test_no_osd_id_matches_fsid(self
, is_root
, monkeypatch
, capture
):
27 FooVolume
= api
.Volume(lv_name
='foo', lv_path
='/dev/vg/foo',
28 lv_tags
="ceph.osd_fsid=1234")
30 volumes
.append(FooVolume
)
31 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: volumes
)
32 monkeypatch
.setattr(activate
, 'activate_filestore', capture
)
33 args
= Args(osd_id
=None, osd_fsid
='1234', filestore
=True)
34 activate
.Activate([]).activate(args
)
35 assert capture
.calls
[0]['args'][0] == [FooVolume
]
37 def test_no_osd_id_matches_fsid_bluestore(self
, is_root
, monkeypatch
, capture
):
38 FooVolume
= api
.Volume(lv_name
='foo', lv_path
='/dev/vg/foo',
39 lv_tags
="ceph.osd_fsid=1234")
41 volumes
.append(FooVolume
)
42 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: volumes
)
43 monkeypatch
.setattr(activate
, 'activate_bluestore', capture
)
44 args
= Args(osd_id
=None, osd_fsid
='1234', bluestore
=True)
45 activate
.Activate([]).activate(args
)
46 assert capture
.calls
[0]['args'][0] == [FooVolume
]
48 def test_no_osd_id_no_matching_fsid(self
, is_root
, monkeypatch
, capture
):
49 FooVolume
= api
.Volume(lv_name
='foo', lv_path
='/dev/vg/foo',
50 lv_tags
="ceph.osd_fsid=1111")
52 volumes
.append(FooVolume
)
53 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: [])
54 monkeypatch
.setattr(api
, 'get_single_lv', lambda **kwargs
: [])
55 monkeypatch
.setattr(activate
, 'activate_filestore', capture
)
57 args
= Args(osd_id
=None, osd_fsid
='2222')
58 with pytest
.raises(RuntimeError):
59 activate
.Activate([]).activate(args
)
61 def test_osd_id_no_osd_fsid(self
, is_root
):
62 args
= Args(osd_id
=42, osd_fsid
=None)
63 with pytest
.raises(RuntimeError) as result
:
64 activate
.Activate([]).activate(args
)
65 assert result
.value
.args
[0] == 'could not activate osd.42, please provide the osd_fsid too'
67 def test_no_osd_id_no_osd_fsid(self
, is_root
):
68 args
= Args(osd_id
=None, osd_fsid
=None)
69 with pytest
.raises(RuntimeError) as result
:
70 activate
.Activate([]).activate(args
)
71 assert result
.value
.args
[0] == 'Please provide both osd_id and osd_fsid'
73 def test_filestore_no_systemd(self
, is_root
, monkeypatch
, capture
):
74 monkeypatch
.setattr('ceph_volume.configuration.load', lambda: None)
75 fake_enable
= Capture()
76 fake_start_osd
= Capture()
77 monkeypatch
.setattr('ceph_volume.util.system.device_is_mounted', lambda *a
, **kw
: True)
78 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
79 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
80 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
81 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
82 JournalVolume
= api
.Volume(
84 lv_path
='/dev/vg/journal',
87 "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal",
88 "ceph.journal_uuid=000", "ceph.type=journal",
89 "ceph.osd_id=0", "ceph.osd_fsid=1234"])
91 DataVolume
= api
.Volume(
93 lv_path
='/dev/vg/data',
95 lv_tags
="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/" + \
96 "journal,ceph.journal_uuid=000,ceph.type=data," + \
97 "ceph.osd_id=0,ceph.osd_fsid=1234")
99 volumes
.append(DataVolume
)
100 volumes
.append(JournalVolume
)
101 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
103 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=True, filestore
=True)
104 activate
.Activate([]).activate(args
)
105 assert fake_enable
.calls
== []
106 assert fake_start_osd
.calls
== []
108 def test_filestore_no_systemd_autodetect(self
, is_root
, monkeypatch
, capture
):
109 monkeypatch
.setattr('ceph_volume.configuration.load', lambda: None)
110 fake_enable
= Capture()
111 fake_start_osd
= Capture()
112 monkeypatch
.setattr('ceph_volume.util.system.device_is_mounted', lambda *a
, **kw
: True)
113 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
114 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
115 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
116 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
117 JournalVolume
= api
.Volume(
119 lv_path
='/dev/vg/journal',
122 "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal",
123 "ceph.journal_uuid=000", "ceph.type=journal",
124 "ceph.osd_id=0", "ceph.osd_fsid=1234"])
126 DataVolume
= api
.Volume(
128 lv_path
='/dev/vg/data',
130 lv_tags
="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/" + \
131 "journal,ceph.journal_uuid=000,ceph.type=data," + \
132 "ceph.osd_id=0,ceph.osd_fsid=1234")
134 volumes
.append(DataVolume
)
135 volumes
.append(JournalVolume
)
136 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
138 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=True,
139 filestore
=True, auto_detect_objectstore
=True)
140 activate
.Activate([]).activate(args
)
141 assert fake_enable
.calls
== []
142 assert fake_start_osd
.calls
== []
144 def test_filestore_systemd_autodetect(self
, is_root
, monkeypatch
, capture
):
145 fake_enable
= Capture()
146 fake_start_osd
= Capture()
147 monkeypatch
.setattr('ceph_volume.configuration.load', lambda: None)
148 monkeypatch
.setattr('ceph_volume.util.system.device_is_mounted', lambda *a
, **kw
: True)
149 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
150 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
151 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
152 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
153 JournalVolume
= api
.Volume(
155 lv_path
='/dev/vg/journal',
158 "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal",
159 "ceph.journal_uuid=000", "ceph.type=journal",
160 "ceph.osd_id=0","ceph.osd_fsid=1234"])
162 DataVolume
= api
.Volume(
164 lv_path
='/dev/vg/data',
166 lv_tags
="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/" + \
167 "journal,ceph.journal_uuid=000,ceph.type=data," + \
168 "ceph.osd_id=0,ceph.osd_fsid=1234")
170 volumes
.append(DataVolume
)
171 volumes
.append(JournalVolume
)
172 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
174 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=False,
175 filestore
=True, auto_detect_objectstore
=False)
176 activate
.Activate([]).activate(args
)
177 assert fake_enable
.calls
!= []
178 assert fake_start_osd
.calls
!= []
180 def test_filestore_systemd(self
, is_root
, monkeypatch
, capture
):
181 fake_enable
= Capture()
182 fake_start_osd
= Capture()
183 monkeypatch
.setattr('ceph_volume.configuration.load', lambda: None)
184 monkeypatch
.setattr('ceph_volume.util.system.device_is_mounted', lambda *a
, **kw
: True)
185 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
186 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
187 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
188 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
189 JournalVolume
= api
.Volume(
191 lv_path
='/dev/vg/journal',
194 "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal",
195 "ceph.journal_uuid=000", "ceph.type=journal",
196 "ceph.osd_id=0","ceph.osd_fsid=1234"])
198 DataVolume
= api
.Volume(
200 lv_path
='/dev/vg/data',
202 lv_tags
="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/" + \
203 "journal,ceph.journal_uuid=000,ceph.type=data," + \
204 "ceph.osd_id=0,ceph.osd_fsid=1234")
206 volumes
.append(DataVolume
)
207 volumes
.append(JournalVolume
)
208 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
210 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=False,
212 activate
.Activate([]).activate(args
)
213 assert fake_enable
.calls
!= []
214 assert fake_start_osd
.calls
!= []
216 def test_bluestore_no_systemd(self
, is_root
, monkeypatch
, capture
):
217 fake_enable
= Capture()
218 fake_start_osd
= Capture()
219 monkeypatch
.setattr('ceph_volume.util.system.path_is_mounted', lambda *a
, **kw
: True)
220 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
221 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
222 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
223 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
224 DataVolume
= api
.Volume(
226 lv_path
='/dev/vg/data',
227 lv_tags
="ceph.cluster_name=ceph,,ceph.journal_uuid=000," + \
228 "ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234")
230 volumes
.append(DataVolume
)
231 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
233 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=True, bluestore
=True)
234 activate
.Activate([]).activate(args
)
235 assert fake_enable
.calls
== []
236 assert fake_start_osd
.calls
== []
238 def test_bluestore_systemd(self
, is_root
, monkeypatch
, capture
):
239 fake_enable
= Capture()
240 fake_start_osd
= Capture()
241 monkeypatch
.setattr('ceph_volume.util.system.path_is_mounted', lambda *a
, **kw
: True)
242 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
243 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
244 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
245 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
246 DataVolume
= api
.Volume(
248 lv_path
='/dev/vg/data',
249 lv_tags
="ceph.cluster_name=ceph,,ceph.journal_uuid=000," + \
250 "ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234")
252 volumes
.append(DataVolume
)
253 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
255 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=False,
257 activate
.Activate([]).activate(args
)
258 assert fake_enable
.calls
!= []
259 assert fake_start_osd
.calls
!= []
261 def test_bluestore_no_systemd_autodetect(self
, is_root
, monkeypatch
, capture
):
262 fake_enable
= Capture()
263 fake_start_osd
= Capture()
264 monkeypatch
.setattr('ceph_volume.util.system.path_is_mounted', lambda *a
, **kw
: True)
265 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
: True)
266 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
267 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
268 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
269 DataVolume
= api
.Volume(
271 lv_path
='/dev/vg/data',
272 lv_tags
="ceph.cluster_name=ceph,,ceph.block_uuid=000," + \
273 "ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234")
275 volumes
.append(DataVolume
)
276 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
278 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=True,
279 bluestore
=True, auto_detect_objectstore
=True)
280 activate
.Activate([]).activate(args
)
281 assert fake_enable
.calls
== []
282 assert fake_start_osd
.calls
== []
284 def test_bluestore_systemd_autodetect(self
, is_root
, monkeypatch
, capture
):
285 fake_enable
= Capture()
286 fake_start_osd
= Capture()
287 monkeypatch
.setattr('ceph_volume.util.system.path_is_mounted',
288 lambda *a
, **kw
: True)
289 monkeypatch
.setattr('ceph_volume.util.system.chown', lambda *a
, **kw
:
291 monkeypatch
.setattr('ceph_volume.process.run', lambda *a
, **kw
: True)
292 monkeypatch
.setattr(activate
.systemctl
, 'enable_volume', fake_enable
)
293 monkeypatch
.setattr(activate
.systemctl
, 'start_osd', fake_start_osd
)
294 DataVolume
= api
.Volume(
296 lv_path
='/dev/vg/data',
297 lv_tags
="ceph.cluster_name=ceph,,ceph.journal_uuid=000," + \
298 "ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234")
300 volumes
.append(DataVolume
)
301 monkeypatch
.setattr(api
, 'get_lvs', lambda **kwargs
: deepcopy(volumes
))
303 args
= Args(osd_id
=None, osd_fsid
='1234', no_systemd
=False,
304 bluestore
=True, auto_detect_objectstore
=False)
305 activate
.Activate([]).activate(args
)
306 assert fake_enable
.calls
!= []
307 assert fake_start_osd
.calls
!= []
309 class TestActivateFlags(object):
311 def test_default_objectstore(self
, capture
):
312 args
= ['0', 'asdf-ljh-asdf']
313 activation
= activate
.Activate(args
)
314 activation
.activate
= capture
316 parsed_args
= capture
.calls
[0]['args'][0]
317 assert parsed_args
.filestore
is False
318 assert parsed_args
.bluestore
is True
320 def test_uses_filestore(self
, capture
):
321 args
= ['--filestore', '0', 'asdf-ljh-asdf']
322 activation
= activate
.Activate(args
)
323 activation
.activate
= capture
325 parsed_args
= capture
.calls
[0]['args'][0]
326 assert parsed_args
.filestore
is True
327 assert parsed_args
.bluestore
is False
329 def test_uses_bluestore(self
, capture
):
330 args
= ['--bluestore', '0', 'asdf-ljh-asdf']
331 activation
= activate
.Activate(args
)
332 activation
.activate
= capture
334 parsed_args
= capture
.calls
[0]['args'][0]
335 assert parsed_args
.filestore
is False
336 assert parsed_args
.bluestore
is True
339 class TestActivateAll(object):
341 def test_does_not_detect_osds(self
, capsys
, is_root
, capture
, monkeypatch
):
342 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: {})
344 activation
= activate
.Activate(args
)
346 out
, err
= capsys
.readouterr()
347 assert 'Was unable to find any OSDs to activate' in err
348 assert 'Verify OSDs are present with ' in err
350 def test_detects_running_osds(self
, capsys
, is_root
, capture
, monkeypatch
):
351 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: direct_report
)
352 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.systemctl.osd_is_active', lambda x
: True)
354 activation
= activate
.Activate(args
)
356 out
, err
= capsys
.readouterr()
357 assert 'a8789a96ce8b process is active. Skipping activation' in err
358 assert 'b8218eaa1634 process is active. Skipping activation' in err
360 def test_detects_osds_to_activate_systemd(self
, is_root
, capture
, monkeypatch
):
361 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: direct_report
)
362 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.systemctl.osd_is_active', lambda x
: False)
364 activation
= activate
.Activate(args
)
365 activation
.activate
= capture
367 calls
= sorted(capture
.calls
, key
=lambda x
: x
['kwargs']['osd_id'])
368 assert calls
[0]['kwargs']['osd_id'] == '0'
369 assert calls
[0]['kwargs']['osd_fsid'] == '957d22b7-24ce-466a-9883-b8218eaa1634'
370 assert calls
[1]['kwargs']['osd_id'] == '1'
371 assert calls
[1]['kwargs']['osd_fsid'] == 'd0f3e4ad-e52a-4520-afc0-a8789a96ce8b'
373 def test_detects_osds_to_activate_no_systemd(self
, is_root
, capture
, monkeypatch
):
374 monkeypatch
.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: direct_report
)
375 args
= ['--all', '--no-systemd']
376 activation
= activate
.Activate(args
)
377 activation
.activate
= capture
379 calls
= sorted(capture
.calls
, key
=lambda x
: x
['kwargs']['osd_id'])
380 assert calls
[0]['kwargs']['osd_id'] == '0'
381 assert calls
[0]['kwargs']['osd_fsid'] == '957d22b7-24ce-466a-9883-b8218eaa1634'
382 assert calls
[1]['kwargs']['osd_id'] == '1'
383 assert calls
[1]['kwargs']['osd_fsid'] == 'd0f3e4ad-e52a-4520-afc0-a8789a96ce8b'
386 # Activate All fixture
392 "lv_name": "osd-block-957d22b7-24ce-466a-9883-b8218eaa1634",
393 "lv_path": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634",
394 "lv_tags": "ceph.block_device=/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634,ceph.block_uuid=6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4,ceph.cephx_lockbox_secret=,ceph.cluster_fsid=d4962338-46ff-4cd5-8ea6-c033dbdc5b44,ceph.cluster_name=ceph,ceph.crush_device_class=None,ceph.encrypted=0,ceph.osd_fsid=957d22b7-24ce-466a-9883-b8218eaa1634,ceph.osd_id=0,ceph.type=block",
395 "lv_uuid": "6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4",
396 "name": "osd-block-957d22b7-24ce-466a-9883-b8218eaa1634",
397 "path": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634",
399 "ceph.block_device": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634",
400 "ceph.block_uuid": "6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4",
401 "ceph.cephx_lockbox_secret": "",
402 "ceph.cluster_fsid": "d4962338-46ff-4cd5-8ea6-c033dbdc5b44",
403 "ceph.cluster_name": "ceph",
404 "ceph.crush_device_class": "None",
405 "ceph.encrypted": "0",
406 "ceph.osd_fsid": "957d22b7-24ce-466a-9883-b8218eaa1634",
411 "vg_name": "ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44"
416 "lv_name": "osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
417 "lv_path": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
418 "lv_tags": "ceph.block_device=/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b,ceph.block_uuid=1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW,ceph.cephx_lockbox_secret=,ceph.cluster_fsid=d4962338-46ff-4cd5-8ea6-c033dbdc5b44,ceph.cluster_name=ceph,ceph.crush_device_class=None,ceph.encrypted=0,ceph.osd_fsid=d0f3e4ad-e52a-4520-afc0-a8789a96ce8b,ceph.osd_id=1,ceph.type=block",
419 "lv_uuid": "1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW",
420 "name": "osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
421 "path": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
423 "ceph.block_device": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
424 "ceph.block_uuid": "1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW",
425 "ceph.cephx_lockbox_secret": "",
426 "ceph.cluster_fsid": "d4962338-46ff-4cd5-8ea6-c033dbdc5b44",
427 "ceph.cluster_name": "ceph",
428 "ceph.crush_device_class": "None",
429 "ceph.encrypted": "0",
430 "ceph.osd_fsid": "d0f3e4ad-e52a-4520-afc0-a8789a96ce8b",
435 "vg_name": "ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532"