#!/usr/bin/env python3
# group: rw migration quick
#
# Copyright (C) 2019 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: Kevin Wolf <kwolf@redhat.com>
#
# Test migration to file for taking an external snapshot with VM state.

import iotests
import os

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

with iotests.FilePath('base') as base_path , \
     iotests.FilePath('top') as top_path, \
     iotests.VM() as vm:

    iotests.qemu_img_log('create', '-f', iotests.imgfmt, base_path, '64M')

    iotests.log('=== Launch VM ===')
    vm.add_object('iothread,id=iothread0')
    vm.add_blockdev('file,filename=%s,node-name=base-file' % (base_path))
    vm.add_blockdev('%s,file=base-file,node-name=base-fmt' % (iotests.imgfmt))
    vm.add_device('virtio-blk,drive=base-fmt,iothread=iothread0,id=vda')
    vm.launch()

    vm.enable_migration_events('VM')

    iotests.log('\n=== Migrate to file ===')
    vm.qmp_log('migrate', uri='exec:cat > /dev/null')

    with iotests.Timeout(3, 'Migration does not complete'):
        vm.wait_migration('postmigrate')

    iotests.log('\nVM is now stopped:')
    iotests.log(vm.qmp('query-migrate')['return']['status'])
    vm.qmp_log('query-status')

    iotests.log('\n=== Create a snapshot of the disk image ===')
    vm.blockdev_create({
        'driver': 'file',
        'filename': top_path,
        'size': 0,
    })
    vm.qmp_log('blockdev-add', node_name='top-file',
               driver='file', filename=top_path,
               filters=[iotests.filter_qmp_testfiles])

    vm.blockdev_create({
        'driver': iotests.imgfmt,
        'file': 'top-file',
        'size': 1024 * 1024,
    })
    vm.qmp_log('blockdev-add', node_name='top-fmt',
               driver=iotests.imgfmt, file='top-file')

    vm.qmp_log('blockdev-snapshot', node='base-fmt', overlay='top-fmt')

    iotests.log('\n=== Resume the VM and simulate a write request ===')
    vm.qmp_log('cont')
    iotests.log(vm.hmp_qemu_io('-d vda/virtio-backend', 'write 4k 4k'))

    iotests.log('\n=== Commit it to the backing file ===')
    result = vm.qmp_log('block-commit', job_id='job0', auto_dismiss=False,
                        device='top-fmt', top_node='top-fmt',
                        filters=[iotests.filter_qmp_testfiles])
    if 'return' in result:
        vm.run_job('job0')
