#!/usr/bin/env python3
# group: rw auto migration quick
#
# Copyright (C) 2017 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Creator/Owner: Stefan Hajnoczi <stefanha@redhat.com>
#
# Check that QMP 'migrate' with multiple drives on a single IOThread completes
# successfully.  This particular command triggered a hang in the source QEMU
# process due to recursive AioContext locking in bdrv_invalidate_all() and
# BDRV_POLL_WHILE().

import iotests

iotests.script_initialize(supported_fmts=['qcow2'],
                          supported_platforms=['linux'])

with iotests.FilePath('disk0.img') as disk0_img_path, \
     iotests.FilePath('disk1.img') as disk1_img_path, \
     iotests.VM() as vm:

    img_size = '10M'
    iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, disk0_img_path, img_size)
    iotests.qemu_img_pipe('create', '-f', iotests.imgfmt, disk1_img_path, img_size)

    iotests.log('Launching VM...')
    (vm.add_object('iothread,id=iothread0')
       .add_drive(disk0_img_path, 'node-name=drive0-node', interface='none')
       .add_drive(disk1_img_path, 'node-name=drive1-node', interface='none')
       .launch())

    iotests.log('Setting IOThreads...')
    iotests.log(vm.qmp('x-blockdev-set-iothread',
                       node_name='drive0-node', iothread='iothread0',
                       force=True))
    iotests.log(vm.qmp('x-blockdev-set-iothread',
                       node_name='drive1-node', iothread='iothread0',
                       force=True))

    iotests.log('Enabling migration QMP events...')
    iotests.log(vm.qmp('migrate-set-capabilities', capabilities=[
        {
            'capability': 'events',
            'state': True
        }
    ]))

    iotests.log('Starting migration...')
    iotests.log(vm.qmp('migrate', uri='exec:cat >/dev/null'))
    while True:
        event = vm.event_wait('MIGRATION')
        iotests.log(event, filters=[iotests.filter_qmp_event])
        if event['data']['status'] == 'completed':
            break
