#!/usr/bin/env bash
# group: rw auto quick
#
# Tests oVirt-like storage migration:
#  - Create snapshot
#  - Create target image with (not yet existing) target backing chain
#    (i.e. just write the name of a soon-to-be-copied-over backing file into it)
#  - drive-mirror the snapshot to the target with mode=existing and sync=top
#  - In the meantime, copy the original source files to the destination via
#    conventional means (i.e. outside of qemu)
#  - Complete the drive-mirror job
#  - Delete all source images
#
# Copyright (C) 2016 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=hreitz@redhat.com

seq="$(basename $0)"
echo "QA output created by $seq"

status=1	# failure is the default!

_cleanup()
{
    _cleanup_qemu
    for img in "$TEST_IMG"{,.target}{,.backing,.overlay}; do
        _rm_test_img "$img"
    done
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

_supported_fmt qcow2 qed
_supported_proto generic
# Copying files around with cp does not work with external data files
_unsupported_imgopts data_file

# Create source disk
TEST_IMG="$TEST_IMG.backing" _make_test_img 1M
_make_test_img -b "$TEST_IMG.backing" -F $IMGFMT 1M

$QEMU_IO -c 'write -P 1 0 256k' "$TEST_IMG.backing" | _filter_qemu_io
$QEMU_IO -c 'write -P 2 64k 192k' "$TEST_IMG" | _filter_qemu_io

_launch_qemu -drive if=none,id=source,file="$TEST_IMG"

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'qmp_capabilities' }" \
    'return'

# Create snapshot
TEST_IMG="$TEST_IMG.overlay" _make_test_img -u -b "$TEST_IMG" -F $IMGFMT 1M
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'blockdev-snapshot-sync',
       'arguments': { 'device': 'source',
                      'snapshot-file': '$TEST_IMG.overlay',
                      'format': '$IMGFMT',
                      'mode': 'existing' } }" \
    'return'

# Write something to the snapshot
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"write -P 3 128k 128k\"' } }" \
    'return'

# Create target image
TEST_IMG="$TEST_IMG.target.overlay" _make_test_img -u -b "$TEST_IMG.target" \
    -F $IMGFMT 1M

# Mirror snapshot
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'drive-mirror',
       'arguments': { 'device': 'source',
                      'target': '$TEST_IMG.target.overlay',
                      'mode': 'existing',
                      'sync': 'top' } }" \
    'return'

# Wait for convergence
_send_qemu_cmd $QEMU_HANDLE \
    '' \
    'BLOCK_JOB_READY'

# Write some more
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"write -P 4 192k 64k\"' } }" \
    'return'

# Copy source backing chain to the target before completing the job
cp "$TEST_IMG.backing" "$TEST_IMG.target.backing"
cp "$TEST_IMG" "$TEST_IMG.target"
$QEMU_IMG rebase -u -b "$TEST_IMG.target.backing" -F $IMGFMT "$TEST_IMG.target"

# Complete block job
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'block-job-complete',
       'arguments': { 'device': 'source' } }" \
    ''

_send_qemu_cmd $QEMU_HANDLE \
    '' \
    '"status": "null"'

# Remove the source images
for img in "$TEST_IMG{,.backing,.overlay}"; do
    _rm_test_img "$img"
done

echo

# Check online disk contents
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"read -P 1 0k 64k\"' } }" \
    'return'

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"read -P 2 64k 64k\"' } }" \
    'return'

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"read -P 3 128k 64k\"' } }" \
    'return'

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'human-monitor-command',
       'arguments': { 'command-line':
                      'qemu-io source \"read -P 4 192k 64k\"' } }" \
    'return'

echo

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'quit' }" \
    'return'

wait=1 _cleanup_qemu

echo

# Check offline disk contents
$QEMU_IO -c 'read -P 1 0k 64k' \
         -c 'read -P 2 64k 64k' \
         -c 'read -P 3 128k 64k' \
         -c 'read -P 4 192k 64k' \
         "$TEST_IMG.target.overlay" | _filter_qemu_io

echo

# success, all done
echo '*** done'
rm -f $seq.full
status=0
