]>
git.proxmox.com Git - ceph.git/blob - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_migrate.py
2 from mock
.mock
import patch
3 from ceph_volume
import process
4 from ceph_volume
.api
import lvm
as api
5 from ceph_volume
.devices
.lvm
import migrate
6 from ceph_volume
.util
.device
import Device
7 from ceph_volume
.util
import system
9 class TestGetClusterName(object):
12 def mock_get_lvs(self
, *args
, **kwargs
):
13 return self
.mock_volumes
.pop(0)
15 def test_cluster_found(self
, monkeypatch
):
16 tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234,ceph.cluster_name=name_of_the_cluster'
17 vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='',
18 lv_path
='/dev/VolGroup/lv1', lv_tags
=tags
)
19 self
.mock_volumes
= []
20 self
.mock_volumes
.append([vol
])
22 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
23 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
25 result
= migrate
.get_cluster_name(osd_id
='0', osd_fsid
='1234')
26 assert "name_of_the_cluster" == result
28 def test_cluster_not_found(self
, monkeypatch
, capsys
):
29 self
.mock_volumes
= []
30 self
.mock_volumes
.append([])
32 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
33 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
35 with pytest
.raises(SystemExit) as error
:
36 migrate
.get_cluster_name(osd_id
='0', osd_fsid
='1234')
37 stdout
, stderr
= capsys
.readouterr()
38 expected
= 'Unexpected error, terminating'
39 assert expected
in str(error
.value
)
40 expected
= 'Unable to find any LV for source OSD: id:0 fsid:1234'
41 assert expected
in stderr
43 class TestFindAssociatedDevices(object):
46 def mock_get_lvs(self
, *args
, **kwargs
):
47 return self
.mock_volumes
.pop(0)
49 mock_single_volumes
= {}
50 def mock_get_single_lv(self
, *args
, **kwargs
):
51 p
= kwargs
['filters']['lv_path']
52 return self
.mock_single_volumes
[p
]
54 def test_lv_is_matched_id(self
, monkeypatch
):
55 tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234'
56 vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='',
57 lv_path
='/dev/VolGroup/lv1', lv_tags
=tags
)
58 self
.mock_volumes
= []
59 self
.mock_volumes
.append([vol
])
60 self
.mock_volumes
.append([vol
])
61 self
.mock_volumes
.append([])
62 self
.mock_volumes
.append([])
64 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': vol
}
66 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
67 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
68 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
70 result
= migrate
.find_associated_devices(osd_id
='0', osd_fsid
='1234')
71 assert len(result
) == 1
72 assert result
[0][0].path
== '/dev/VolGroup/lv1'
73 assert result
[0][0].lvs
== [vol
]
74 assert result
[0][1] == 'block'
76 def test_lv_is_matched_id2(self
, monkeypatch
):
77 tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234'
78 vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
79 lv_path
='/dev/VolGroup/lv1', lv_tags
=tags
)
80 tags2
= 'ceph.osd_id=0,ceph.journal_uuid=xx,ceph.type=wal,ceph.osd_fsid=1234'
81 vol2
= api
.Volume(lv_name
='volume2', lv_uuid
='z', vg_name
='vg',
82 lv_path
='/dev/VolGroup/lv2', lv_tags
=tags2
)
83 self
.mock_volumes
= []
84 self
.mock_volumes
.append([vol
])
85 self
.mock_volumes
.append([vol
])
86 self
.mock_volumes
.append([])
87 self
.mock_volumes
.append([vol2
])
89 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': vol
, '/dev/VolGroup/lv2': vol2
}
91 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
92 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
93 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
95 result
= migrate
.find_associated_devices(osd_id
='0', osd_fsid
='1234')
96 assert len(result
) == 2
99 assert d
[0].path
== '/dev/VolGroup/lv1'
100 assert d
[0].lvs
== [vol
]
102 assert d
[0].path
== '/dev/VolGroup/lv2'
103 assert d
[0].lvs
== [vol2
]
107 def test_lv_is_matched_id3(self
, monkeypatch
):
108 tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234'
109 vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
110 lv_path
='/dev/VolGroup/lv1', lv_tags
=tags
)
111 tags2
= 'ceph.osd_id=0,ceph.journal_uuid=xx,ceph.type=wal,ceph.osd_fsid=1234'
112 vol2
= api
.Volume(lv_name
='volume2', lv_uuid
='z', vg_name
='vg',
113 lv_path
='/dev/VolGroup/lv2', lv_tags
=tags2
)
114 tags3
= 'ceph.osd_id=0,ceph.journal_uuid=xx,ceph.type=db,ceph.osd_fsid=1234'
115 vol3
= api
.Volume(lv_name
='volume3', lv_uuid
='z', vg_name
='vg',
116 lv_path
='/dev/VolGroup/lv3', lv_tags
=tags3
)
118 self
.mock_volumes
= []
119 self
.mock_volumes
.append([vol
])
120 self
.mock_volumes
.append([vol
])
121 self
.mock_volumes
.append([vol3
])
122 self
.mock_volumes
.append([vol2
])
124 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': vol
,
125 '/dev/VolGroup/lv2': vol2
,
126 '/dev/VolGroup/lv3': vol3
}
128 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
129 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
130 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
132 result
= migrate
.find_associated_devices(osd_id
='0', osd_fsid
='1234')
133 assert len(result
) == 3
136 assert d
[0].path
== '/dev/VolGroup/lv1'
137 assert d
[0].lvs
== [vol
]
139 assert d
[0].path
== '/dev/VolGroup/lv2'
140 assert d
[0].lvs
== [vol2
]
142 assert d
[0].path
== '/dev/VolGroup/lv3'
143 assert d
[0].lvs
== [vol3
]
147 def test_lv_is_not_matched(self
, monkeypatch
, capsys
):
148 self
.mock_volumes
= [None]
149 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
150 monkeypatch
.setattr(process
, 'call', lambda x
, **kw
: ('', '', 0))
152 with pytest
.raises(SystemExit) as error
:
153 migrate
.find_associated_devices(osd_id
='1', osd_fsid
='1234')
154 stdout
, stderr
= capsys
.readouterr()
155 expected
= 'Unexpected error, terminating'
156 assert expected
in str(error
.value
)
157 expected
= 'Unable to find any LV for source OSD: id:1 fsid:1234'
158 assert expected
in stderr
160 class TestVolumeTagTracker(object):
161 mock_single_volumes
= {}
162 def mock_get_single_lv(self
, *args
, **kwargs
):
163 p
= kwargs
['filters']['lv_path']
164 return self
.mock_single_volumes
[p
]
166 mock_process_input
= []
167 def mock_process(self
, *args
, **kwargs
):
168 self
.mock_process_input
.append(args
[0]);
171 def test_init(self
, monkeypatch
):
172 source_tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234'
173 source_db_tags
= 'ceph.osd_id=0,journal_uuid=x,ceph.type=db, osd_fsid=1234'
174 source_wal_tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=wal'
175 target_tags
="ceph.a=1,ceph.b=2,c=3,ceph.d=4" # 'c' to be bypassed
178 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
179 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
180 db_vol
= api
.Volume(lv_name
='volume2', lv_uuid
='y', vg_name
='vg',
181 lv_path
='/dev/VolGroup/lv2', lv_tags
=source_db_tags
)
182 wal_vol
= api
.Volume(lv_name
='volume3', lv_uuid
='y', vg_name
='vg',
183 lv_path
='/dev/VolGroup/lv3', lv_tags
=source_wal_tags
)
185 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
186 '/dev/VolGroup/lv2': db_vol
,
187 '/dev/VolGroup/lv3': wal_vol
}
188 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
190 self
.mock_process_input
= []
191 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
193 data_device
= Device(path
= '/dev/VolGroup/lv1')
194 db_device
= Device(path
= '/dev/VolGroup/lv2')
195 wal_device
= Device(path
= '/dev/VolGroup/lv3')
196 devices
.append([data_device
, 'block'])
197 devices
.append([db_device
, 'db'])
198 devices
.append([wal_device
, 'wal'])
200 target
= api
.Volume(lv_name
='target_name', lv_tags
=target_tags
,
201 lv_path
='/dev/VolGroup/lv_target')
202 t
= migrate
.VolumeTagTracker(devices
, target
);
204 assert 3 == len(t
.old_target_tags
)
206 assert data_device
== t
.data_device
207 assert 4 == len(t
.old_data_tags
)
208 assert 'data' == t
.old_data_tags
['ceph.type']
210 assert db_device
== t
.db_device
211 assert 2 == len(t
.old_db_tags
)
212 assert 'db' == t
.old_db_tags
['ceph.type']
214 assert wal_device
== t
.wal_device
215 assert 3 == len(t
.old_wal_tags
)
216 assert 'wal' == t
.old_wal_tags
['ceph.type']
218 def test_update_tags_when_lv_create(self
, monkeypatch
):
220 'ceph.osd_id=0,ceph.journal_uuid=x,' \
221 'ceph.type=data,ceph.osd_fsid=1234'
223 'ceph.osd_id=0,journal_uuid=x,ceph.type=db,' \
228 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
229 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
230 db_vol
= api
.Volume(lv_name
='volume2', lv_uuid
='y', vg_name
='vg',
231 lv_path
='/dev/VolGroup/lv2', lv_tags
=source_db_tags
)
233 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
234 '/dev/VolGroup/lv2': db_vol
}
236 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
238 self
.mock_process_input
= []
239 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
241 data_device
= Device(path
= '/dev/VolGroup/lv1')
242 db_device
= Device(path
= '/dev/VolGroup/lv2')
243 devices
.append([data_device
, 'block'])
244 devices
.append([db_device
, 'db'])
246 target
= api
.Volume(lv_name
='target_name', lv_tags
='',
248 lv_path
='/dev/VolGroup/lv_target')
249 t
= migrate
.VolumeTagTracker(devices
, target
);
251 self
.mock_process_input
= []
252 t
.update_tags_when_lv_create('wal')
254 assert 3 == len(self
.mock_process_input
)
257 '--addtag', 'ceph.wal_uuid=wal_uuid',
258 '--addtag', 'ceph.wal_device=/dev/VolGroup/lv_target',
259 '/dev/VolGroup/lv1'] == self
.mock_process_input
[0]
261 assert self
.mock_process_input
[1].sort() == [
263 '--addtag', 'ceph.osd_id=0',
264 '--addtag', 'ceph.journal_uuid=x',
265 '--addtag', 'ceph.type=wal',
266 '--addtag', 'ceph.osd_fsid=1234',
267 '--addtag', 'ceph.wal_uuid=wal_uuid',
268 '--addtag', 'ceph.wal_device=/dev/VolGroup/lv_target',
269 '/dev/VolGroup/lv_target'].sort()
272 '--addtag', 'ceph.wal_uuid=wal_uuid',
273 '--addtag', 'ceph.wal_device=/dev/VolGroup/lv_target',
274 '/dev/VolGroup/lv2'] == self
.mock_process_input
[2]
276 def test_remove_lvs(self
, monkeypatch
):
278 'ceph.osd_id=0,ceph.journal_uuid=x,' \
279 'ceph.type=data,ceph.osd_fsid=1234,ceph.wal_uuid=aaaaa'
281 'ceph.osd_id=0,journal_uuid=x,ceph.type=db,' \
282 'osd_fsid=1234,ceph.wal_device=aaaaa'
284 'ceph.wal_uuid=uuid,ceph.wal_device=device,' \
285 'ceph.osd_id=0,ceph.type=wal'
289 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
290 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
291 db_vol
= api
.Volume(lv_name
='volume2', lv_uuid
='y', vg_name
='vg',
292 lv_path
='/dev/VolGroup/lv2', lv_tags
=source_db_tags
)
293 wal_vol
= api
.Volume(lv_name
='volume3', lv_uuid
='y', vg_name
='vg',
294 lv_path
='/dev/VolGroup/lv3', lv_tags
=source_wal_tags
)
296 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
297 '/dev/VolGroup/lv2': db_vol
,
298 '/dev/VolGroup/lv3': wal_vol
}
300 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
302 self
.mock_process_input
= []
303 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
305 data_device
= Device(path
= '/dev/VolGroup/lv1')
306 db_device
= Device(path
= '/dev/VolGroup/lv2')
307 wal_device
= Device(path
= '/dev/VolGroup/lv3')
308 devices
.append([data_device
, 'block'])
309 devices
.append([db_device
, 'db'])
310 devices
.append([wal_device
, 'wal'])
312 target
= api
.Volume(lv_name
='target_name', lv_tags
='',
313 lv_path
='/dev/VolGroup/lv_target')
314 t
= migrate
.VolumeTagTracker(devices
, target
);
316 device_to_remove
= devices
.copy()
318 self
.mock_process_input
= []
319 t
.remove_lvs(device_to_remove
, 'db')
321 assert 3 == len(self
.mock_process_input
)
323 '--deltag', 'ceph.wal_uuid=uuid',
324 '--deltag', 'ceph.wal_device=device',
325 '--deltag', 'ceph.osd_id=0',
326 '--deltag', 'ceph.type=wal',
327 '/dev/VolGroup/lv3'] == self
.mock_process_input
[0]
329 '--deltag', 'ceph.wal_uuid=aaaaa',
330 '/dev/VolGroup/lv1'] == self
.mock_process_input
[1]
332 '--deltag', 'ceph.wal_device=aaaaa',
333 '/dev/VolGroup/lv2'] == self
.mock_process_input
[2]
335 def test_replace_lvs(self
, monkeypatch
):
337 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234,'\
338 'ceph.wal_uuid=wal_uuid,ceph.db_device=/dbdevice'
340 'ceph.osd_id=0,ceph.type=db,ceph.osd_fsid=1234'
342 'ceph.wal_uuid=uuid,ceph.wal_device=device,' \
343 'ceph.osd_id=0,ceph.type=wal'
347 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid', vg_name
='vg',
348 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
349 db_vol
= api
.Volume(lv_name
='volume2', lv_uuid
='dbuuid', vg_name
='vg',
350 lv_path
='/dev/VolGroup/lv2', lv_tags
=source_db_tags
)
351 wal_vol
= api
.Volume(lv_name
='volume3', lv_uuid
='waluuid', vg_name
='vg',
352 lv_path
='/dev/VolGroup/lv3', lv_tags
=source_wal_tags
)
354 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
355 '/dev/VolGroup/lv2': db_vol
,
356 '/dev/VolGroup/lv3': wal_vol
}
358 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
360 self
.mock_process_input
= []
361 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
363 data_device
= Device(path
= '/dev/VolGroup/lv1')
364 db_device
= Device(path
= '/dev/VolGroup/lv2')
365 wal_device
= Device(path
= '/dev/VolGroup/lv3')
366 devices
.append([data_device
, 'block'])
367 devices
.append([db_device
, 'db'])
368 devices
.append([wal_device
, 'wal'])
370 target
= api
.Volume(lv_name
='target_name',
372 lv_tags
='ceph.tag_to_remove=aaa',
373 lv_path
='/dev/VolGroup/lv_target')
374 t
= migrate
.VolumeTagTracker(devices
, target
);
376 self
.mock_process_input
= []
377 t
.replace_lvs(devices
, 'db')
379 assert 5 == len(self
.mock_process_input
)
382 '--deltag', 'ceph.osd_id=0',
383 '--deltag', 'ceph.type=db',
384 '--deltag', 'ceph.osd_fsid=1234',
385 '/dev/VolGroup/lv2'] == self
.mock_process_input
[0]
387 '--deltag', 'ceph.wal_uuid=uuid',
388 '--deltag', 'ceph.wal_device=device',
389 '--deltag', 'ceph.osd_id=0',
390 '--deltag', 'ceph.type=wal',
391 '/dev/VolGroup/lv3'] == self
.mock_process_input
[1]
393 '--deltag', 'ceph.db_device=/dbdevice',
394 '--deltag', 'ceph.wal_uuid=wal_uuid',
395 '/dev/VolGroup/lv1'] == self
.mock_process_input
[2]
398 '--addtag', 'ceph.db_uuid=ttt',
399 '--addtag', 'ceph.db_device=/dev/VolGroup/lv_target',
400 '/dev/VolGroup/lv1'] == self
.mock_process_input
[3]
402 assert self
.mock_process_input
[4].sort() == [
404 '--addtag', 'ceph.osd_id=0',
405 '--addtag', 'ceph.osd_fsid=1234',
406 '--addtag', 'ceph.type=db',
407 '--addtag', 'ceph.db_uuid=ttt',
408 '--addtag', 'ceph.db_device=/dev/VolGroup/lv_target',
409 '/dev/VolGroup/lv_target'].sort()
411 def test_undo(self
, monkeypatch
):
412 source_tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.osd_fsid=1234'
413 source_db_tags
= 'ceph.osd_id=0,journal_uuid=x,ceph.type=db, osd_fsid=1234'
414 source_wal_tags
= 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=wal'
418 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='y', vg_name
='vg',
419 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
420 db_vol
= api
.Volume(lv_name
='volume2', lv_uuid
='y', vg_name
='vg',
421 lv_path
='/dev/VolGroup/lv2', lv_tags
=source_db_tags
)
422 wal_vol
= api
.Volume(lv_name
='volume3', lv_uuid
='y', vg_name
='vg',
423 lv_path
='/dev/VolGroup/lv3', lv_tags
=source_wal_tags
)
425 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
426 '/dev/VolGroup/lv2': db_vol
,
427 '/dev/VolGroup/lv3': wal_vol
}
429 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
431 self
.mock_process_input
= []
432 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
434 data_device
= Device(path
= '/dev/VolGroup/lv1')
435 db_device
= Device(path
= '/dev/VolGroup/lv2')
436 wal_device
= Device(path
= '/dev/VolGroup/lv3')
437 devices
.append([data_device
, 'block'])
438 devices
.append([db_device
, 'db'])
439 devices
.append([wal_device
, 'wal'])
441 target
= api
.Volume(lv_name
='target_name', lv_tags
=target_tags
,
442 lv_path
='/dev/VolGroup/lv_target')
443 t
= migrate
.VolumeTagTracker(devices
, target
);
445 target
.tags
['ceph.a'] = 'aa';
446 target
.tags
['ceph.b'] = 'bb';
448 data_vol
.tags
['ceph.journal_uuid'] = 'z';
450 db_vol
.tags
.pop('ceph.type')
454 assert 2 == len(target
.tags
)
455 assert 4 == len(data_vol
.tags
)
456 assert 1 == len(db_vol
.tags
)
458 self
.mock_process_input
= []
461 assert 0 == len(target
.tags
)
462 assert 4 == len(data_vol
.tags
)
463 assert 'x' == data_vol
.tags
['ceph.journal_uuid']
465 assert 2 == len(db_vol
.tags
)
466 assert 'db' == db_vol
.tags
['ceph.type']
468 assert 3 == len(wal_vol
.tags
)
469 assert 'wal' == wal_vol
.tags
['ceph.type']
471 assert 6 == len(self
.mock_process_input
)
472 assert 'lvchange' in self
.mock_process_input
[0]
473 assert '--deltag' in self
.mock_process_input
[0]
474 assert 'ceph.journal_uuid=z' in self
.mock_process_input
[0]
475 assert '/dev/VolGroup/lv1' in self
.mock_process_input
[0]
477 assert 'lvchange' in self
.mock_process_input
[1]
478 assert '--addtag' in self
.mock_process_input
[1]
479 assert 'ceph.journal_uuid=x' in self
.mock_process_input
[1]
480 assert '/dev/VolGroup/lv1' in self
.mock_process_input
[1]
482 assert 'lvchange' in self
.mock_process_input
[2]
483 assert '--deltag' in self
.mock_process_input
[2]
484 assert 'ceph.osd_id=0' in self
.mock_process_input
[2]
485 assert '/dev/VolGroup/lv2' in self
.mock_process_input
[2]
487 assert 'lvchange' in self
.mock_process_input
[3]
488 assert '--addtag' in self
.mock_process_input
[3]
489 assert 'ceph.type=db' in self
.mock_process_input
[3]
490 assert '/dev/VolGroup/lv2' in self
.mock_process_input
[3]
492 assert 'lvchange' in self
.mock_process_input
[4]
493 assert '--addtag' in self
.mock_process_input
[4]
494 assert 'ceph.type=wal' in self
.mock_process_input
[4]
495 assert '/dev/VolGroup/lv3' in self
.mock_process_input
[4]
497 assert 'lvchange' in self
.mock_process_input
[5]
498 assert '--deltag' in self
.mock_process_input
[5]
499 assert 'ceph.a=aa' in self
.mock_process_input
[5]
500 assert 'ceph.b=bb' in self
.mock_process_input
[5]
501 assert '/dev/VolGroup/lv_target' in self
.mock_process_input
[5]
503 class TestNew(object):
506 def mock_get_lv_by_fullname(self
, *args
, **kwargs
):
507 return self
.mock_volume
509 mock_process_input
= []
510 def mock_process(self
, *args
, **kwargs
):
511 self
.mock_process_input
.append(args
[0]);
514 mock_single_volumes
= {}
515 def mock_get_single_lv(self
, *args
, **kwargs
):
516 p
= kwargs
['filters']['lv_path']
517 return self
.mock_single_volumes
[p
]
520 def mock_get_lvs(self
, *args
, **kwargs
):
521 return self
.mock_volumes
.pop(0)
523 def test_newdb_non_root(self
):
524 with pytest
.raises(Exception) as error
:
527 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
528 '--target', 'vgname/new_db']).main()
529 expected
= 'This command needs to be executed with sudo or as root'
530 assert expected
in str(error
.value
)
533 def test_newdb_not_target_lvm(self
, m_getuid
, capsys
):
534 m_getuid
.return_value
= 0
535 with pytest
.raises(SystemExit) as error
:
538 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
539 '--target', 'vgname/new_db']).main()
540 stdout
, stderr
= capsys
.readouterr()
541 expected
= 'Unable to attach new volume : vgname/new_db'
542 assert expected
in str(error
.value
)
543 expected
= 'Target path vgname/new_db is not a Logical Volume'
544 assert expected
in stderr
548 def test_newdb_already_in_use(self
, m_getuid
, monkeypatch
, capsys
):
549 m_getuid
.return_value
= 0
551 self
.mock_volume
= api
.Volume(lv_name
='volume1',
554 lv_path
='/dev/VolGroup/lv1',
555 lv_tags
='ceph.osd_id=5') # this results in set used_by_ceph
556 monkeypatch
.setattr(api
, 'get_lv_by_fullname', self
.mock_get_lv_by_fullname
)
558 with pytest
.raises(SystemExit) as error
:
561 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
562 '--target', 'vgname/new_db']).main()
563 stdout
, stderr
= capsys
.readouterr()
564 expected
= 'Unable to attach new volume : vgname/new_db'
565 assert expected
in str(error
.value
)
566 expected
= 'Target Logical Volume is already used by ceph: vgname/new_db'
567 assert expected
in stderr
570 def test_newdb(self
, m_getuid
, monkeypatch
, capsys
):
571 m_getuid
.return_value
= 0
574 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234,'\
575 'ceph.wal_uuid=wal_uuid,ceph.db_device=/dbdevice'
577 'ceph.wal_uuid=uuid,ceph.wal_device=device,' \
578 'ceph.osd_id=0,ceph.type=wal'
580 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid',
582 lv_path
='/dev/VolGroup/lv1',
584 wal_vol
= api
.Volume(lv_name
='volume3',
587 lv_path
='/dev/VolGroup/lv3',
588 lv_tags
=source_wal_tags
)
590 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
591 '/dev/VolGroup/lv3': wal_vol
}
593 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
594 self
.mock_get_single_lv
)
596 self
.mock_process_input
= []
597 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
599 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y',
601 lv_path
='/dev/VolGroup/target_volume',
603 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
604 self
.mock_get_lv_by_fullname
)
606 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
609 #find_associated_devices will call get_lvs() 4 times
610 # and it this needs results to be arranged that way
611 self
.mock_volumes
= []
612 self
.mock_volumes
.append([data_vol
, wal_vol
])
613 self
.mock_volumes
.append([data_vol
])
614 self
.mock_volumes
.append([])
615 self
.mock_volumes
.append([wal_vol
])
617 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
619 monkeypatch
.setattr(migrate
, 'get_cluster_name',
620 lambda osd_id
, osd_fsid
: 'ceph_cluster')
621 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
625 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
626 '--target', 'vgname/new_db']).main()
628 n
= len(self
.mock_process_input
)
631 assert self
.mock_process_input
[n
- 5] == [
633 '--deltag', 'ceph.db_device=/dbdevice',
635 assert self
.mock_process_input
[n
- 4] == [
637 '--addtag', 'ceph.db_uuid=y',
638 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
641 assert self
.mock_process_input
[n
- 3].sort() == [
643 '--addtag', 'ceph.wal_uuid=uuid',
644 '--addtag', 'ceph.osd_id=0',
645 '--addtag', 'ceph.type=db',
646 '--addtag', 'ceph.osd_fsid=1234',
647 '--addtag', 'ceph.db_uuid=y',
648 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
649 '/dev/VolGroup/target_volume'].sort()
651 assert self
.mock_process_input
[n
- 2] == [
653 '--addtag', 'ceph.db_uuid=y',
654 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
657 assert self
.mock_process_input
[n
- 1] == [
658 'ceph-bluestore-tool',
659 '--path', '/var/lib/ceph/osd/ceph_cluster-1',
660 '--dev-target', '/dev/VolGroup/target_volume',
661 '--command', 'bluefs-bdev-new-db']
663 def test_newdb_active_systemd(self
, is_root
, monkeypatch
, capsys
):
665 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234,'\
666 'ceph.wal_uuid=wal_uuid,ceph.db_device=/dbdevice'
668 'ceph.wal_uuid=uuid,ceph.wal_device=device,' \
669 'ceph.osd_id=0,ceph.type=wal'
671 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid',
673 lv_path
='/dev/VolGroup/lv1',
675 wal_vol
= api
.Volume(lv_name
='volume3',
678 lv_path
='/dev/VolGroup/lv3',
679 lv_tags
=source_wal_tags
)
681 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
682 '/dev/VolGroup/lv3': wal_vol
}
684 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
685 self
.mock_get_single_lv
)
687 self
.mock_process_input
= []
688 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
690 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y',
692 lv_path
='/dev/VolGroup/target_volume',
694 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
695 self
.mock_get_lv_by_fullname
)
697 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
700 #find_associated_devices will call get_lvs() 4 times
701 # and it this needs results to be arranged that way
702 self
.mock_volumes
= []
703 self
.mock_volumes
.append([data_vol
, wal_vol
])
704 self
.mock_volumes
.append([data_vol
])
705 self
.mock_volumes
.append([])
706 self
.mock_volumes
.append([wal_vol
])
708 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
710 monkeypatch
.setattr(migrate
, 'get_cluster_name',
711 lambda osd_id
, osd_fsid
: 'ceph_cluster')
712 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
714 m
= migrate
.NewDB(argv
=[
716 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
717 '--target', 'vgname/new_db'])
719 with pytest
.raises(SystemExit) as error
:
722 stdout
, stderr
= capsys
.readouterr()
724 assert 'Unable to attach new volume for OSD: 1' == str(error
.value
)
725 assert '--> OSD ID is running, stop it with: systemctl stop ceph-osd@1' == stderr
.rstrip()
728 def test_newdb_no_systemd(self
, is_root
, monkeypatch
):
730 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234,'\
731 'ceph.wal_uuid=wal_uuid,ceph.db_device=/dbdevice'
733 'ceph.wal_uuid=uuid,ceph.wal_device=device,' \
734 'ceph.osd_id=0,ceph.type=wal'
736 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid',
738 lv_path
='/dev/VolGroup/lv1',
740 wal_vol
= api
.Volume(lv_name
='volume3',
743 lv_path
='/dev/VolGroup/lv3',
744 lv_tags
=source_wal_tags
)
746 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
,
747 '/dev/VolGroup/lv3': wal_vol
}
749 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
750 self
.mock_get_single_lv
)
752 self
.mock_process_input
= []
753 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
755 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y',
757 lv_path
='/dev/VolGroup/target_volume',
759 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
760 self
.mock_get_lv_by_fullname
)
762 #find_associated_devices will call get_lvs() 4 times
763 # and it this needs results to be arranged that way
764 self
.mock_volumes
= []
765 self
.mock_volumes
.append([data_vol
, wal_vol
])
766 self
.mock_volumes
.append([data_vol
])
767 self
.mock_volumes
.append([])
768 self
.mock_volumes
.append([wal_vol
])
770 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
772 monkeypatch
.setattr(migrate
, 'get_cluster_name',
773 lambda osd_id
, osd_fsid
: 'ceph_cluster')
774 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
778 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
779 '--target', 'vgname/new_db',
780 '--no-systemd']).main()
782 n
= len(self
.mock_process_input
)
785 assert self
.mock_process_input
[n
- 5] == [
787 '--deltag', 'ceph.db_device=/dbdevice',
789 assert self
.mock_process_input
[n
- 4] == [
791 '--addtag', 'ceph.db_uuid=y',
792 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
795 assert self
.mock_process_input
[n
- 3].sort() == [
797 '--addtag', 'ceph.wal_uuid=uuid',
798 '--addtag', 'ceph.osd_id=0',
799 '--addtag', 'ceph.type=db',
800 '--addtag', 'ceph.osd_fsid=1234',
801 '--addtag', 'ceph.db_uuid=y',
802 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
803 '/dev/VolGroup/target_volume'].sort()
805 assert self
.mock_process_input
[n
- 2] == [
807 '--addtag', 'ceph.db_uuid=y',
808 '--addtag', 'ceph.db_device=/dev/VolGroup/target_volume',
811 assert self
.mock_process_input
[n
- 1] == [
812 'ceph-bluestore-tool',
813 '--path', '/var/lib/ceph/osd/ceph_cluster-1',
814 '--dev-target', '/dev/VolGroup/target_volume',
815 '--command', 'bluefs-bdev-new-db']
818 def test_newwal(self
, m_getuid
, monkeypatch
, capsys
):
819 m_getuid
.return_value
= 0
822 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234'
824 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid', vg_name
='vg',
825 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
827 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
}
829 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
831 self
.mock_process_input
= []
832 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
834 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y', vg_name
='vg',
835 lv_path
='/dev/VolGroup/target_volume',
837 monkeypatch
.setattr(api
, 'get_lv_by_fullname', self
.mock_get_lv_by_fullname
)
839 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active", lambda id: False)
841 #find_associated_devices will call get_lvs() 4 times
842 # and it this needs results to be arranged that way
843 self
.mock_volumes
= []
844 self
.mock_volumes
.append([data_vol
])
845 self
.mock_volumes
.append([data_vol
])
846 self
.mock_volumes
.append([])
847 self
.mock_volumes
.append([])
849 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
851 monkeypatch
.setattr(migrate
, 'get_cluster_name', lambda osd_id
, osd_fsid
: 'cluster')
852 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
854 migrate
.NewWAL(argv
=[
856 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
857 '--target', 'vgname/new_wal']).main()
859 n
= len(self
.mock_process_input
)
862 assert self
.mock_process_input
[n
- 3] == [
864 '--addtag', 'ceph.wal_uuid=y',
865 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
868 assert self
.mock_process_input
[n
- 2].sort() == [
870 '--addtag', 'ceph.osd_id=0',
871 '--addtag', 'ceph.type=wal',
872 '--addtag', 'ceph.osd_fsid=1234',
873 '--addtag', 'ceph.wal_uuid=y',
874 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
875 '/dev/VolGroup/target_volume'].sort()
877 assert self
.mock_process_input
[n
- 1] == [
878 'ceph-bluestore-tool',
879 '--path', '/var/lib/ceph/osd/cluster-2',
880 '--dev-target', '/dev/VolGroup/target_volume',
881 '--command', 'bluefs-bdev-new-wal']
883 def test_newwal_active_systemd(self
, is_root
, monkeypatch
, capsys
):
885 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234'
887 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid', vg_name
='vg',
888 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
890 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
}
892 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
894 self
.mock_process_input
= []
895 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
897 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y', vg_name
='vg',
898 lv_path
='/dev/VolGroup/target_volume',
900 monkeypatch
.setattr(api
, 'get_lv_by_fullname', self
.mock_get_lv_by_fullname
)
902 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active", lambda id: True)
904 #find_associated_devices will call get_lvs() 4 times
905 # and it this needs results to be arranged that way
906 self
.mock_volumes
= []
907 self
.mock_volumes
.append([data_vol
])
908 self
.mock_volumes
.append([data_vol
])
909 self
.mock_volumes
.append([])
910 self
.mock_volumes
.append([])
912 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
914 monkeypatch
.setattr(migrate
, 'get_cluster_name', lambda osd_id
, osd_fsid
: 'cluster')
915 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
917 m
= migrate
.NewWAL(argv
=[
919 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
920 '--target', 'vgname/new_wal'])
922 with pytest
.raises(SystemExit) as error
:
925 stdout
, stderr
= capsys
.readouterr()
927 assert 'Unable to attach new volume for OSD: 2' == str(error
.value
)
928 assert '--> OSD ID is running, stop it with: systemctl stop ceph-osd@2' == stderr
.rstrip()
931 def test_newwal_no_systemd(self
, is_root
, monkeypatch
):
933 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234'
935 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid', vg_name
='vg',
936 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
938 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
}
940 monkeypatch
.setattr(migrate
.api
, 'get_single_lv', self
.mock_get_single_lv
)
942 self
.mock_process_input
= []
943 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
945 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y', vg_name
='vg',
946 lv_path
='/dev/VolGroup/target_volume',
948 monkeypatch
.setattr(api
, 'get_lv_by_fullname', self
.mock_get_lv_by_fullname
)
950 #find_associated_devices will call get_lvs() 4 times
951 # and it this needs results to be arranged that way
952 self
.mock_volumes
= []
953 self
.mock_volumes
.append([data_vol
])
954 self
.mock_volumes
.append([data_vol
])
955 self
.mock_volumes
.append([])
956 self
.mock_volumes
.append([])
958 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
960 monkeypatch
.setattr(migrate
, 'get_cluster_name', lambda osd_id
, osd_fsid
: 'cluster')
961 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
963 migrate
.NewWAL(argv
=[
965 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
966 '--target', 'vgname/new_wal',
967 '--no-systemd']).main()
969 n
= len(self
.mock_process_input
)
972 assert self
.mock_process_input
[n
- 3] == [
974 '--addtag', 'ceph.wal_uuid=y',
975 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
978 assert self
.mock_process_input
[n
- 2].sort() == [
980 '--addtag', 'ceph.osd_id=0',
981 '--addtag', 'ceph.type=wal',
982 '--addtag', 'ceph.osd_fsid=1234',
983 '--addtag', 'ceph.wal_uuid=y',
984 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
985 '/dev/VolGroup/target_volume'].sort()
987 assert self
.mock_process_input
[n
- 1] == [
988 'ceph-bluestore-tool',
989 '--path', '/var/lib/ceph/osd/cluster-2',
990 '--dev-target', '/dev/VolGroup/target_volume',
991 '--command', 'bluefs-bdev-new-wal']
993 class TestMigrate(object):
995 def test_invalid_osd_id_passed(self
, is_root
):
996 with pytest
.raises(SystemExit):
997 migrate
.Migrate(argv
=['--osd-fsid', '123', '--from', 'data', '--target', 'foo', '--osd-id', 'foo']).main()
1000 def mock_get_lv_by_fullname(self
, *args
, **kwargs
):
1001 return self
.mock_volume
1003 mock_process_input
= []
1004 def mock_process(self
, *args
, **kwargs
):
1005 self
.mock_process_input
.append(args
[0])
1008 mock_single_volumes
= {}
1009 def mock_get_single_lv(self
, *args
, **kwargs
):
1010 p
= kwargs
['filters']['lv_path']
1011 return self
.mock_single_volumes
[p
]
1014 def mock_get_lvs(self
, *args
, **kwargs
):
1015 return self
.mock_volumes
.pop(0)
1017 def test_get_source_devices(self
, monkeypatch
):
1019 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234'
1020 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234'
1021 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234'
1023 data_vol
= api
.Volume(lv_name
='volume1',
1026 lv_path
='/dev/VolGroup/lv1',
1027 lv_tags
=source_tags
)
1028 db_vol
= api
.Volume(lv_name
='volume2',
1031 lv_path
='/dev/VolGroup/lv2',
1032 lv_tags
=source_db_tags
)
1034 wal_vol
= api
.Volume(lv_name
='volume3',
1037 lv_path
='/dev/VolGroup/lv3',
1038 lv_tags
=source_wal_tags
)
1040 self
.mock_single_volumes
= {
1041 '/dev/VolGroup/lv1': data_vol
,
1042 '/dev/VolGroup/lv2': db_vol
,
1043 '/dev/VolGroup/lv3': wal_vol
,
1045 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1046 self
.mock_get_single_lv
)
1048 self
.mock_volume
= api
.Volume(lv_name
='volume2', lv_uuid
='y',
1050 lv_path
='/dev/VolGroup/lv2',
1051 lv_tags
='ceph.osd_id=5,ceph.osd_type=db')
1052 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1053 self
.mock_get_lv_by_fullname
)
1055 self
.mock_process_input
= []
1056 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1059 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1060 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1061 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1063 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1064 lambda osd_id
, osd_fsid
: devices
)
1069 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
1070 '--from', 'data', 'wal',
1071 '--target', 'vgname/new_wal'
1073 m
= migrate
.Migrate(argv
=argv
)
1074 m
.args
= m
.make_parser('ceph-volume lvm migation', 'help').parse_args(argv
)
1075 res_devices
= m
.get_source_devices(devices
)
1077 assert 2 == len(res_devices
)
1078 assert devices
[0] == res_devices
[0]
1079 assert devices
[2] == res_devices
[1]
1083 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
1084 '--from', 'db', 'wal', 'data',
1085 '--target', 'vgname/new_wal'
1087 m
= migrate
.Migrate(argv
=argv
)
1088 m
.args
= m
.make_parser('ceph-volume lvm migation', 'help').parse_args(argv
)
1089 res_devices
= m
.get_source_devices(devices
)
1091 assert 3 == len(res_devices
)
1092 assert devices
[0] == res_devices
[0]
1093 assert devices
[1] == res_devices
[1]
1094 assert devices
[2] == res_devices
[2]
1097 def test_migrate_without_args(self
, capsys
):
1099 Moves BlueFS data from source volume(s) to the target one, source
1100 volumes (except the main (i.e. data or block) one) are removed on
1101 success. LVM volumes are permitted for Target only, both already
1102 attached or new logical one. In the latter case it is attached to OSD
1103 replacing one of the source devices. Following replacement rules apply
1104 (in the order of precedence, stop on the first match):
1105 * if source list has DB volume - target device replaces it.
1106 * if source list has WAL volume - target device replace it.
1107 * if source list has slow volume only - operation is not permitted,
1108 requires explicit allocation via new-db/new-wal command.
1110 Example calls for supported scenarios:
1112 Moves BlueFS data from main device to LV already attached as DB:
1114 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from data --target vgname/db
1116 Moves BlueFS data from shared main device to LV which will be attached
1119 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from data --target vgname/new_db
1121 Moves BlueFS data from DB device to new LV, DB is replaced:
1123 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from db --target vgname/new_db
1125 Moves BlueFS data from main and DB devices to new LV, DB is replaced:
1127 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from data db --target vgname/new_db
1129 Moves BlueFS data from main, DB and WAL devices to new LV, WAL is
1130 removed and DB is replaced:
1132 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from data db wal --target vgname/new_db
1134 Moves BlueFS data from main, DB and WAL devices to main device, WAL
1137 ceph-volume lvm migrate --osd-id 1 --osd-fsid <uuid> --from db wal --target vgname/data
1140 m
= migrate
.Migrate(argv
=[])
1142 stdout
, stderr
= capsys
.readouterr()
1143 assert help_msg
in stdout
1148 def test_migrate_data_db_to_new_db(self
, m_getuid
, monkeypatch
):
1149 m_getuid
.return_value
= 0
1151 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1152 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1153 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1154 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1156 data_vol
= api
.Volume(lv_name
='volume1',
1159 lv_path
='/dev/VolGroup/lv1',
1160 lv_tags
=source_tags
)
1161 db_vol
= api
.Volume(lv_name
='volume2',
1164 lv_path
='/dev/VolGroup/lv2',
1165 lv_tags
=source_db_tags
)
1167 self
.mock_single_volumes
= {
1168 '/dev/VolGroup/lv1': data_vol
,
1169 '/dev/VolGroup/lv2': db_vol
,
1171 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1172 self
.mock_get_single_lv
)
1174 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1176 lv_path
='/dev/VolGroup/lv2_new',
1178 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1179 self
.mock_get_lv_by_fullname
)
1181 self
.mock_process_input
= []
1182 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1185 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1186 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1188 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1189 lambda osd_id
, osd_fsid
: devices
)
1192 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1195 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1196 lambda osd_id
, osd_fsid
: 'ceph')
1197 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1198 m
= migrate
.Migrate(argv
=[
1200 '--osd-fsid', '1234',
1201 '--from', 'data', 'db', 'wal',
1202 '--target', 'vgname/new_wal'])
1205 n
= len(self
.mock_process_input
)
1208 assert self
. mock_process_input
[n
-5] == [
1210 '--deltag', 'ceph.osd_id=2',
1211 '--deltag', 'ceph.type=db',
1212 '--deltag', 'ceph.osd_fsid=1234',
1213 '--deltag', 'ceph.cluster_name=ceph',
1214 '--deltag', 'ceph.db_uuid=dbuuid',
1215 '--deltag', 'ceph.db_device=db_dev',
1216 '/dev/VolGroup/lv2']
1218 assert self
. mock_process_input
[n
-4] == [
1220 '--deltag', 'ceph.db_uuid=dbuuid',
1221 '--deltag', 'ceph.db_device=db_dev',
1222 '/dev/VolGroup/lv1']
1224 assert self
. mock_process_input
[n
-3] == [
1226 '--addtag', 'ceph.db_uuid=new-db-uuid',
1227 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1228 '/dev/VolGroup/lv1']
1230 assert self
. mock_process_input
[n
-2] == [
1232 '--addtag', 'ceph.osd_id=2',
1233 '--addtag', 'ceph.type=db',
1234 '--addtag', 'ceph.osd_fsid=1234',
1235 '--addtag', 'ceph.cluster_name=ceph',
1236 '--addtag', 'ceph.db_uuid=new-db-uuid',
1237 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1238 '/dev/VolGroup/lv2_new']
1240 assert self
. mock_process_input
[n
-1] == [
1241 'ceph-bluestore-tool',
1242 '--path', '/var/lib/ceph/osd/ceph-2',
1243 '--dev-target', '/dev/VolGroup/lv2_new',
1244 '--command', 'bluefs-bdev-migrate',
1245 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1246 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db']
1248 def test_migrate_data_db_to_new_db_active_systemd(self
, is_root
, monkeypatch
, capsys
):
1249 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1250 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1251 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1252 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1254 data_vol
= api
.Volume(lv_name
='volume1',
1257 lv_path
='/dev/VolGroup/lv1',
1258 lv_tags
=source_tags
)
1259 db_vol
= api
.Volume(lv_name
='volume2',
1262 lv_path
='/dev/VolGroup/lv2',
1263 lv_tags
=source_db_tags
)
1265 self
.mock_single_volumes
= {
1266 '/dev/VolGroup/lv1': data_vol
,
1267 '/dev/VolGroup/lv2': db_vol
,
1269 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1270 self
.mock_get_single_lv
)
1272 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1274 lv_path
='/dev/VolGroup/lv2_new',
1276 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1277 self
.mock_get_lv_by_fullname
)
1279 self
.mock_process_input
= []
1280 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1283 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1284 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1286 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1287 lambda osd_id
, osd_fsid
: devices
)
1290 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1293 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1294 lambda osd_id
, osd_fsid
: 'ceph')
1295 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1296 m
= migrate
.Migrate(argv
=[
1298 '--osd-fsid', '1234',
1299 '--from', 'data', 'db', 'wal',
1300 '--target', 'vgname/new_wal'])
1302 with pytest
.raises(SystemExit) as error
:
1305 stdout
, stderr
= capsys
.readouterr()
1307 assert 'Unable to migrate devices associated with OSD ID: 2' == str(error
.value
)
1308 assert '--> OSD is running, stop it with: systemctl stop ceph-osd@2' == stderr
.rstrip()
1311 def test_migrate_data_db_to_new_db_no_systemd(self
, is_root
, monkeypatch
):
1312 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1313 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1314 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1315 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1317 data_vol
= api
.Volume(lv_name
='volume1',
1320 lv_path
='/dev/VolGroup/lv1',
1321 lv_tags
=source_tags
)
1322 db_vol
= api
.Volume(lv_name
='volume2',
1325 lv_path
='/dev/VolGroup/lv2',
1326 lv_tags
=source_db_tags
)
1328 self
.mock_single_volumes
= {
1329 '/dev/VolGroup/lv1': data_vol
,
1330 '/dev/VolGroup/lv2': db_vol
,
1332 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1333 self
.mock_get_single_lv
)
1335 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1337 lv_path
='/dev/VolGroup/lv2_new',
1339 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1340 self
.mock_get_lv_by_fullname
)
1342 self
.mock_process_input
= []
1343 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1346 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1347 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1349 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1350 lambda osd_id
, osd_fsid
: devices
)
1353 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1354 lambda osd_id
, osd_fsid
: 'ceph')
1355 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1356 m
= migrate
.Migrate(argv
=[
1358 '--osd-fsid', '1234',
1359 '--from', 'data', 'db', 'wal',
1360 '--target', 'vgname/new_wal',
1364 n
= len(self
.mock_process_input
)
1367 assert self
. mock_process_input
[n
-5] == [
1369 '--deltag', 'ceph.osd_id=2',
1370 '--deltag', 'ceph.type=db',
1371 '--deltag', 'ceph.osd_fsid=1234',
1372 '--deltag', 'ceph.cluster_name=ceph',
1373 '--deltag', 'ceph.db_uuid=dbuuid',
1374 '--deltag', 'ceph.db_device=db_dev',
1375 '/dev/VolGroup/lv2']
1377 assert self
. mock_process_input
[n
-4] == [
1379 '--deltag', 'ceph.db_uuid=dbuuid',
1380 '--deltag', 'ceph.db_device=db_dev',
1381 '/dev/VolGroup/lv1']
1383 assert self
. mock_process_input
[n
-3] == [
1385 '--addtag', 'ceph.db_uuid=new-db-uuid',
1386 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1387 '/dev/VolGroup/lv1']
1389 assert self
. mock_process_input
[n
-2] == [
1391 '--addtag', 'ceph.osd_id=2',
1392 '--addtag', 'ceph.type=db',
1393 '--addtag', 'ceph.osd_fsid=1234',
1394 '--addtag', 'ceph.cluster_name=ceph',
1395 '--addtag', 'ceph.db_uuid=new-db-uuid',
1396 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1397 '/dev/VolGroup/lv2_new']
1399 assert self
. mock_process_input
[n
-1] == [
1400 'ceph-bluestore-tool',
1401 '--path', '/var/lib/ceph/osd/ceph-2',
1402 '--dev-target', '/dev/VolGroup/lv2_new',
1403 '--command', 'bluefs-bdev-migrate',
1404 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1405 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db']
1408 def test_migrate_data_db_to_new_db_skip_wal(self
, m_getuid
, monkeypatch
):
1409 m_getuid
.return_value
= 0
1411 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1412 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1413 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1414 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1415 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234' \
1416 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1418 data_vol
= api
.Volume(lv_name
='volume1',
1421 lv_path
='/dev/VolGroup/lv1',
1422 lv_tags
=source_tags
)
1423 db_vol
= api
.Volume(lv_name
='volume2',
1426 lv_path
='/dev/VolGroup/lv2',
1427 lv_tags
=source_db_tags
)
1429 wal_vol
= api
.Volume(lv_name
='volume3',
1432 lv_path
='/dev/VolGroup/lv3',
1433 lv_tags
=source_wal_tags
)
1435 self
.mock_single_volumes
= {
1436 '/dev/VolGroup/lv1': data_vol
,
1437 '/dev/VolGroup/lv2': db_vol
,
1438 '/dev/VolGroup/lv3': wal_vol
,
1440 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1441 self
.mock_get_single_lv
)
1443 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1445 lv_path
='/dev/VolGroup/lv2_new',
1447 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1448 self
.mock_get_lv_by_fullname
)
1450 self
.mock_process_input
= []
1451 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1454 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1455 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1456 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1458 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1459 lambda osd_id
, osd_fsid
: devices
)
1461 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1464 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1465 lambda osd_id
, osd_fsid
: 'ceph')
1466 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1467 m
= migrate
.Migrate(argv
=[
1469 '--osd-fsid', '1234',
1470 '--from', 'data', 'db',
1471 '--target', 'vgname/new_wal'])
1474 n
= len(self
.mock_process_input
)
1477 assert self
. mock_process_input
[n
-7] == [
1479 '--deltag', 'ceph.osd_id=2',
1480 '--deltag', 'ceph.type=db',
1481 '--deltag', 'ceph.osd_fsid=1234',
1482 '--deltag', 'ceph.cluster_name=ceph',
1483 '--deltag', 'ceph.db_uuid=dbuuid',
1484 '--deltag', 'ceph.db_device=db_dev',
1485 '/dev/VolGroup/lv2']
1487 assert self
. mock_process_input
[n
-6] == [
1489 '--deltag', 'ceph.db_uuid=dbuuid',
1490 '--deltag', 'ceph.db_device=db_dev',
1491 '/dev/VolGroup/lv1']
1493 assert self
. mock_process_input
[n
-5] == [
1495 '--addtag', 'ceph.db_uuid=new-db-uuid',
1496 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1497 '/dev/VolGroup/lv1']
1499 assert self
. mock_process_input
[n
-4] == [
1501 '--deltag', 'ceph.db_uuid=dbuuid',
1502 '--deltag', 'ceph.db_device=db_dev',
1503 '/dev/VolGroup/lv3']
1505 assert self
. mock_process_input
[n
-3] == [
1507 '--addtag', 'ceph.db_uuid=new-db-uuid',
1508 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1509 '/dev/VolGroup/lv3']
1511 assert self
. mock_process_input
[n
-2] == [
1513 '--addtag', 'ceph.osd_id=2',
1514 '--addtag', 'ceph.type=db',
1515 '--addtag', 'ceph.osd_fsid=1234',
1516 '--addtag', 'ceph.cluster_name=ceph',
1517 '--addtag', 'ceph.db_uuid=new-db-uuid',
1518 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1519 '/dev/VolGroup/lv2_new']
1521 assert self
. mock_process_input
[n
-1] == [
1522 'ceph-bluestore-tool',
1523 '--path', '/var/lib/ceph/osd/ceph-2',
1524 '--dev-target', '/dev/VolGroup/lv2_new',
1525 '--command', 'bluefs-bdev-migrate',
1526 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1527 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db']
1530 def test_migrate_data_db_wal_to_new_db(self
, m_getuid
, monkeypatch
):
1531 m_getuid
.return_value
= 0
1533 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1534 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1535 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1536 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1537 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1538 source_wal_tags
= 'ceph.osd_id=0,ceph.type=wal,ceph.osd_fsid=1234,' \
1539 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1540 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1542 data_vol
= api
.Volume(lv_name
='volume1',
1545 lv_path
='/dev/VolGroup/lv1',
1546 lv_tags
=source_tags
)
1547 db_vol
= api
.Volume(lv_name
='volume2',
1550 lv_path
='/dev/VolGroup/lv2',
1551 lv_tags
=source_db_tags
)
1553 wal_vol
= api
.Volume(lv_name
='volume3',
1556 lv_path
='/dev/VolGroup/lv3',
1557 lv_tags
=source_wal_tags
)
1559 self
.mock_single_volumes
= {
1560 '/dev/VolGroup/lv1': data_vol
,
1561 '/dev/VolGroup/lv2': db_vol
,
1562 '/dev/VolGroup/lv3': wal_vol
,
1564 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1565 self
.mock_get_single_lv
)
1567 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1569 lv_path
='/dev/VolGroup/lv2_new',
1571 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1572 self
.mock_get_lv_by_fullname
)
1574 self
.mock_process_input
= []
1575 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1578 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1579 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1580 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1582 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1583 lambda osd_id
, osd_fsid
: devices
)
1585 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1588 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1589 lambda osd_id
, osd_fsid
: 'ceph')
1590 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1591 m
= migrate
.Migrate(argv
=[
1593 '--osd-fsid', '1234',
1594 '--from', 'data', 'db', 'wal',
1595 '--target', 'vgname/new_wal'])
1598 n
= len(self
.mock_process_input
)
1601 assert self
. mock_process_input
[n
-6] == [
1603 '--deltag', 'ceph.osd_id=2',
1604 '--deltag', 'ceph.type=db',
1605 '--deltag', 'ceph.osd_fsid=1234',
1606 '--deltag', 'ceph.cluster_name=ceph',
1607 '--deltag', 'ceph.db_uuid=dbuuid',
1608 '--deltag', 'ceph.db_device=db_dev',
1609 '/dev/VolGroup/lv2']
1611 assert self
. mock_process_input
[n
-5] == [
1613 '--deltag', 'ceph.osd_id=0',
1614 '--deltag', 'ceph.type=wal',
1615 '--deltag', 'ceph.osd_fsid=1234',
1616 '--deltag', 'ceph.cluster_name=ceph',
1617 '--deltag', 'ceph.db_uuid=dbuuid',
1618 '--deltag', 'ceph.db_device=db_dev',
1619 '--deltag', 'ceph.wal_uuid=waluuid',
1620 '--deltag', 'ceph.wal_device=wal_dev',
1621 '/dev/VolGroup/lv3']
1623 assert self
. mock_process_input
[n
-4] == [
1625 '--deltag', 'ceph.db_uuid=dbuuid',
1626 '--deltag', 'ceph.db_device=db_dev',
1627 '--deltag', 'ceph.wal_uuid=waluuid',
1628 '--deltag', 'ceph.wal_device=wal_dev',
1629 '/dev/VolGroup/lv1']
1631 assert self
. mock_process_input
[n
-3] == [
1633 '--addtag', 'ceph.db_uuid=new-db-uuid',
1634 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1635 '/dev/VolGroup/lv1']
1637 assert self
. mock_process_input
[n
-2] == [
1639 '--addtag', 'ceph.osd_id=2',
1640 '--addtag', 'ceph.type=db',
1641 '--addtag', 'ceph.osd_fsid=1234',
1642 '--addtag', 'ceph.cluster_name=ceph',
1643 '--addtag', 'ceph.db_uuid=new-db-uuid',
1644 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1645 '/dev/VolGroup/lv2_new']
1647 assert self
. mock_process_input
[n
-1] == [
1648 'ceph-bluestore-tool',
1649 '--path', '/var/lib/ceph/osd/ceph-2',
1650 '--dev-target', '/dev/VolGroup/lv2_new',
1651 '--command', 'bluefs-bdev-migrate',
1652 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1653 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db',
1654 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.wal']
1657 def test_dont_migrate_data_db_wal_to_new_data(self
,
1661 m_getuid
.return_value
= 0
1663 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1664 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1665 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1666 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1668 data_vol
= api
.Volume(lv_name
='volume1',
1671 lv_path
='/dev/VolGroup/lv1',
1672 lv_tags
=source_tags
)
1673 db_vol
= api
.Volume(lv_name
='volume2',
1676 lv_path
='/dev/VolGroup/lv2',
1677 lv_tags
=source_db_tags
)
1679 self
.mock_single_volumes
= {
1680 '/dev/VolGroup/lv1': data_vol
,
1681 '/dev/VolGroup/lv2': db_vol
,
1683 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1684 self
.mock_get_single_lv
)
1686 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1688 lv_path
='/dev/VolGroup/lv2_new',
1690 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1691 self
.mock_get_lv_by_fullname
)
1693 self
.mock_process_input
= []
1694 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1697 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1698 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1700 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1701 lambda osd_id
, osd_fsid
: devices
)
1703 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1706 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1707 lambda osd_id
, osd_fsid
: 'ceph')
1708 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1709 m
= migrate
.Migrate(argv
=[
1711 '--osd-fsid', '1234',
1713 '--target', 'vgname/new_data'])
1715 with pytest
.raises(SystemExit) as error
:
1717 stdout
, stderr
= capsys
.readouterr()
1718 expected
= 'Unable to migrate to : vgname/new_data'
1719 assert expected
in str(error
.value
)
1720 expected
= 'Unable to determine new volume type,'
1721 ' please use new-db or new-wal command before.'
1722 assert expected
in stderr
1725 def test_dont_migrate_db_to_wal(self
,
1729 m_getuid
.return_value
= 0
1731 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1732 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1733 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1734 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1735 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1736 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1737 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1738 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1740 data_vol
= api
.Volume(lv_name
='volume1',
1743 lv_path
='/dev/VolGroup/lv1',
1744 lv_tags
=source_tags
)
1745 db_vol
= api
.Volume(lv_name
='volume2',
1748 lv_path
='/dev/VolGroup/lv2',
1749 lv_tags
=source_db_tags
)
1751 wal_vol
= api
.Volume(lv_name
='volume3',
1754 lv_path
='/dev/VolGroup/lv3',
1755 lv_tags
=source_wal_tags
)
1757 self
.mock_single_volumes
= {
1758 '/dev/VolGroup/lv1': data_vol
,
1759 '/dev/VolGroup/lv2': db_vol
,
1760 '/dev/VolGroup/lv3': wal_vol
,
1762 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1763 self
.mock_get_single_lv
)
1765 self
.mock_volume
= wal_vol
1766 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1767 self
.mock_get_lv_by_fullname
)
1769 self
.mock_process_input
= []
1770 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1773 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1774 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1775 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1777 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1778 lambda osd_id
, osd_fsid
: devices
)
1780 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1783 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1784 lambda osd_id
, osd_fsid
: 'ceph')
1785 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1786 m
= migrate
.Migrate(argv
=[
1788 '--osd-fsid', '1234',
1790 '--target', 'vgname/wal'])
1792 with pytest
.raises(SystemExit) as error
:
1794 stdout
, stderr
= capsys
.readouterr()
1795 expected
= 'Unable to migrate to : vgname/wal'
1796 assert expected
in str(error
.value
)
1797 expected
= 'Migrate to WAL is not supported'
1798 assert expected
in stderr
1801 def test_migrate_data_db_to_db(self
,
1805 m_getuid
.return_value
= 0
1807 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1808 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1809 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1810 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1811 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1812 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1813 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1814 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1816 data_vol
= api
.Volume(lv_name
='volume1',
1819 lv_path
='/dev/VolGroup/lv1',
1820 lv_tags
=source_tags
)
1821 db_vol
= api
.Volume(lv_name
='volume2',
1824 lv_path
='/dev/VolGroup/lv2',
1825 lv_tags
=source_db_tags
)
1827 wal_vol
= api
.Volume(lv_name
='volume3',
1830 lv_path
='/dev/VolGroup/lv3',
1831 lv_tags
=source_wal_tags
)
1833 self
.mock_single_volumes
= {
1834 '/dev/VolGroup/lv1': data_vol
,
1835 '/dev/VolGroup/lv2': db_vol
,
1836 '/dev/VolGroup/lv3': wal_vol
,
1838 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1839 self
.mock_get_single_lv
)
1841 self
.mock_volume
= db_vol
1842 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1843 self
.mock_get_lv_by_fullname
)
1845 self
.mock_process_input
= []
1846 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1849 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1850 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1851 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1853 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1854 lambda osd_id
, osd_fsid
: devices
)
1856 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1859 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1860 lambda osd_id
, osd_fsid
: 'ceph')
1861 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1862 m
= migrate
.Migrate(argv
=[
1864 '--osd-fsid', '1234',
1865 '--from', 'db', 'data',
1866 '--target', 'vgname/db'])
1870 n
= len(self
.mock_process_input
)
1872 for s
in self
.mock_process_input
:
1875 assert self
. mock_process_input
[n
-1] == [
1876 'ceph-bluestore-tool',
1877 '--path', '/var/lib/ceph/osd/ceph-2',
1878 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
1879 '--command', 'bluefs-bdev-migrate',
1880 '--devs-source', '/var/lib/ceph/osd/ceph-2/block']
1882 def test_migrate_data_db_to_db_active_systemd(self
, is_root
, monkeypatch
, capsys
):
1883 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1884 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1885 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1886 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1887 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1888 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1889 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1890 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1892 data_vol
= api
.Volume(lv_name
='volume1',
1895 lv_path
='/dev/VolGroup/lv1',
1896 lv_tags
=source_tags
)
1897 db_vol
= api
.Volume(lv_name
='volume2',
1900 lv_path
='/dev/VolGroup/lv2',
1901 lv_tags
=source_db_tags
)
1903 wal_vol
= api
.Volume(lv_name
='volume3',
1906 lv_path
='/dev/VolGroup/lv3',
1907 lv_tags
=source_wal_tags
)
1909 self
.mock_single_volumes
= {
1910 '/dev/VolGroup/lv1': data_vol
,
1911 '/dev/VolGroup/lv2': db_vol
,
1912 '/dev/VolGroup/lv3': wal_vol
,
1914 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1915 self
.mock_get_single_lv
)
1917 self
.mock_volume
= db_vol
1918 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1919 self
.mock_get_lv_by_fullname
)
1921 self
.mock_process_input
= []
1922 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1925 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1926 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1927 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1929 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1930 lambda osd_id
, osd_fsid
: devices
)
1932 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1935 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1936 lambda osd_id
, osd_fsid
: 'ceph')
1937 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1938 m
= migrate
.Migrate(argv
=[
1940 '--osd-fsid', '1234',
1941 '--from', 'db', 'data',
1942 '--target', 'vgname/db'])
1944 with pytest
.raises(SystemExit) as error
:
1947 stdout
, stderr
= capsys
.readouterr()
1949 assert 'Unable to migrate devices associated with OSD ID: 2' == str(error
.value
)
1950 assert '--> OSD is running, stop it with: systemctl stop ceph-osd@2' == stderr
.rstrip()
1953 def test_migrate_data_db_to_db_no_systemd(self
, is_root
, monkeypatch
):
1954 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1955 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1956 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1957 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1958 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1959 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1960 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1961 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1963 data_vol
= api
.Volume(lv_name
='volume1',
1966 lv_path
='/dev/VolGroup/lv1',
1967 lv_tags
=source_tags
)
1968 db_vol
= api
.Volume(lv_name
='volume2',
1971 lv_path
='/dev/VolGroup/lv2',
1972 lv_tags
=source_db_tags
)
1974 wal_vol
= api
.Volume(lv_name
='volume3',
1977 lv_path
='/dev/VolGroup/lv3',
1978 lv_tags
=source_wal_tags
)
1980 self
.mock_single_volumes
= {
1981 '/dev/VolGroup/lv1': data_vol
,
1982 '/dev/VolGroup/lv2': db_vol
,
1983 '/dev/VolGroup/lv3': wal_vol
,
1985 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
1986 self
.mock_get_single_lv
)
1988 self
.mock_volume
= db_vol
1989 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1990 self
.mock_get_lv_by_fullname
)
1992 self
.mock_process_input
= []
1993 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1996 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1997 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1998 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
2000 monkeypatch
.setattr(migrate
, 'find_associated_devices',
2001 lambda osd_id
, osd_fsid
: devices
)
2003 monkeypatch
.setattr(migrate
, 'get_cluster_name',
2004 lambda osd_id
, osd_fsid
: 'ceph')
2005 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
2006 m
= migrate
.Migrate(argv
=[
2008 '--osd-fsid', '1234',
2009 '--from', 'db', 'data',
2010 '--target', 'vgname/db',
2015 n
= len(self
.mock_process_input
)
2017 for s
in self
.mock_process_input
:
2020 assert self
. mock_process_input
[n
-1] == [
2021 'ceph-bluestore-tool',
2022 '--path', '/var/lib/ceph/osd/ceph-2',
2023 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
2024 '--command', 'bluefs-bdev-migrate',
2025 '--devs-source', '/var/lib/ceph/osd/ceph-2/block']
2028 def test_migrate_data_wal_to_db(self
,
2032 m_getuid
.return_value
= 0
2034 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
2035 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2036 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2037 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
2038 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2039 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2040 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
2041 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2042 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2044 data_vol
= api
.Volume(lv_name
='volume1',
2047 lv_path
='/dev/VolGroup/lv1',
2048 lv_tags
=source_tags
)
2049 db_vol
= api
.Volume(lv_name
='volume2',
2052 lv_path
='/dev/VolGroup/lv2',
2053 lv_tags
=source_db_tags
)
2055 wal_vol
= api
.Volume(lv_name
='volume3',
2058 lv_path
='/dev/VolGroup/lv3',
2059 lv_tags
=source_wal_tags
)
2061 self
.mock_single_volumes
= {
2062 '/dev/VolGroup/lv1': data_vol
,
2063 '/dev/VolGroup/lv2': db_vol
,
2064 '/dev/VolGroup/lv3': wal_vol
,
2066 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
2067 self
.mock_get_single_lv
)
2069 self
.mock_volume
= db_vol
2070 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
2071 self
.mock_get_lv_by_fullname
)
2073 self
.mock_process_input
= []
2074 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
2077 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
2078 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
2079 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
2081 monkeypatch
.setattr(migrate
, 'find_associated_devices',
2082 lambda osd_id
, osd_fsid
: devices
)
2084 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
2087 monkeypatch
.setattr(migrate
, 'get_cluster_name',
2088 lambda osd_id
, osd_fsid
: 'ceph')
2089 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
2090 m
= migrate
.Migrate(argv
=[
2092 '--osd-fsid', '1234',
2093 '--from', 'db', 'data', 'wal',
2094 '--target', 'vgname/db'])
2098 n
= len(self
.mock_process_input
)
2100 for s
in self
.mock_process_input
:
2103 assert self
. mock_process_input
[n
-4] == [
2105 '--deltag', 'ceph.osd_id=2',
2106 '--deltag', 'ceph.type=wal',
2107 '--deltag', 'ceph.osd_fsid=1234',
2108 '--deltag', 'ceph.cluster_name=ceph',
2109 '--deltag', 'ceph.db_uuid=dbuuid',
2110 '--deltag', 'ceph.db_device=db_dev',
2111 '--deltag', 'ceph.wal_uuid=waluuid',
2112 '--deltag', 'ceph.wal_device=wal_dev',
2113 '/dev/VolGroup/lv3']
2114 assert self
. mock_process_input
[n
-3] == [
2116 '--deltag', 'ceph.wal_uuid=waluuid',
2117 '--deltag', 'ceph.wal_device=wal_dev',
2118 '/dev/VolGroup/lv1']
2119 assert self
. mock_process_input
[n
-2] == [
2121 '--deltag', 'ceph.wal_uuid=waluuid',
2122 '--deltag', 'ceph.wal_device=wal_dev',
2123 '/dev/VolGroup/lv2']
2124 assert self
. mock_process_input
[n
-1] == [
2125 'ceph-bluestore-tool',
2126 '--path', '/var/lib/ceph/osd/ceph-2',
2127 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
2128 '--command', 'bluefs-bdev-migrate',
2129 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
2130 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.wal']
2132 def test_migrate_data_wal_to_db_active_systemd(self
, is_root
, monkeypatch
, capsys
):
2133 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
2134 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2135 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2136 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
2137 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2138 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2139 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
2140 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2141 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2143 data_vol
= api
.Volume(lv_name
='volume1',
2146 lv_path
='/dev/VolGroup/lv1',
2147 lv_tags
=source_tags
)
2148 db_vol
= api
.Volume(lv_name
='volume2',
2151 lv_path
='/dev/VolGroup/lv2',
2152 lv_tags
=source_db_tags
)
2154 wal_vol
= api
.Volume(lv_name
='volume3',
2157 lv_path
='/dev/VolGroup/lv3',
2158 lv_tags
=source_wal_tags
)
2160 self
.mock_single_volumes
= {
2161 '/dev/VolGroup/lv1': data_vol
,
2162 '/dev/VolGroup/lv2': db_vol
,
2163 '/dev/VolGroup/lv3': wal_vol
,
2165 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
2166 self
.mock_get_single_lv
)
2168 self
.mock_volume
= db_vol
2169 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
2170 self
.mock_get_lv_by_fullname
)
2172 self
.mock_process_input
= []
2173 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
2176 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
2177 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
2178 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
2180 monkeypatch
.setattr(migrate
, 'find_associated_devices',
2181 lambda osd_id
, osd_fsid
: devices
)
2183 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
2186 monkeypatch
.setattr(migrate
, 'get_cluster_name',
2187 lambda osd_id
, osd_fsid
: 'ceph')
2188 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
2189 m
= migrate
.Migrate(argv
=[
2191 '--osd-fsid', '1234',
2192 '--from', 'db', 'data', 'wal',
2193 '--target', 'vgname/db'])
2195 with pytest
.raises(SystemExit) as error
:
2198 stdout
, stderr
= capsys
.readouterr()
2200 assert 'Unable to migrate devices associated with OSD ID: 2' == str(error
.value
)
2201 assert '--> OSD is running, stop it with: systemctl stop ceph-osd@2' == stderr
.rstrip()
2204 def test_migrate_data_wal_to_db_no_systemd(self
, is_root
, monkeypatch
):
2205 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
2206 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2207 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2208 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
2209 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2210 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2211 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
2212 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
2213 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
2215 data_vol
= api
.Volume(lv_name
='volume1',
2218 lv_path
='/dev/VolGroup/lv1',
2219 lv_tags
=source_tags
)
2220 db_vol
= api
.Volume(lv_name
='volume2',
2223 lv_path
='/dev/VolGroup/lv2',
2224 lv_tags
=source_db_tags
)
2226 wal_vol
= api
.Volume(lv_name
='volume3',
2229 lv_path
='/dev/VolGroup/lv3',
2230 lv_tags
=source_wal_tags
)
2232 self
.mock_single_volumes
= {
2233 '/dev/VolGroup/lv1': data_vol
,
2234 '/dev/VolGroup/lv2': db_vol
,
2235 '/dev/VolGroup/lv3': wal_vol
,
2237 monkeypatch
.setattr(migrate
.api
, 'get_single_lv',
2238 self
.mock_get_single_lv
)
2240 self
.mock_volume
= db_vol
2241 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
2242 self
.mock_get_lv_by_fullname
)
2244 self
.mock_process_input
= []
2245 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
2248 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
2249 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
2250 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
2252 monkeypatch
.setattr(migrate
, 'find_associated_devices',
2253 lambda osd_id
, osd_fsid
: devices
)
2255 monkeypatch
.setattr(migrate
, 'get_cluster_name',
2256 lambda osd_id
, osd_fsid
: 'ceph')
2257 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
2258 m
= migrate
.Migrate(argv
=[
2260 '--osd-fsid', '1234',
2261 '--from', 'db', 'data', 'wal',
2262 '--target', 'vgname/db',
2267 n
= len(self
.mock_process_input
)
2269 for s
in self
.mock_process_input
:
2272 assert self
. mock_process_input
[n
-4] == [
2274 '--deltag', 'ceph.osd_id=2',
2275 '--deltag', 'ceph.type=wal',
2276 '--deltag', 'ceph.osd_fsid=1234',
2277 '--deltag', 'ceph.cluster_name=ceph',
2278 '--deltag', 'ceph.db_uuid=dbuuid',
2279 '--deltag', 'ceph.db_device=db_dev',
2280 '--deltag', 'ceph.wal_uuid=waluuid',
2281 '--deltag', 'ceph.wal_device=wal_dev',
2282 '/dev/VolGroup/lv3']
2283 assert self
. mock_process_input
[n
-3] == [
2285 '--deltag', 'ceph.wal_uuid=waluuid',
2286 '--deltag', 'ceph.wal_device=wal_dev',
2287 '/dev/VolGroup/lv1']
2288 assert self
. mock_process_input
[n
-2] == [
2290 '--deltag', 'ceph.wal_uuid=waluuid',
2291 '--deltag', 'ceph.wal_device=wal_dev',
2292 '/dev/VolGroup/lv2']
2293 assert self
. mock_process_input
[n
-1] == [
2294 'ceph-bluestore-tool',
2295 '--path', '/var/lib/ceph/osd/ceph-2',
2296 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
2297 '--command', 'bluefs-bdev-migrate',
2298 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
2299 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.wal']