#!/usr/bin/env bash
# Check live snapshot, followed by active commit, and another snapshot.
#
# This test is to catch the error case of BZ #1300209:
# https://bugzilla.redhat.com/show_bug.cgi?id=1300209
#
# 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=jcody@redhat.com

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

status=1	# failure is the default!

TMP_SNAP1=${TEST_DIR}/tmp.qcow2
TMP_SNAP2=${TEST_DIR}/tmp2.qcow2

_cleanup()
{
    _cleanup_qemu
    for img in "${TEST_IMG}" "${TMP_SNAP1}" "${TMP_SNAP2}"; 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
_supported_proto file

size=512M

_make_test_img $size

echo
echo === Launching QEMU ===
echo

qemu_comm_method="qmp"
_launch_qemu -drive file="${TEST_IMG}",if=virtio
h=$QEMU_HANDLE


echo
echo === Performing Live Snapshot 1 ===
echo

_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"


# First live snapshot, new overlay as active layer
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
                                'arguments': {
                                             'device': 'virtio0',
                                             'snapshot-file':'${TMP_SNAP1}',
                                             'format': 'qcow2'
                                             }
                    }" "return"

echo
echo === Performing block-commit on active layer ===
echo

# Block commit on active layer, push the new overlay into base
_send_qemu_cmd $h "{ 'execute': 'block-commit',
                                'arguments': {
                                                 'device': 'virtio0'
                                              }
                    }" "READY"

_send_qemu_cmd $h "{ 'execute': 'block-job-complete',
                                'arguments': {
                                                'device': 'virtio0'
                                              }
                   }" '"status": "null"'

echo
echo === Performing Live Snapshot 2 ===
echo

# New live snapshot, new overlays as active layer
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
                                'arguments': {
                                                'device': 'virtio0',
                                                'snapshot-file':'${TMP_SNAP2}',
                                                'format': 'qcow2'
                                              }
                   }" "return"

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