#!/usr/bin/env bash
#
# Test postcopy live migration with shared storage
#
# Copyright (C) 2017 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=kwolf@redhat.com

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

status=1	# failure is the default!

MIG_SOCKET="${SOCK_DIR}/migrate"

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

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

_supported_fmt generic
# Formats that do not support live migration
_unsupported_fmt qcow vdi vhdx vmdk vpc vvfat parallels
_supported_proto generic
_supported_os Linux

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 === Write something on the source ===
echo

silent=
_send_qemu_cmd $src 'qemu-io disk "write -P 0x55 0 64k"' "(qemu)"
_send_qemu_cmd $src "" "ops/sec"
_send_qemu_cmd $src 'qemu-io disk "read -P 0x55 0 64k"' "(qemu)"
_send_qemu_cmd $src "" "ops/sec"

echo
echo === Do postcopy migration to destination ===
echo

# Slow down migration so much that it definitely won't finish before we can
# switch to postcopy
# Enable postcopy-ram capability both on source and destination
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_speed 4k' "(qemu)"
_send_qemu_cmd $src 'migrate_set_capability postcopy-ram on' "(qemu)"
_send_qemu_cmd $src "migrate -d unix:${MIG_SOCKET}" "(qemu)"
_send_qemu_cmd $src 'migrate_start_postcopy' "(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 === Do some I/O on the destination ===
echo

# It is important that we use the BlockBackend of the guest device here instead
# of the node name, which would create a new BlockBackend and not test whether
# the guest has the necessary permissions to access the image now
silent=
_send_qemu_cmd $dest 'qemu-io disk "read -P 0x55 0 64k"' "(qemu)"
_send_qemu_cmd $dest "" "ops/sec"
_send_qemu_cmd $dest 'qemu-io disk "write -P 0x66 1M 64k"' "(qemu)"
_send_qemu_cmd $dest "" "ops/sec"

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"
rm -f $seq.full
status=0
