#!/usr/bin/env bash
# group: rw migration quick
#
# Test savevm and loadvm after live migration with postcopy flag
#
# Copyright (C) 2017, IBM Corporation.
#
# This file is derived from tests/qemu-iotests/181 by Kevin Wolf
#
# 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/>.

seq=`basename $0`
echo "QA output created by $seq"

status=1	# failure is the default!

MIG_SOCKET="${SOCK_DIR}/migrate"

# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.qemu

_cleanup()
{
    rm -f "${MIG_SOCKET}"
    _cleanup_test_img
    _cleanup_qemu
}
trap "_cleanup; exit \$status" 0 1 2 3 15

_supported_fmt qcow2
_supported_proto generic
_supported_os Linux

# Internal snapshots are (currently) impossible with refcount_bits=1,
# and generally impossible with external data files
_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file

size=64M
_make_test_img $size

echo
echo === Starting VMs ===
echo

qemu_comm_method="monitor"

if [ "$IMGOPTSSYNTAX" = "true" ]; then
    _launch_qemu \
        -drive "${TEST_IMG}",cache=${CACHEMODE},aio=$AIOMODE,id=disk
else
    _launch_qemu \
        -drive file="${TEST_IMG}",cache=${CACHEMODE},aio=$AIOMODE,driver=$IMGFMT,id=disk
fi
src=$QEMU_HANDLE

if [ "$IMGOPTSSYNTAX" = "true" ]; then
    _launch_qemu \
        -drive "${TEST_IMG}",cache=${CACHEMODE},aio=$AIOMODE,id=disk \
        -incoming "unix:${MIG_SOCKET}"
else
    _launch_qemu \
        -drive file="${TEST_IMG}",cache=${CACHEMODE},aio=$AIOMODE,driver=$IMGFMT,id=disk \
        -incoming "unix:${MIG_SOCKET}"
fi
dest=$QEMU_HANDLE

echo
echo === Set \'migrate_set_capability postcopy-ram on\' and migrate ===
echo

silent=yes
_send_qemu_cmd $dest 'migrate_set_capability postcopy-ram on' "(qemu)"

qemu_error_no_exit=yes success_or_failure=yes \
    _send_qemu_cmd $dest '' "(qemu)" "Postcopy is not supported"
if [ ${QEMU_STATUS[$dest]} -lt 0 ]; then
    _send_qemu_cmd $dest '' "(qemu)"

    _send_qemu_cmd $src 'quit' ""
    _send_qemu_cmd $dest 'quit' ""
    wait=1 _cleanup_qemu

    _notrun 'Postcopy is not supported'
fi

_send_qemu_cmd $src 'migrate_set_capability postcopy-ram on' "(qemu)"
_send_qemu_cmd $src "migrate -d unix:${MIG_SOCKET}" "(qemu)"

QEMU_COMM_TIMEOUT=1 qemu_cmd_repeat=10 silent=yes \
    _send_qemu_cmd $src "info migrate" "completed\|failed"
silent=yes _send_qemu_cmd $src "" "(qemu)"

echo
echo === Check if migration was successful ===
echo

QEMU_COMM_TIMEOUT=1 silent=yes \
    _send_qemu_cmd $src "info migrate" "completed"
silent=yes _send_qemu_cmd $src "" "(qemu)"

echo
echo === On destination, execute savevm and loadvm ===
echo

silent=
_send_qemu_cmd $dest 'savevm state1' "(qemu)"
_send_qemu_cmd $dest 'loadvm state1' "(qemu)"

echo
echo === Shut down and check image ===
echo

_send_qemu_cmd $src 'quit' ""
_send_qemu_cmd $dest 'quit' ""
wait=1 _cleanup_qemu

_check_test_img

# success, all done
echo "*** done"
status=0
