xref: /openbmc/qemu/tests/qemu-iotests/194 (revision 12314f2d145c656f0a1f9aebcbe5e21be60c5ca5)
1*12314f2dSStefan Hajnoczi#!/usr/bin/env python
2*12314f2dSStefan Hajnoczi#
3*12314f2dSStefan Hajnoczi# Copyright (C) 2017 Red Hat, Inc.
4*12314f2dSStefan Hajnoczi#
5*12314f2dSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify
6*12314f2dSStefan Hajnoczi# it under the terms of the GNU General Public License as published by
7*12314f2dSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or
8*12314f2dSStefan Hajnoczi# (at your option) any later version.
9*12314f2dSStefan Hajnoczi#
10*12314f2dSStefan Hajnoczi# This program is distributed in the hope that it will be useful,
11*12314f2dSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of
12*12314f2dSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*12314f2dSStefan Hajnoczi# GNU General Public License for more details.
14*12314f2dSStefan Hajnoczi#
15*12314f2dSStefan Hajnoczi# You should have received a copy of the GNU General Public License
16*12314f2dSStefan Hajnoczi# along with this program.  If not, see <http://www.gnu.org/licenses/>.
17*12314f2dSStefan Hajnoczi#
18*12314f2dSStefan Hajnoczi# Creator/Owner: Stefan Hajnoczi <stefanha@redhat.com>
19*12314f2dSStefan Hajnoczi#
20*12314f2dSStefan Hajnoczi# Non-shared storage migration test using NBD server and drive-mirror
21*12314f2dSStefan Hajnoczi
22*12314f2dSStefan Hajnocziimport os
23*12314f2dSStefan Hajnocziimport atexit
24*12314f2dSStefan Hajnocziimport iotests
25*12314f2dSStefan Hajnoczi
26*12314f2dSStefan Hajnocziiotests.verify_platform(['linux'])
27*12314f2dSStefan Hajnoczi
28*12314f2dSStefan Hajnocziimg_size = '1G'
29*12314f2dSStefan Hajnoczisource_img_path = os.path.join(iotests.test_dir, 'source.img')
30*12314f2dSStefan Hajnoczidest_img_path = os.path.join(iotests.test_dir, 'dest.img')
31*12314f2dSStefan Hajnocziiotests.qemu_img_pipe('create', '-f', iotests.imgfmt, source_img_path, img_size)
32*12314f2dSStefan Hajnocziiotests.qemu_img_pipe('create', '-f', iotests.imgfmt, dest_img_path, img_size)
33*12314f2dSStefan Hajnoczi
34*12314f2dSStefan Hajnocziiotests.log('Launching VMs...')
35*12314f2dSStefan Hajnoczimigration_sock_path = os.path.join(iotests.test_dir, 'migration.sock')
36*12314f2dSStefan Hajnoczinbd_sock_path = os.path.join(iotests.test_dir, 'nbd.sock')
37*12314f2dSStefan Hajnoczisource_vm = iotests.VM('source').add_drive(source_img_path)
38*12314f2dSStefan Hajnoczidest_vm = (iotests.VM('dest').add_drive(dest_img_path)
39*12314f2dSStefan Hajnoczi                             .add_incoming('unix:{0}'.format(migration_sock_path)))
40*12314f2dSStefan Hajnoczisource_vm.launch()
41*12314f2dSStefan Hajnocziatexit.register(source_vm.shutdown)
42*12314f2dSStefan Hajnoczidest_vm.launch()
43*12314f2dSStefan Hajnocziatexit.register(dest_vm.shutdown)
44*12314f2dSStefan Hajnoczi
45*12314f2dSStefan Hajnocziiotests.log('Launching NBD server on destination...')
46*12314f2dSStefan Hajnocziiotests.log(dest_vm.qmp('nbd-server-start', addr={'type': 'unix', 'data': {'path': nbd_sock_path}}))
47*12314f2dSStefan Hajnocziiotests.log(dest_vm.qmp('nbd-server-add', device='drive0', writable=True))
48*12314f2dSStefan Hajnoczi
49*12314f2dSStefan Hajnocziiotests.log('Starting drive-mirror on source...')
50*12314f2dSStefan Hajnocziiotests.log(source_vm.qmp(
51*12314f2dSStefan Hajnoczi              'drive-mirror',
52*12314f2dSStefan Hajnoczi              device='drive0',
53*12314f2dSStefan Hajnoczi              target='nbd+unix:///drive0?socket={0}'.format(nbd_sock_path),
54*12314f2dSStefan Hajnoczi              sync='full',
55*12314f2dSStefan Hajnoczi              format='raw', # always raw, the server handles the format
56*12314f2dSStefan Hajnoczi              mode='existing'))
57*12314f2dSStefan Hajnoczi
58*12314f2dSStefan Hajnocziiotests.log('Waiting for drive-mirror to complete...')
59*12314f2dSStefan Hajnocziiotests.log(source_vm.event_wait('BLOCK_JOB_READY'),
60*12314f2dSStefan Hajnoczi            filters=[iotests.filter_qmp_event])
61*12314f2dSStefan Hajnoczi
62*12314f2dSStefan Hajnocziiotests.log('Starting migration...')
63*12314f2dSStefan Hajnoczisource_vm.qmp('migrate-set-capabilities',
64*12314f2dSStefan Hajnoczi              capabilities=[{'capability': 'events', 'state': True}])
65*12314f2dSStefan Hajnoczidest_vm.qmp('migrate-set-capabilities',
66*12314f2dSStefan Hajnoczi            capabilities=[{'capability': 'events', 'state': True}])
67*12314f2dSStefan Hajnocziiotests.log(source_vm.qmp('migrate', uri='unix:{0}'.format(migration_sock_path)))
68*12314f2dSStefan Hajnoczi
69*12314f2dSStefan Hajnocziwhile True:
70*12314f2dSStefan Hajnoczi    event = source_vm.event_wait('MIGRATION')
71*12314f2dSStefan Hajnoczi    iotests.log(event, filters=[iotests.filter_qmp_event])
72*12314f2dSStefan Hajnoczi    if event['data']['status'] in ('completed', 'failed'):
73*12314f2dSStefan Hajnoczi        break
74