#!/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_create('-f', iotests.imgfmt, disk0_img_path, img_size)
    iotests.qemu_img_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
