#!/usr/bin/env python3
#
# 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.verify_image_format(supported_fmts=['qcow2'])
iotests.verify_platform(['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'
                      }
                  ]))
