#!/bin/bash
#
# Test commit block job where top has two parents
#
# 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"

here=`pwd`
status=1 # failure is the default!

MIG_SOCKET="${TEST_DIR}/migrate"

_cleanup()
{
    rm -f "${TEST_IMG}.mid"
    rm -f "${TEST_IMG}.ovl2"
    rm -f "${TEST_IMG}.ovl3"
    _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 qcow2
_supported_proto file
_supported_os Linux

size=64M

echo
echo === Preparing and starting VM ===
echo

TEST_IMG="${TEST_IMG}.base" _make_test_img $size
IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
    TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
_make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"

$QEMU_IO -c 'write -P 0x55 1M 64k' "${TEST_IMG}.mid" | _filter_qemu_io

qemu_comm_method="qmp"
qmp_pretty="y"

_launch_qemu \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.base,node-name=base" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.mid,node-name=mid,backing=base" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG},node-name=top,backing=mid" \
    -blockdev "driver=${IMGFMT},file.driver=file,file.filename=${TEST_IMG}.ovl2,node-name=top2,backing=mid"
h=$QEMU_HANDLE
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" '^}'

echo
echo === Perform commit job ===
echo

_send_qemu_cmd $h \
    "{ 'execute': 'block-commit',
       'arguments': { 'job-id': 'commit0',
                      'device': 'top',
                      'base':'$TEST_IMG.base',
                      'top': '$TEST_IMG.mid' } }" \
    "BLOCK_JOB_COMPLETED"
_send_qemu_cmd $h "" "^}"

echo
echo === Check that both top and top2 point to base now ===
echo

_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
    _filter_generated_node_ids | _filter_actual_image_size | _filter_img_info

_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
wait=1 _cleanup_qemu

_img_info
TEST_IMG="$TEST_IMG.ovl2" _img_info


echo
echo === Preparing and starting VM with -drive ===
echo

TEST_IMG="${TEST_IMG}.base" _make_test_img $size
TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
_make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
TEST_IMG="${TEST_IMG}.ovl3" _make_test_img -b "${TEST_IMG}.ovl2"

$QEMU_IO -c 'write -P 0x55 1M 64k' "${TEST_IMG}.mid" | _filter_qemu_io

qemu_comm_method="qmp"
qmp_pretty="y"

_launch_qemu \
    -drive "driver=${IMGFMT},file=${TEST_IMG},node-name=top,backing.node-name=mid" \
    -drive "driver=${IMGFMT},file=${TEST_IMG}.ovl3,node-name=top2,backing.backing=mid"
h=$QEMU_HANDLE
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" '^}'

echo
echo === Perform commit job ===
echo

_send_qemu_cmd $h \
    "{ 'execute': 'block-commit',
       'arguments': { 'job-id': 'commit0',
                      'device': 'top',
                      'base':'$TEST_IMG.base',
                      'top': '$TEST_IMG.mid' } }" \
    "BLOCK_JOB_COMPLETED"
_send_qemu_cmd $h "" "^}"

echo
echo === Check that both top and top2 point to base now ===
echo

_send_qemu_cmd $h "{ 'execute': 'query-named-block-nodes' }" "^}" |
    _filter_generated_node_ids | _filter_actual_image_size | _filter_img_info

_send_qemu_cmd $h "{ 'execute': 'quit' }" "^}"
wait=1 _cleanup_qemu

_img_info
TEST_IMG="$TEST_IMG.ovl2" _img_info

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