#!/bin/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
    rm -f "${TEST_IMG}" "${TMP_SNAP1}" "${TMP_SNAP2}"
}

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=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
