#!/usr/bin/env python3
# group: rw quick
#
# Test commit job graph modifications while requests are active
#
# Copyright (C) 2019 Red Hat, Inc.
#
# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
#
# 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/>.
#

import iotests
from iotests import imgfmt

iotests.script_initialize(supported_fmts=['qcow2'])

iotests.log('Finishing a commit job with background reads')
iotests.log('============================================')
iotests.log('')

with iotests.FilePath('t.qcow2') as disk_path, \
     iotests.FilePath('t.qcow2.mid') as mid_path, \
     iotests.FilePath('t.qcow2.base') as base_path, \
     iotests.VM() as vm:

    iotests.log("=== Create backing chain and start VM ===")
    iotests.log("")

    size = 128 * 1024 * 1024
    size_str = str(size)

    iotests.create_image(base_path, size)
    iotests.qemu_img_log('create', '-f', iotests.imgfmt, mid_path, size_str)
    iotests.qemu_img_log('create', '-f', iotests.imgfmt, disk_path, size_str)

    # Create a backing chain like this:
    # base <- [throttled: bps-read=4096] <- mid <- overlay

    vm.add_object('throttle-group,x-bps-read=4096,id=throttle0')
    vm.add_blockdev('file,filename=%s,node-name=base' % (base_path))
    vm.add_blockdev('throttle,throttle-group=throttle0,file=base,node-name=throttled')
    vm.add_blockdev('file,filename=%s,node-name=mid-file' % (mid_path))
    vm.add_blockdev('qcow2,file=mid-file,node-name=mid,backing=throttled')
    vm.add_drive_raw('if=none,id=overlay,driver=qcow2,file=%s,backing=mid' % (disk_path))

    vm.launch()

    iotests.log("=== Start background read requests ===")
    iotests.log("")

    def start_requests():
        vm.hmp_qemu_io('overlay', 'aio_read 0 4k')
        vm.hmp_qemu_io('overlay', 'aio_read 0 4k')

    start_requests()

    iotests.log("=== Run a commit job ===")
    iotests.log("")

    result = vm.qmp_log('block-commit', job_id='job0', auto_finalize=False,
                        device='overlay', top_node='mid')

    vm.run_job('job0', auto_finalize=False, pre_finalize=start_requests,
                auto_dismiss=True)

    vm.shutdown()

iotests.log('')
iotests.log('Closing the VM while a job is being cancelled')
iotests.log('=============================================')
iotests.log('')

with iotests.FilePath('src.qcow2') as src_path, \
     iotests.FilePath('dst.qcow2') as dst_path, \
     iotests.VM() as vm:

    iotests.log('=== Create images and start VM ===')
    iotests.log('')

    size = 128 * 1024 * 1024
    size_str = str(size)

    iotests.qemu_img_log('create', '-f', iotests.imgfmt, src_path, size_str)
    iotests.qemu_img_log('create', '-f', iotests.imgfmt, dst_path, size_str)

    iotests.log(iotests.qemu_io('-f', iotests.imgfmt, '-c', 'write 0 1M',
                                src_path),
                filters=[iotests.filter_test_dir, iotests.filter_qemu_io])

    vm.add_object('throttle-group,x-bps-read=4096,id=throttle0')

    vm.add_blockdev('file,node-name=src-file,filename=%s' % (src_path))
    vm.add_blockdev('%s,node-name=src,file=src-file' % (iotests.imgfmt))

    vm.add_blockdev('file,node-name=dst-file,filename=%s' % (dst_path))
    vm.add_blockdev('%s,node-name=dst,file=dst-file' % (iotests.imgfmt))

    vm.add_blockdev('throttle,node-name=src-throttled,' +
                    'throttle-group=throttle0,file=src')

    vm.add_device('virtio-blk,drive=src-throttled')

    vm.launch()

    iotests.log('=== Start a mirror job ===')
    iotests.log('')

    vm.qmp_log('blockdev-mirror', job_id='job0', device='src-throttled',
                                  target='dst', sync='full')

    vm.qmp_log('block-job-cancel', device='job0')
    vm.qmp_log('quit')

    vm.shutdown(has_quit=True)
