[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] block: qemu-iotests 085 - live snapshots tests
From: |
Benoît Canet |
Subject: |
Re: [Qemu-devel] [PATCH] block: qemu-iotests 085 - live snapshots tests |
Date: |
Thu, 6 Mar 2014 15:54:49 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
The Friday 28 Feb 2014 à 21:08:11 (-0500), Jeff Cody wrote :
> This adds tests for live snapshots, both through the single
> snapshot command, and the transaction group snapshot command.
>
> The snapshots are done through the QMP interface, using the
> following commands for snapshots:
>
> Single snapshot:
> { 'execute': 'blockdev-snapshot-sync', 'arguments':
> { 'device': 'virtio0', 'snapshot-file':'...',
> 'format': 'qcow2' } }"
>
> Group snapshot:
> { 'execute': 'transaction', 'arguments':
> {'actions': [
> { 'type': 'blockdev-snapshot-sync', 'data' :
> { 'device': 'virtio0', 'snapshot-file': '...' } },
> { 'type': 'blockdev-snapshot-sync', 'data' :
> { 'device': 'virtio1', 'snapshot-file': '...' } } ]
> } }
>
> Signed-off-by: Jeff Cody <address@hidden>
> ---
> tests/qemu-iotests/085 | 192
> +++++++++++++++++++++++++++++++++++++++++++++
> tests/qemu-iotests/085.out | 55 +++++++++++++
> tests/qemu-iotests/group | 1 +
> 3 files changed, 248 insertions(+)
> create mode 100755 tests/qemu-iotests/085
> create mode 100644 tests/qemu-iotests/085.out
>
> diff --git a/tests/qemu-iotests/085 b/tests/qemu-iotests/085
> new file mode 100755
> index 0000000..33c8dc4
> --- /dev/null
> +++ b/tests/qemu-iotests/085
> @@ -0,0 +1,192 @@
> +#!/bin/bash
> +#
> +# Live snapshot tests
> +#
> +# This tests live snapshots of images on a running QEMU instance, using
> +# QMP commands. Both single disk snapshots, and transactional group
> +# snapshots are performed.
> +#
> +# Copyright (C) 2014 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
> address@hidden
> +
> +seq=`basename $0`
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +status=1 # failure is the default!
> +qemu_pid=
> +
> +QMP_IN="${TEST_DIR}/qmp-in-$$"
> +QMP_OUT="${TEST_DIR}/qmp-out-$$"
> +
> +snapshot_virt0="snapshot-v0.qcow2"
> +snapshot_virt1="snapshot-v1.qcow2"
> +
> +MAX_SNAPSHOTS=10
> +
> +_cleanup()
> +{
> + kill -KILL ${qemu_pid}
> + wait ${qemu_pid} 2>/dev/null # silent kill
> +
> + rm -f "${QMP_IN}" "${QMP_OUT}"
> + for i in $(seq 1 ${MAX_SNAPSHOTS})
> + do
> + rm -f "${TEST_DIR}/${i}-${snapshot_virt0}"
> + rm -f "${TEST_DIR}/${i}-${snapshot_virt1}"
> + done
> + _cleanup_test_img
> +
> +}
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +# get standard environment, filters and checks
> +. ./common.rc
> +. ./common.filter
> +
> +_supported_fmt qcow2
> +_supported_proto file
> +_supported_os Linux
> +
> +# Wait for expected QMP response from QEMU. Will time out
> +# after 10 seconds, which counts as failure.
> +#
> +# $1 is the string to expect
> +#
> +# If $silent is set to anything but an empty string, then
> +# response is not echoed out.
> +function timed_wait_for()
> +{
> + while read -t 10 resp <&5
> + do
> + if [ "${silent}" == "" ]; then
> + echo "${resp}" | _filter_testdir | _filter_qemu
> + fi
> + grep -q "${1}" < <(echo ${resp})
> + if [ $? -eq 0 ]; then
> + return
> + fi
> + done
> + echo "Timeout waiting for ${1}"
> + exit 1 # Timeout means the test failed
> +}
> +
> +# Sends QMP command to QEMU, and waits for the expected response
> +#
> +# ${1}: String of the QMP command to send
> +# ${2}: String that the QEMU response should contain
> +function send_qmp_cmd()
> +{
> + echo "${1}" >&6
> + timed_wait_for "${2}"
> +}
> +
> +# ${1}: unique identifier for the snapshot filename
> +function create_single_snapshot()
> +{
> + cmd="{ 'execute': 'blockdev-snapshot-sync',
> + 'arguments': { 'device': 'virtio0',
> +
> 'snapshot-file':'"${TEST_DIR}/${1}-${snapshot_virt0}"',
> + 'format': 'qcow2' } }"
> + send_qmp_cmd "${cmd}" "return"
> +}
> +
> +# ${1}: unique identifier for the snapshot filename
> +function create_group_snapshot()
> +{
> + cmd="{ 'execute': 'transaction', 'arguments':
> + {'actions': [
> + { 'type': 'blockdev-snapshot-sync', 'data' :
> + { 'device': 'virtio0',
> + 'snapshot-file':
> '"${TEST_DIR}/${1}-${snapshot_virt0}"' } },
> + { 'type': 'blockdev-snapshot-sync', 'data' :
> + { 'device': 'virtio1',
> + 'snapshot-file':
> '"${TEST_DIR}/${1}-${snapshot_virt1}"' } } ]
> + } }"
> +
> + send_qmp_cmd "${cmd}" "return"
> +}
> +
> +size=128M
> +
> +mkfifo "${QMP_IN}"
> +mkfifo "${QMP_OUT}"
> +
> +_make_test_img $size
> +mv "${TEST_IMG}" "${TEST_IMG}.orig"
> +_make_test_img $size
> +
> +echo
> +echo === Running QEMU ===
> +echo
> +
> +"${QEMU}" -nographic -monitor none -serial none -qmp stdio\
> + -drive file="${TEST_IMG}.orig",if=virtio\
> + -drive file="${TEST_IMG}",if=virtio 2>&1 >"${QMP_OUT}"
> <"${QMP_IN}"&
> +qemu_pid=$!
> +
> +# redirect fifos to file descriptors, to keep from blocking
> +exec 5<"${QMP_OUT}"
> +exec 6>"${QMP_IN}"
> +
> +# Don't print response, since it has version information in it
> +silent=yes timed_wait_for "capabilities"
> +
> +echo
> +echo === Sending capabilities ===
> +echo
> +
> +send_qmp_cmd "{ 'execute': 'qmp_capabilities' }" "return"
> +
> +echo
> +echo === Create a single snapshot on virtio0 ===
> +echo
> +
> +create_single_snapshot 1
> +
> +
> +echo
> +echo === Invalid command - missing device and nodename ===
> +echo
> +
> +send_qmp_cmd "{ 'execute': 'blockdev-snapshot-sync',
> + 'arguments': {
> 'snapshot-file':'"${TEST_DIR}"/1-${snapshot_virt0}',
> + 'format': 'qcow2' } }" "error"
> +
> +echo
> +echo === Invalid command - missing snapshot-file ===
> +echo
> +
> +send_qmp_cmd "{ 'execute': 'blockdev-snapshot-sync',
> + 'arguments': { 'device': 'virtio0',
> + 'format': 'qcow2' } }" "error"
> +echo
> +echo
> +echo === Create several transactional group snapshots ===
> +echo
> +
> +for i in $(seq 2 ${MAX_SNAPSHOTS})
> +do
> + create_group_snapshot ${i}
> +done
> +
> +# success, all done
> +echo "*** done"
> +rm -f $seq.full
> +status=0
> diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
> new file mode 100644
> index 0000000..0f2b17f
> --- /dev/null
> +++ b/tests/qemu-iotests/085.out
> @@ -0,0 +1,55 @@
> +QA output created by 085
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
> +
> +=== Running QEMU ===
> +
> +
> +=== Sending capabilities ===
> +
> +{"return": {}}
> +
> +=== Create a single snapshot on virtio0 ===
> +
> +Formatting 'TEST_DIR/1-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/t.qcow2.orig' backing_fmt='qcow2' encryption=off
> cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +
> +=== Invalid command - missing device and nodename ===
> +
> +{"error": {"class": "GenericError", "desc": "Cannot find device= nor
> node_name="}}
> +
> +=== Invalid command - missing snapshot-file ===
> +
> +{"error": {"class": "GenericError", "desc": "Parameter 'snapshot-file' is
> missing"}}
> +
> +
> +=== Create several transactional group snapshots ===
> +
> +Formatting 'TEST_DIR/2-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/1-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/2-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/t.qcow2' backing_fmt='qcow2' encryption=off
> cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/3-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/2-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/3-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/2-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/4-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/3-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/4-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/3-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/5-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/4-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/5-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/4-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/6-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/5-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/6-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/5-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/7-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/6-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/7-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/6-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/8-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/7-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/8-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/7-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/9-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/8-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/9-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/8-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +Formatting 'TEST_DIR/10-snapshot-v0.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/9-snapshot-v0.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +Formatting 'TEST_DIR/10-snapshot-v1.qcow2', fmt=qcow2 size=134217728
> backing_file='TEST_DIR/9-snapshot-v1.qcow2' backing_fmt='qcow2'
> encryption=off cluster_size=65536 lazy_refcounts=off
> +{"return": {}}
> +*** done
> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> index db127d9..77d0a95 100644
> --- a/tests/qemu-iotests/group
> +++ b/tests/qemu-iotests/group
> @@ -85,3 +85,4 @@
> 079 rw auto
> 081 rw auto
> 082 rw auto quick
> +085 rw auto quick
> --
> 1.8.3.1
>
>
That's some slick shell IO redirection tricks.
I think I'll do a copycat test based on this one in order to test quorum
snapshots.
Reviewed-by: Benoit Canet <address@hidden>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH] block: qemu-iotests 085 - live snapshots tests,
Benoît Canet <=