#!/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
    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

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
