#!/usr/bin/env python3
#
# 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')
