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