#!/usr/bin/env python3
# group: rw 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 'transaction' blockdev-snapshot-sync with multiple drives on a
# single IOThread completes successfully.  This particular command triggered a
# hang due to recursive AioContext locking and BDRV_POLL_WHILE().  Protect
# against regressions.

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.FilePath('disk0-snap.img') as disk0_snap_img_path, \
     iotests.FilePath('disk1-snap.img') as disk1_snap_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.launch()

    iotests.log('Adding IOThread...')
    iotests.log(vm.qmp('object-add',
                       qom_type='iothread',
                       id='iothread0'))

    iotests.log('Adding blockdevs...')
    iotests.log(vm.qmp('blockdev-add',
                       driver=iotests.imgfmt,
                       node_name='disk0',
                       file={
                           'driver': 'file',
                           'filename': disk0_img_path,
                       }))
    iotests.log(vm.qmp('blockdev-add',
                       driver=iotests.imgfmt,
                       node_name='disk1',
                       file={
                           'driver': 'file',
                           'filename': disk1_img_path,
                       }))

    iotests.log('Setting iothread...')
    iotests.log(vm.qmp('x-blockdev-set-iothread',
                       node_name='disk0',
                       iothread='iothread0'))
    iotests.log(vm.qmp('x-blockdev-set-iothread',
                       node_name='disk1',
                       iothread='iothread0'))

    iotests.log('Creating external snapshots...')
    iotests.log(vm.qmp(
                  'transaction',
                  actions=[
                      {
                          'data': {
                              'node-name': 'disk0',
                              'snapshot-file': disk0_snap_img_path,
                              'snapshot-node-name': 'disk0-snap',
                              'mode': 'absolute-paths',
                              'format': iotests.imgfmt,
                          },
                          'type': 'blockdev-snapshot-sync'
                      }, {
                          'data': {
                              'node-name': 'disk1',
                              'snapshot-file': disk1_snap_img_path,
                              'snapshot-node-name': 'disk1-snap',
                              'mode': 'absolute-paths',
                              'format': iotests.imgfmt
                          },
                          'type': 'blockdev-snapshot-sync'
                      }
                  ]))
