#!/bin/bash
#
# 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="${TEST_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
# This was taken from test 080
_unsupported_imgopts 'refcount_bits=1[^0-9]'

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},id=disk
else
    _launch_qemu \
        -drive file="${TEST_IMG}",cache=${CACHEMODE},driver=$IMGFMT,id=disk
fi
src=$QEMU_HANDLE

if [ "$IMGOPTSSYNTAX" = "true" ]; then
    _launch_qemu \
        -drive "${TEST_IMG}",cache=${CACHEMODE},id=disk \
        -incoming "unix:${MIG_SOCKET}"
else
    _launch_qemu \
        -drive file="${TEST_IMG}",cache=${CACHEMODE},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
