#!/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="${TEST_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},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 === 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
