]>
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_first_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_first_lv', self
.mock_get_first_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].abspath
== '/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_first_lv', self
.mock_get_first_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].abspath
== '/dev/VolGroup/lv1'
100 assert d
[0].lvs
== [vol
]
102 assert d
[0].abspath
== '/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_first_lv', self
.mock_get_first_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].abspath
== '/dev/VolGroup/lv1'
137 assert d
[0].lvs
== [vol
]
139 assert d
[0].abspath
== '/dev/VolGroup/lv2'
140 assert d
[0].lvs
== [vol2
]
142 assert d
[0].abspath
== '/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_first_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_first_lv', self
.mock_get_first_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_first_lv', self
.mock_get_first_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_first_lv', self
.mock_get_first_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_first_lv', self
.mock_get_first_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_first_lv', self
.mock_get_first_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_first_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_first_lv',
594 self
.mock_get_first_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']
664 def test_newwal(self
, m_getuid
, monkeypatch
, capsys
):
665 m_getuid
.return_value
= 0
668 'ceph.osd_id=0,ceph.type=data,ceph.osd_fsid=1234'
670 data_vol
= api
.Volume(lv_name
='volume1', lv_uuid
='datauuid', vg_name
='vg',
671 lv_path
='/dev/VolGroup/lv1', lv_tags
=source_tags
)
673 self
.mock_single_volumes
= {'/dev/VolGroup/lv1': data_vol
}
675 monkeypatch
.setattr(migrate
.api
, 'get_first_lv', self
.mock_get_first_lv
)
677 self
.mock_process_input
= []
678 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
680 self
.mock_volume
= api
.Volume(lv_name
='target_volume1', lv_uuid
='y', vg_name
='vg',
681 lv_path
='/dev/VolGroup/target_volume',
683 monkeypatch
.setattr(api
, 'get_lv_by_fullname', self
.mock_get_lv_by_fullname
)
685 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active", lambda id: False)
687 #find_associated_devices will call get_lvs() 4 times
688 # and it this needs results to be arranged that way
689 self
.mock_volumes
= []
690 self
.mock_volumes
.append([data_vol
])
691 self
.mock_volumes
.append([data_vol
])
692 self
.mock_volumes
.append([])
693 self
.mock_volumes
.append([])
695 monkeypatch
.setattr(migrate
.api
, 'get_lvs', self
.mock_get_lvs
)
697 monkeypatch
.setattr(migrate
, 'get_cluster_name', lambda osd_id
, osd_fsid
: 'cluster')
698 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
700 migrate
.NewWAL(argv
=[
702 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
703 '--target', 'vgname/new_wal']).main()
705 n
= len(self
.mock_process_input
)
708 assert self
.mock_process_input
[n
- 3] == [
710 '--addtag', 'ceph.wal_uuid=y',
711 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
714 assert self
.mock_process_input
[n
- 2].sort() == [
716 '--addtag', 'ceph.osd_id=0',
717 '--addtag', 'ceph.type=wal',
718 '--addtag', 'ceph.osd_fsid=1234',
719 '--addtag', 'ceph.wal_uuid=y',
720 '--addtag', 'ceph.wal_device=/dev/VolGroup/target_volume',
721 '/dev/VolGroup/target_volume'].sort()
723 assert self
.mock_process_input
[n
- 1] == [
724 'ceph-bluestore-tool',
725 '--path', '/var/lib/ceph/osd/cluster-2',
726 '--dev-target', '/dev/VolGroup/target_volume',
727 '--command', 'bluefs-bdev-new-wal']
729 class TestMigrate(object):
732 def mock_get_lv_by_fullname(self
, *args
, **kwargs
):
733 return self
.mock_volume
735 mock_process_input
= []
736 def mock_process(self
, *args
, **kwargs
):
737 self
.mock_process_input
.append(args
[0]);
740 mock_single_volumes
= {}
741 def mock_get_first_lv(self
, *args
, **kwargs
):
742 p
= kwargs
['filters']['lv_path']
743 return self
.mock_single_volumes
[p
]
746 def mock_get_lvs(self
, *args
, **kwargs
):
747 return self
.mock_volumes
.pop(0)
749 def test_get_source_devices(self
, monkeypatch
):
751 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234'
752 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234'
753 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234'
755 data_vol
= api
.Volume(lv_name
='volume1',
758 lv_path
='/dev/VolGroup/lv1',
760 db_vol
= api
.Volume(lv_name
='volume2',
763 lv_path
='/dev/VolGroup/lv2',
764 lv_tags
=source_db_tags
)
766 wal_vol
= api
.Volume(lv_name
='volume3',
769 lv_path
='/dev/VolGroup/lv3',
770 lv_tags
=source_wal_tags
)
772 self
.mock_single_volumes
= {
773 '/dev/VolGroup/lv1': data_vol
,
774 '/dev/VolGroup/lv2': db_vol
,
775 '/dev/VolGroup/lv3': wal_vol
,
777 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
778 self
.mock_get_first_lv
)
780 self
.mock_volume
= api
.Volume(lv_name
='volume2', lv_uuid
='y',
782 lv_path
='/dev/VolGroup/lv2',
783 lv_tags
='ceph.osd_id=5,ceph.osd_type=db')
784 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
785 self
.mock_get_lv_by_fullname
)
787 self
.mock_process_input
= []
788 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
791 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
792 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
793 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
795 monkeypatch
.setattr(migrate
, 'find_associated_devices',
796 lambda osd_id
, osd_fsid
: devices
)
799 m
= migrate
.Migrate(argv
=[
801 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
802 '--from', 'data', 'wal',
803 '--target', 'vgname/new_wal'])
805 res_devices
= m
.get_source_devices(devices
)
807 assert 2 == len(res_devices
)
808 assert devices
[0] == res_devices
[0]
809 assert devices
[2] == res_devices
[1]
811 m
= migrate
.Migrate(argv
=[
813 '--osd-fsid', '55BD4219-16A7-4037-BC20-0F158EFCC83D',
814 '--from', 'db', 'wal', 'data',
815 '--target', 'vgname/new_wal'])
817 res_devices
= m
.get_source_devices(devices
)
819 assert 3 == len(res_devices
)
820 assert devices
[0] == res_devices
[0]
821 assert devices
[1] == res_devices
[1]
822 assert devices
[2] == res_devices
[2]
826 def test_migrate_data_db_to_new_db(self
, m_getuid
, monkeypatch
):
827 m_getuid
.return_value
= 0
829 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
830 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
831 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
832 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
834 data_vol
= api
.Volume(lv_name
='volume1',
837 lv_path
='/dev/VolGroup/lv1',
839 db_vol
= api
.Volume(lv_name
='volume2',
842 lv_path
='/dev/VolGroup/lv2',
843 lv_tags
=source_db_tags
)
845 self
.mock_single_volumes
= {
846 '/dev/VolGroup/lv1': data_vol
,
847 '/dev/VolGroup/lv2': db_vol
,
849 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
850 self
.mock_get_first_lv
)
852 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
854 lv_path
='/dev/VolGroup/lv2_new',
856 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
857 self
.mock_get_lv_by_fullname
)
859 self
.mock_process_input
= []
860 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
863 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
864 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
866 monkeypatch
.setattr(migrate
, 'find_associated_devices',
867 lambda osd_id
, osd_fsid
: devices
)
870 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
873 monkeypatch
.setattr(migrate
, 'get_cluster_name',
874 lambda osd_id
, osd_fsid
: 'ceph')
875 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
876 m
= migrate
.Migrate(argv
=[
878 '--osd-fsid', '1234',
879 '--from', 'data', 'db', 'wal',
880 '--target', 'vgname/new_wal'])
883 n
= len(self
.mock_process_input
)
886 assert self
. mock_process_input
[n
-5] == [
888 '--deltag', 'ceph.osd_id=2',
889 '--deltag', 'ceph.type=db',
890 '--deltag', 'ceph.osd_fsid=1234',
891 '--deltag', 'ceph.cluster_name=ceph',
892 '--deltag', 'ceph.db_uuid=dbuuid',
893 '--deltag', 'ceph.db_device=db_dev',
896 assert self
. mock_process_input
[n
-4] == [
898 '--deltag', 'ceph.db_uuid=dbuuid',
899 '--deltag', 'ceph.db_device=db_dev',
902 assert self
. mock_process_input
[n
-3] == [
904 '--addtag', 'ceph.db_uuid=new-db-uuid',
905 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
908 assert self
. mock_process_input
[n
-2] == [
910 '--addtag', 'ceph.osd_id=2',
911 '--addtag', 'ceph.type=db',
912 '--addtag', 'ceph.osd_fsid=1234',
913 '--addtag', 'ceph.cluster_name=ceph',
914 '--addtag', 'ceph.db_uuid=new-db-uuid',
915 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
916 '/dev/VolGroup/lv2_new']
918 assert self
. mock_process_input
[n
-1] == [
919 'ceph-bluestore-tool',
920 '--path', '/var/lib/ceph/osd/ceph-2',
921 '--dev-target', '/dev/VolGroup/lv2_new',
922 '--command', 'bluefs-bdev-migrate',
923 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
924 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db']
927 def test_migrate_data_db_to_new_db_skip_wal(self
, m_getuid
, monkeypatch
):
928 m_getuid
.return_value
= 0
930 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
931 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
932 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
933 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
934 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234' \
935 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
937 data_vol
= api
.Volume(lv_name
='volume1',
940 lv_path
='/dev/VolGroup/lv1',
942 db_vol
= api
.Volume(lv_name
='volume2',
945 lv_path
='/dev/VolGroup/lv2',
946 lv_tags
=source_db_tags
)
948 wal_vol
= api
.Volume(lv_name
='volume3',
951 lv_path
='/dev/VolGroup/lv3',
952 lv_tags
=source_wal_tags
)
954 self
.mock_single_volumes
= {
955 '/dev/VolGroup/lv1': data_vol
,
956 '/dev/VolGroup/lv2': db_vol
,
957 '/dev/VolGroup/lv3': wal_vol
,
959 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
960 self
.mock_get_first_lv
)
962 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
964 lv_path
='/dev/VolGroup/lv2_new',
966 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
967 self
.mock_get_lv_by_fullname
)
969 self
.mock_process_input
= []
970 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
973 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
974 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
975 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
977 monkeypatch
.setattr(migrate
, 'find_associated_devices',
978 lambda osd_id
, osd_fsid
: devices
)
980 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
983 monkeypatch
.setattr(migrate
, 'get_cluster_name',
984 lambda osd_id
, osd_fsid
: 'ceph')
985 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
986 m
= migrate
.Migrate(argv
=[
988 '--osd-fsid', '1234',
989 '--from', 'data', 'db',
990 '--target', 'vgname/new_wal'])
993 n
= len(self
.mock_process_input
)
996 assert self
. mock_process_input
[n
-7] == [
998 '--deltag', 'ceph.osd_id=2',
999 '--deltag', 'ceph.type=db',
1000 '--deltag', 'ceph.osd_fsid=1234',
1001 '--deltag', 'ceph.cluster_name=ceph',
1002 '--deltag', 'ceph.db_uuid=dbuuid',
1003 '--deltag', 'ceph.db_device=db_dev',
1004 '/dev/VolGroup/lv2']
1006 assert self
. mock_process_input
[n
-6] == [
1008 '--deltag', 'ceph.db_uuid=dbuuid',
1009 '--deltag', 'ceph.db_device=db_dev',
1010 '/dev/VolGroup/lv1']
1012 assert self
. mock_process_input
[n
-5] == [
1014 '--addtag', 'ceph.db_uuid=new-db-uuid',
1015 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1016 '/dev/VolGroup/lv1']
1018 assert self
. mock_process_input
[n
-4] == [
1020 '--deltag', 'ceph.db_uuid=dbuuid',
1021 '--deltag', 'ceph.db_device=db_dev',
1022 '/dev/VolGroup/lv3']
1024 assert self
. mock_process_input
[n
-3] == [
1026 '--addtag', 'ceph.db_uuid=new-db-uuid',
1027 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1028 '/dev/VolGroup/lv3']
1030 assert self
. mock_process_input
[n
-2] == [
1032 '--addtag', 'ceph.osd_id=2',
1033 '--addtag', 'ceph.type=db',
1034 '--addtag', 'ceph.osd_fsid=1234',
1035 '--addtag', 'ceph.cluster_name=ceph',
1036 '--addtag', 'ceph.db_uuid=new-db-uuid',
1037 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1038 '/dev/VolGroup/lv2_new']
1040 assert self
. mock_process_input
[n
-1] == [
1041 'ceph-bluestore-tool',
1042 '--path', '/var/lib/ceph/osd/ceph-2',
1043 '--dev-target', '/dev/VolGroup/lv2_new',
1044 '--command', 'bluefs-bdev-migrate',
1045 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1046 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db']
1049 def test_migrate_data_db_wal_to_new_db(self
, m_getuid
, monkeypatch
):
1050 m_getuid
.return_value
= 0
1052 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1053 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1054 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1055 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1056 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1057 source_wal_tags
= 'ceph.osd_id=0,ceph.type=wal,ceph.osd_fsid=1234,' \
1058 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1059 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1061 data_vol
= api
.Volume(lv_name
='volume1',
1064 lv_path
='/dev/VolGroup/lv1',
1065 lv_tags
=source_tags
)
1066 db_vol
= api
.Volume(lv_name
='volume2',
1069 lv_path
='/dev/VolGroup/lv2',
1070 lv_tags
=source_db_tags
)
1072 wal_vol
= api
.Volume(lv_name
='volume3',
1075 lv_path
='/dev/VolGroup/lv3',
1076 lv_tags
=source_wal_tags
)
1078 self
.mock_single_volumes
= {
1079 '/dev/VolGroup/lv1': data_vol
,
1080 '/dev/VolGroup/lv2': db_vol
,
1081 '/dev/VolGroup/lv3': wal_vol
,
1083 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
1084 self
.mock_get_first_lv
)
1086 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1088 lv_path
='/dev/VolGroup/lv2_new',
1090 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1091 self
.mock_get_lv_by_fullname
)
1093 self
.mock_process_input
= []
1094 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1097 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1098 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1099 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1101 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1102 lambda osd_id
, osd_fsid
: devices
)
1104 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1107 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1108 lambda osd_id
, osd_fsid
: 'ceph')
1109 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1110 m
= migrate
.Migrate(argv
=[
1112 '--osd-fsid', '1234',
1113 '--from', 'data', 'db', 'wal',
1114 '--target', 'vgname/new_wal'])
1117 n
= len(self
.mock_process_input
)
1120 assert self
. mock_process_input
[n
-6] == [
1122 '--deltag', 'ceph.osd_id=2',
1123 '--deltag', 'ceph.type=db',
1124 '--deltag', 'ceph.osd_fsid=1234',
1125 '--deltag', 'ceph.cluster_name=ceph',
1126 '--deltag', 'ceph.db_uuid=dbuuid',
1127 '--deltag', 'ceph.db_device=db_dev',
1128 '/dev/VolGroup/lv2']
1130 assert self
. mock_process_input
[n
-5] == [
1132 '--deltag', 'ceph.osd_id=0',
1133 '--deltag', 'ceph.type=wal',
1134 '--deltag', 'ceph.osd_fsid=1234',
1135 '--deltag', 'ceph.cluster_name=ceph',
1136 '--deltag', 'ceph.db_uuid=dbuuid',
1137 '--deltag', 'ceph.db_device=db_dev',
1138 '--deltag', 'ceph.wal_uuid=waluuid',
1139 '--deltag', 'ceph.wal_device=wal_dev',
1140 '/dev/VolGroup/lv3']
1142 assert self
. mock_process_input
[n
-4] == [
1144 '--deltag', 'ceph.db_uuid=dbuuid',
1145 '--deltag', 'ceph.db_device=db_dev',
1146 '--deltag', 'ceph.wal_uuid=waluuid',
1147 '--deltag', 'ceph.wal_device=wal_dev',
1148 '/dev/VolGroup/lv1']
1150 assert self
. mock_process_input
[n
-3] == [
1152 '--addtag', 'ceph.db_uuid=new-db-uuid',
1153 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1154 '/dev/VolGroup/lv1']
1156 assert self
. mock_process_input
[n
-2] == [
1158 '--addtag', 'ceph.osd_id=2',
1159 '--addtag', 'ceph.type=db',
1160 '--addtag', 'ceph.osd_fsid=1234',
1161 '--addtag', 'ceph.cluster_name=ceph',
1162 '--addtag', 'ceph.db_uuid=new-db-uuid',
1163 '--addtag', 'ceph.db_device=/dev/VolGroup/lv2_new',
1164 '/dev/VolGroup/lv2_new']
1166 assert self
. mock_process_input
[n
-1] == [
1167 'ceph-bluestore-tool',
1168 '--path', '/var/lib/ceph/osd/ceph-2',
1169 '--dev-target', '/dev/VolGroup/lv2_new',
1170 '--command', 'bluefs-bdev-migrate',
1171 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1172 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.db',
1173 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.wal']
1176 def test_dont_migrate_data_db_wal_to_new_data(self
,
1180 m_getuid
.return_value
= 0
1182 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1183 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1184 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1185 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1187 data_vol
= api
.Volume(lv_name
='volume1',
1190 lv_path
='/dev/VolGroup/lv1',
1191 lv_tags
=source_tags
)
1192 db_vol
= api
.Volume(lv_name
='volume2',
1195 lv_path
='/dev/VolGroup/lv2',
1196 lv_tags
=source_db_tags
)
1198 self
.mock_single_volumes
= {
1199 '/dev/VolGroup/lv1': data_vol
,
1200 '/dev/VolGroup/lv2': db_vol
,
1202 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
1203 self
.mock_get_first_lv
)
1205 self
.mock_volume
= api
.Volume(lv_name
='volume2_new', lv_uuid
='new-db-uuid',
1207 lv_path
='/dev/VolGroup/lv2_new',
1209 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1210 self
.mock_get_lv_by_fullname
)
1212 self
.mock_process_input
= []
1213 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1216 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1217 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1219 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1220 lambda osd_id
, osd_fsid
: devices
)
1222 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1225 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1226 lambda osd_id
, osd_fsid
: 'ceph')
1227 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1228 m
= migrate
.Migrate(argv
=[
1230 '--osd-fsid', '1234',
1232 '--target', 'vgname/new_data'])
1234 with pytest
.raises(SystemExit) as error
:
1236 stdout
, stderr
= capsys
.readouterr()
1237 expected
= 'Unable to migrate to : vgname/new_data'
1238 assert expected
in str(error
.value
)
1239 expected
= 'Unable to determine new volume type,'
1240 ' please use new-db or new-wal command before.'
1241 assert expected
in stderr
1244 def test_dont_migrate_db_to_wal(self
,
1248 m_getuid
.return_value
= 0
1250 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1251 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1252 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1253 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1254 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1255 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1256 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1257 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1259 data_vol
= api
.Volume(lv_name
='volume1',
1262 lv_path
='/dev/VolGroup/lv1',
1263 lv_tags
=source_tags
)
1264 db_vol
= api
.Volume(lv_name
='volume2',
1267 lv_path
='/dev/VolGroup/lv2',
1268 lv_tags
=source_db_tags
)
1270 wal_vol
= api
.Volume(lv_name
='volume3',
1273 lv_path
='/dev/VolGroup/lv3',
1274 lv_tags
=source_wal_tags
)
1276 self
.mock_single_volumes
= {
1277 '/dev/VolGroup/lv1': data_vol
,
1278 '/dev/VolGroup/lv2': db_vol
,
1279 '/dev/VolGroup/lv3': wal_vol
,
1281 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
1282 self
.mock_get_first_lv
)
1284 self
.mock_volume
= wal_vol
1285 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1286 self
.mock_get_lv_by_fullname
)
1288 self
.mock_process_input
= []
1289 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1292 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1293 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1294 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1296 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1297 lambda osd_id
, osd_fsid
: devices
)
1299 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1302 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1303 lambda osd_id
, osd_fsid
: 'ceph')
1304 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1305 m
= migrate
.Migrate(argv
=[
1307 '--osd-fsid', '1234',
1309 '--target', 'vgname/wal'])
1311 with pytest
.raises(SystemExit) as error
:
1313 stdout
, stderr
= capsys
.readouterr()
1314 expected
= 'Unable to migrate to : vgname/wal'
1315 assert expected
in str(error
.value
)
1316 expected
= 'Migrate to WAL is not supported'
1317 assert expected
in stderr
1320 def test_migrate_data_db_to_db(self
,
1324 m_getuid
.return_value
= 0
1326 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1327 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1328 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1329 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1330 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev'
1331 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1332 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1333 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1335 data_vol
= api
.Volume(lv_name
='volume1',
1338 lv_path
='/dev/VolGroup/lv1',
1339 lv_tags
=source_tags
)
1340 db_vol
= api
.Volume(lv_name
='volume2',
1343 lv_path
='/dev/VolGroup/lv2',
1344 lv_tags
=source_db_tags
)
1346 wal_vol
= api
.Volume(lv_name
='volume3',
1349 lv_path
='/dev/VolGroup/lv3',
1350 lv_tags
=source_wal_tags
)
1352 self
.mock_single_volumes
= {
1353 '/dev/VolGroup/lv1': data_vol
,
1354 '/dev/VolGroup/lv2': db_vol
,
1355 '/dev/VolGroup/lv3': wal_vol
,
1357 monkeypatch
.setattr(migrate
.api
, 'get_first_lv',
1358 self
.mock_get_first_lv
)
1360 self
.mock_volume
= db_vol
1361 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1362 self
.mock_get_lv_by_fullname
)
1364 self
.mock_process_input
= []
1365 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1368 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1369 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1370 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1372 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1373 lambda osd_id
, osd_fsid
: devices
)
1375 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1378 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1379 lambda osd_id
, osd_fsid
: 'ceph')
1380 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1381 m
= migrate
.Migrate(argv
=[
1383 '--osd-fsid', '1234',
1384 '--from', 'db', 'data',
1385 '--target', 'vgname/db'])
1389 n
= len(self
.mock_process_input
)
1391 for s
in self
.mock_process_input
:
1394 assert self
. mock_process_input
[n
-1] == [
1395 'ceph-bluestore-tool',
1396 '--path', '/var/lib/ceph/osd/ceph-2',
1397 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
1398 '--command', 'bluefs-bdev-migrate',
1399 '--devs-source', '/var/lib/ceph/osd/ceph-2/block']
1402 def test_migrate_data_wal_to_db(self
,
1406 m_getuid
.return_value
= 0
1408 source_tags
= 'ceph.osd_id=2,ceph.type=data,ceph.osd_fsid=1234,' \
1409 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1410 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1411 source_db_tags
= 'ceph.osd_id=2,ceph.type=db,ceph.osd_fsid=1234,' \
1412 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1413 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_dev'
1414 source_wal_tags
= 'ceph.osd_id=2,ceph.type=wal,ceph.osd_fsid=1234,' \
1415 'ceph.cluster_name=ceph,ceph.db_uuid=dbuuid,ceph.db_device=db_dev,' \
1416 'ceph.wal_uuid=waluuid,ceph.wal_device=wal_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_first_lv',
1441 self
.mock_get_first_lv
)
1443 self
.mock_volume
= db_vol
1444 monkeypatch
.setattr(api
, 'get_lv_by_fullname',
1445 self
.mock_get_lv_by_fullname
)
1447 self
.mock_process_input
= []
1448 monkeypatch
.setattr(process
, 'call', self
.mock_process
)
1451 devices
.append([Device('/dev/VolGroup/lv1'), 'block'])
1452 devices
.append([Device('/dev/VolGroup/lv2'), 'db'])
1453 devices
.append([Device('/dev/VolGroup/lv3'), 'wal'])
1455 monkeypatch
.setattr(migrate
, 'find_associated_devices',
1456 lambda osd_id
, osd_fsid
: devices
)
1458 monkeypatch
.setattr("ceph_volume.systemd.systemctl.osd_is_active",
1461 monkeypatch
.setattr(migrate
, 'get_cluster_name',
1462 lambda osd_id
, osd_fsid
: 'ceph')
1463 monkeypatch
.setattr(system
, 'chown', lambda path
: 0)
1464 m
= migrate
.Migrate(argv
=[
1466 '--osd-fsid', '1234',
1467 '--from', 'db', 'data', 'wal',
1468 '--target', 'vgname/db'])
1472 n
= len(self
.mock_process_input
)
1474 for s
in self
.mock_process_input
:
1477 assert self
. mock_process_input
[n
-4] == [
1479 '--deltag', 'ceph.osd_id=2',
1480 '--deltag', 'ceph.type=wal',
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 '--deltag', 'ceph.wal_uuid=waluuid',
1486 '--deltag', 'ceph.wal_device=wal_dev',
1487 '/dev/VolGroup/lv3']
1488 assert self
. mock_process_input
[n
-3] == [
1490 '--deltag', 'ceph.wal_uuid=waluuid',
1491 '--deltag', 'ceph.wal_device=wal_dev',
1492 '/dev/VolGroup/lv1']
1493 assert self
. mock_process_input
[n
-2] == [
1495 '--deltag', 'ceph.wal_uuid=waluuid',
1496 '--deltag', 'ceph.wal_device=wal_dev',
1497 '/dev/VolGroup/lv2']
1498 assert self
. mock_process_input
[n
-1] == [
1499 'ceph-bluestore-tool',
1500 '--path', '/var/lib/ceph/osd/ceph-2',
1501 '--dev-target', '/var/lib/ceph/osd/ceph-2/block.db',
1502 '--command', 'bluefs-bdev-migrate',
1503 '--devs-source', '/var/lib/ceph/osd/ceph-2/block',
1504 '--devs-source', '/var/lib/ceph/osd/ceph-2/block.wal']