]> git.proxmox.com Git - ceph.git/blame - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_zap.py
import ceph quincy 17.2.4
[ceph.git] / ceph / src / ceph-volume / ceph_volume / tests / devices / lvm / test_zap.py
CommitLineData
eafe8130 1import os
f64942e4 2import pytest
f6b5b4d7
TL
3from copy import deepcopy
4from mock.mock import patch, call
5from ceph_volume import process
f64942e4
AA
6from ceph_volume.api import lvm as api
7from ceph_volume.devices.lvm import zap
8
9
a4b75251
TL
10class TestZap(object):
11 def test_invalid_osd_id_passed(self):
12 with pytest.raises(SystemExit):
13 zap.Zap(argv=['--osd-id', 'foo']).main()
14
f64942e4
AA
15class TestFindAssociatedDevices(object):
16
f6b5b4d7 17 def test_no_lvs_found_that_match_id(self, monkeypatch, device_info):
f64942e4 18 tags = 'ceph.osd_id=9,ceph.journal_uuid=x,ceph.type=data'
f6b5b4d7
TL
19 osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='vg',
20 lv_tags=tags, lv_path='/dev/VolGroup/lv')
21 volumes = []
f64942e4 22 volumes.append(osd)
f6b5b4d7
TL
23 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: {})
24
f64942e4
AA
25 with pytest.raises(RuntimeError):
26 zap.find_associated_devices(osd_id=10)
27
f6b5b4d7
TL
28 def test_no_lvs_found_that_match_fsid(self, monkeypatch, device_info):
29 tags = 'ceph.osd_id=9,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,'+\
30 'ceph.type=data'
31 osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags=tags,
32 vg_name='vg', lv_path='/dev/VolGroup/lv')
33 volumes = []
f64942e4 34 volumes.append(osd)
f6b5b4d7
TL
35 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: {})
36
f64942e4
AA
37 with pytest.raises(RuntimeError):
38 zap.find_associated_devices(osd_fsid='aaaa-lkjh')
39
f6b5b4d7
TL
40 def test_no_lvs_found_that_match_id_fsid(self, monkeypatch, device_info):
41 tags = 'ceph.osd_id=9,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,'+\
42 'ceph.type=data'
43 osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='vg',
44 lv_tags=tags, lv_path='/dev/VolGroup/lv')
45 volumes = []
f64942e4 46 volumes.append(osd)
f6b5b4d7
TL
47 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: {})
48
f64942e4
AA
49 with pytest.raises(RuntimeError):
50 zap.find_associated_devices(osd_id='9', osd_fsid='aaaa-lkjh')
51
f6b5b4d7
TL
52 def test_no_ceph_lvs_found(self, monkeypatch):
53 osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags='',
54 lv_path='/dev/VolGroup/lv')
55 volumes = []
f64942e4 56 volumes.append(osd)
f6b5b4d7
TL
57 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: {})
58
f64942e4
AA
59 with pytest.raises(RuntimeError):
60 zap.find_associated_devices(osd_id=100)
61
f6b5b4d7 62 def test_lv_is_matched_id(self, monkeypatch):
f64942e4 63 tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
f6b5b4d7
TL
64 osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
65 lv_path='/dev/VolGroup/lv', lv_tags=tags)
66 volumes = []
f64942e4 67 volumes.append(osd)
f6b5b4d7
TL
68 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
69 monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
70
f64942e4 71 result = zap.find_associated_devices(osd_id='0')
2a845540 72 assert result[0].path == '/dev/VolGroup/lv'
f64942e4 73
f6b5b4d7
TL
74 def test_lv_is_matched_fsid(self, monkeypatch):
75 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,' +\
76 'ceph.type=data'
77 osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
78 lv_path='/dev/VolGroup/lv', lv_tags=tags)
79 volumes = []
f64942e4 80 volumes.append(osd)
f6b5b4d7
TL
81 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: deepcopy(volumes))
82 monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
83
f64942e4 84 result = zap.find_associated_devices(osd_fsid='asdf-lkjh')
2a845540 85 assert result[0].path == '/dev/VolGroup/lv'
f64942e4 86
f6b5b4d7
TL
87 def test_lv_is_matched_id_fsid(self, monkeypatch):
88 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,' +\
89 'ceph.type=data'
90 osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
91 lv_path='/dev/VolGroup/lv', lv_tags=tags)
92 volumes = []
f64942e4 93 volumes.append(osd)
f6b5b4d7
TL
94 monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
95 monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
96
f64942e4 97 result = zap.find_associated_devices(osd_id='0', osd_fsid='asdf-lkjh')
2a845540 98 assert result[0].path == '/dev/VolGroup/lv'
f64942e4
AA
99
100
101class TestEnsureAssociatedLVs(object):
102
f6b5b4d7
TL
103 def test_nothing_is_found(self):
104 volumes = []
f64942e4
AA
105 result = zap.ensure_associated_lvs(volumes)
106 assert result == []
107
33c7a0ef 108 def test_data_is_found(self, fake_call):
f64942e4
AA
109 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=data'
110 osd = api.Volume(
111 lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/data', lv_tags=tags)
f6b5b4d7 112 volumes = []
f64942e4
AA
113 volumes.append(osd)
114 result = zap.ensure_associated_lvs(volumes)
115 assert result == ['/dev/VolGroup/data']
116
33c7a0ef 117 def test_block_is_found(self, fake_call):
f64942e4
AA
118 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=block'
119 osd = api.Volume(
120 lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/block', lv_tags=tags)
f6b5b4d7 121 volumes = []
f64942e4
AA
122 volumes.append(osd)
123 result = zap.ensure_associated_lvs(volumes)
124 assert result == ['/dev/VolGroup/block']
125
eafe8130
TL
126 def test_success_message_for_fsid(self, factory, is_root, capsys):
127 cli_zap = zap.Zap([])
128 args = factory(devices=[], osd_id=None, osd_fsid='asdf-lkjh')
129 cli_zap.args = args
130 cli_zap.zap()
131 out, err = capsys.readouterr()
132 assert "Zapping successful for OSD: asdf-lkjh" in err
133
134 def test_success_message_for_id(self, factory, is_root, capsys):
135 cli_zap = zap.Zap([])
136 args = factory(devices=[], osd_id='1', osd_fsid=None)
137 cli_zap.args = args
138 cli_zap.zap()
139 out, err = capsys.readouterr()
140 assert "Zapping successful for OSD: 1" in err
141
f6b5b4d7 142 def test_block_and_partition_are_found(self, monkeypatch):
f64942e4
AA
143 monkeypatch.setattr(zap.disk, 'get_device_from_partuuid', lambda x: '/dev/sdb1')
144 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=block'
145 osd = api.Volume(
146 lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/block', lv_tags=tags)
f6b5b4d7 147 volumes = []
f64942e4
AA
148 volumes.append(osd)
149 result = zap.ensure_associated_lvs(volumes)
150 assert '/dev/sdb1' in result
151 assert '/dev/VolGroup/block' in result
152
33c7a0ef 153 def test_journal_is_found(self, fake_call):
f64942e4
AA
154 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=journal'
155 osd = api.Volume(
156 lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv', lv_tags=tags)
f6b5b4d7 157 volumes = []
f64942e4
AA
158 volumes.append(osd)
159 result = zap.ensure_associated_lvs(volumes)
160 assert result == ['/dev/VolGroup/lv']
161
f6b5b4d7 162 def test_multiple_journals_are_found(self):
f64942e4 163 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=journal'
f6b5b4d7 164 volumes = []
f64942e4
AA
165 for i in range(3):
166 osd = api.Volume(
167 lv_name='volume%s' % i, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % i, lv_tags=tags)
168 volumes.append(osd)
169 result = zap.ensure_associated_lvs(volumes)
170 assert '/dev/VolGroup/lv0' in result
171 assert '/dev/VolGroup/lv1' in result
172 assert '/dev/VolGroup/lv2' in result
173
f6b5b4d7 174 def test_multiple_dbs_are_found(self):
f64942e4 175 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=db'
f6b5b4d7 176 volumes = []
f64942e4
AA
177 for i in range(3):
178 osd = api.Volume(
179 lv_name='volume%s' % i, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % i, lv_tags=tags)
180 volumes.append(osd)
181 result = zap.ensure_associated_lvs(volumes)
182 assert '/dev/VolGroup/lv0' in result
183 assert '/dev/VolGroup/lv1' in result
184 assert '/dev/VolGroup/lv2' in result
185
f6b5b4d7 186 def test_multiple_wals_are_found(self):
f64942e4 187 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.wal_uuid=x,ceph.type=wal'
f6b5b4d7 188 volumes = []
f64942e4
AA
189 for i in range(3):
190 osd = api.Volume(
191 lv_name='volume%s' % i, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % i, lv_tags=tags)
192 volumes.append(osd)
193 result = zap.ensure_associated_lvs(volumes)
194 assert '/dev/VolGroup/lv0' in result
195 assert '/dev/VolGroup/lv1' in result
196 assert '/dev/VolGroup/lv2' in result
197
f6b5b4d7
TL
198 def test_multiple_backing_devs_are_found(self):
199 volumes = []
f64942e4
AA
200 for _type in ['journal', 'db', 'wal']:
201 tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.wal_uuid=x,ceph.type=%s' % _type
202 osd = api.Volume(
203 lv_name='volume%s' % _type, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % _type, lv_tags=tags)
204 volumes.append(osd)
205 result = zap.ensure_associated_lvs(volumes)
206 assert '/dev/VolGroup/lvjournal' in result
207 assert '/dev/VolGroup/lvwal' in result
208 assert '/dev/VolGroup/lvdb' in result
eafe8130 209
f6b5b4d7
TL
210 @patch('ceph_volume.devices.lvm.zap.api.get_lvs')
211 def test_ensure_associated_lvs(self, m_get_lvs):
212 zap.ensure_associated_lvs([], lv_tags={'ceph.osd_id': '1'})
213 calls = [
214 call(tags={'ceph.type': 'journal', 'ceph.osd_id': '1'}),
215 call(tags={'ceph.type': 'db', 'ceph.osd_id': '1'}),
216 call(tags={'ceph.type': 'wal', 'ceph.osd_id': '1'})
217 ]
218 m_get_lvs.assert_has_calls(calls, any_order=True)
219
eafe8130
TL
220
221class TestWipeFs(object):
222
223 def setup(self):
224 os.environ['CEPH_VOLUME_WIPEFS_INTERVAL'] = '0'
225
226 def test_works_on_second_try(self, stub_call):
227 os.environ['CEPH_VOLUME_WIPEFS_TRIES'] = '2'
228 stub_call([('wiping /dev/sda', '', 1), ('', '', 0)])
229 result = zap.wipefs('/dev/sda')
230 assert result is None
231
232 def test_does_not_work_after_several_tries(self, stub_call):
233 os.environ['CEPH_VOLUME_WIPEFS_TRIES'] = '2'
234 stub_call([('wiping /dev/sda', '', 1), ('', '', 1)])
235 with pytest.raises(RuntimeError):
236 zap.wipefs('/dev/sda')
237
238 def test_does_not_work_default_tries(self, stub_call):
239 stub_call([('wiping /dev/sda', '', 1)]*8)
240 with pytest.raises(RuntimeError):
241 zap.wipefs('/dev/sda')