block: add tests for the 'blockdev-snapshot' command
Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Jeff Cody <jcody@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
43de7e2de0
commit
89e3a2d86d
@ -7,6 +7,7 @@
|
|||||||
# snapshots are performed.
|
# snapshots are performed.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2014 Red Hat, Inc.
|
# Copyright (C) 2014 Red Hat, Inc.
|
||||||
|
# Copyright (C) 2015 Igalia, S.L.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -34,17 +35,17 @@ status=1 # failure is the default!
|
|||||||
snapshot_virt0="snapshot-v0.qcow2"
|
snapshot_virt0="snapshot-v0.qcow2"
|
||||||
snapshot_virt1="snapshot-v1.qcow2"
|
snapshot_virt1="snapshot-v1.qcow2"
|
||||||
|
|
||||||
MAX_SNAPSHOTS=10
|
SNAPSHOTS=10
|
||||||
|
|
||||||
_cleanup()
|
_cleanup()
|
||||||
{
|
{
|
||||||
_cleanup_qemu
|
_cleanup_qemu
|
||||||
for i in $(seq 1 ${MAX_SNAPSHOTS})
|
for i in $(seq 1 ${SNAPSHOTS})
|
||||||
do
|
do
|
||||||
rm -f "${TEST_DIR}/${i}-${snapshot_virt0}"
|
rm -f "${TEST_DIR}/${i}-${snapshot_virt0}"
|
||||||
rm -f "${TEST_DIR}/${i}-${snapshot_virt1}"
|
rm -f "${TEST_DIR}/${i}-${snapshot_virt1}"
|
||||||
done
|
done
|
||||||
_cleanup_test_img
|
rm -f "${TEST_IMG}.1" "${TEST_IMG}.2"
|
||||||
|
|
||||||
}
|
}
|
||||||
trap "_cleanup; exit \$status" 0 1 2 3 15
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||||
@ -85,18 +86,50 @@ function create_group_snapshot()
|
|||||||
_send_qemu_cmd $h "${cmd}" "return"
|
_send_qemu_cmd $h "${cmd}" "return"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ${1}: unique identifier for the snapshot filename
|
||||||
|
# ${2}: true: open backing images; false: don't open them (default)
|
||||||
|
function add_snapshot_image()
|
||||||
|
{
|
||||||
|
if [ "${2}" = "true" ]; then
|
||||||
|
extra_params=""
|
||||||
|
else
|
||||||
|
extra_params="'backing': '', "
|
||||||
|
fi
|
||||||
|
base_image="${TEST_DIR}/$((${1}-1))-${snapshot_virt0}"
|
||||||
|
snapshot_file="${TEST_DIR}/${1}-${snapshot_virt0}"
|
||||||
|
_make_test_img -b "${base_image}" "$size"
|
||||||
|
mv "${TEST_IMG}" "${snapshot_file}"
|
||||||
|
cmd="{ 'execute': 'blockdev-add', 'arguments':
|
||||||
|
{ 'options':
|
||||||
|
{ 'driver': 'qcow2', 'node-name': 'snap_"${1}"', "${extra_params}"
|
||||||
|
'file':
|
||||||
|
{ 'driver': 'file', 'filename': '"${snapshot_file}"' } } } }"
|
||||||
|
_send_qemu_cmd $h "${cmd}" "return"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ${1}: unique identifier for the snapshot filename
|
||||||
|
# ${2}: expected response, defaults to 'return'
|
||||||
|
function blockdev_snapshot()
|
||||||
|
{
|
||||||
|
cmd="{ 'execute': 'blockdev-snapshot',
|
||||||
|
'arguments': { 'node': 'virtio0',
|
||||||
|
'overlay':'snap_"${1}"' } }"
|
||||||
|
_send_qemu_cmd $h "${cmd}" "${2:-return}"
|
||||||
|
}
|
||||||
|
|
||||||
size=128M
|
size=128M
|
||||||
|
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
mv "${TEST_IMG}" "${TEST_IMG}.orig"
|
mv "${TEST_IMG}" "${TEST_IMG}.1"
|
||||||
_make_test_img $size
|
_make_test_img $size
|
||||||
|
mv "${TEST_IMG}" "${TEST_IMG}.2"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo === Running QEMU ===
|
echo === Running QEMU ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
qemu_comm_method="qmp"
|
qemu_comm_method="qmp"
|
||||||
_launch_qemu -drive file="${TEST_IMG}.orig",if=virtio -drive file="${TEST_IMG}",if=virtio
|
_launch_qemu -drive file="${TEST_IMG}.1",if=virtio -drive file="${TEST_IMG}.2",if=virtio
|
||||||
h=$QEMU_HANDLE
|
h=$QEMU_HANDLE
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@ -105,6 +138,8 @@ echo
|
|||||||
|
|
||||||
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
|
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
|
||||||
|
|
||||||
|
# Tests for the blockdev-snapshot-sync command
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo === Create a single snapshot on virtio0 ===
|
echo === Create a single snapshot on virtio0 ===
|
||||||
echo
|
echo
|
||||||
@ -132,11 +167,66 @@ echo
|
|||||||
echo === Create several transactional group snapshots ===
|
echo === Create several transactional group snapshots ===
|
||||||
echo
|
echo
|
||||||
|
|
||||||
for i in $(seq 2 ${MAX_SNAPSHOTS})
|
for i in $(seq 2 ${SNAPSHOTS})
|
||||||
do
|
do
|
||||||
create_group_snapshot ${i}
|
create_group_snapshot ${i}
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Tests for the blockdev-snapshot command
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Create a couple of snapshots using blockdev-snapshot ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
SNAPSHOTS=$((${SNAPSHOTS}+1))
|
||||||
|
add_snapshot_image ${SNAPSHOTS}
|
||||||
|
blockdev_snapshot ${SNAPSHOTS}
|
||||||
|
|
||||||
|
SNAPSHOTS=$((${SNAPSHOTS}+1))
|
||||||
|
add_snapshot_image ${SNAPSHOTS}
|
||||||
|
blockdev_snapshot ${SNAPSHOTS}
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Invalid command - snapshot node used as active layer ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
blockdev_snapshot ${SNAPSHOTS} error
|
||||||
|
|
||||||
|
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
|
||||||
|
'arguments': { 'node':'virtio0',
|
||||||
|
'overlay':'virtio0' }
|
||||||
|
}" "error"
|
||||||
|
|
||||||
|
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
|
||||||
|
'arguments': { 'node':'virtio0',
|
||||||
|
'overlay':'virtio1' }
|
||||||
|
}" "error"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Invalid command - snapshot node used as backing hd ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
blockdev_snapshot $((${SNAPSHOTS}-1)) error
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Invalid command - snapshot node has a backing image ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
SNAPSHOTS=$((${SNAPSHOTS}+1))
|
||||||
|
add_snapshot_image ${SNAPSHOTS} true
|
||||||
|
blockdev_snapshot ${SNAPSHOTS} error
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo === Invalid command - The node does not exist ===
|
||||||
|
echo
|
||||||
|
|
||||||
|
blockdev_snapshot $((${SNAPSHOTS}+1)) error
|
||||||
|
|
||||||
|
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
|
||||||
|
'arguments': { 'node':'nodevice',
|
||||||
|
'overlay':'snap_"${SNAPSHOTS}"' }
|
||||||
|
}" "error"
|
||||||
|
|
||||||
# success, all done
|
# success, all done
|
||||||
echo "*** done"
|
echo "*** done"
|
||||||
rm -f $seq.full
|
rm -f $seq.full
|
||||||
|
@ -11,7 +11,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|||||||
|
|
||||||
=== Create a single snapshot on virtio0 ===
|
=== 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 refcount_bits=16
|
Formatting 'TEST_DIR/1-snapshot-v0.qcow2', fmt=qcow2 size=134217728 backing_file=TEST_DIR/t.qcow2.1 backing_fmt=qcow2 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
|
||||||
{"return": {}}
|
{"return": {}}
|
||||||
|
|
||||||
=== Invalid command - missing device and nodename ===
|
=== Invalid command - missing device and nodename ===
|
||||||
@ -26,7 +26,7 @@ Formatting 'TEST_DIR/1-snapshot-v0.qcow2', fmt=qcow2 size=134217728 backing_file
|
|||||||
=== Create several transactional group snapshots ===
|
=== 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 refcount_bits=16
|
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 refcount_bits=16
|
||||||
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 refcount_bits=16
|
Formatting 'TEST_DIR/2-snapshot-v1.qcow2', fmt=qcow2 size=134217728 backing_file=TEST_DIR/t.qcow2.2 backing_fmt=qcow2 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
|
||||||
{"return": {}}
|
{"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 refcount_bits=16
|
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 refcount_bits=16
|
||||||
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 refcount_bits=16
|
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 refcount_bits=16
|
||||||
@ -52,4 +52,34 @@ Formatting 'TEST_DIR/9-snapshot-v1.qcow2', fmt=qcow2 size=134217728 backing_file
|
|||||||
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 refcount_bits=16
|
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 refcount_bits=16
|
||||||
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 refcount_bits=16
|
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 refcount_bits=16
|
||||||
{"return": {}}
|
{"return": {}}
|
||||||
|
|
||||||
|
=== Create a couple of snapshots using blockdev-snapshot ===
|
||||||
|
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/10-snapshot-v0.IMGFMT
|
||||||
|
{"return": {}}
|
||||||
|
{"return": {}}
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/11-snapshot-v0.IMGFMT
|
||||||
|
{"return": {}}
|
||||||
|
{"return": {}}
|
||||||
|
|
||||||
|
=== Invalid command - snapshot node used as active layer ===
|
||||||
|
|
||||||
|
{"error": {"class": "GenericError", "desc": "The snapshot is already in use by virtio0"}}
|
||||||
|
{"error": {"class": "GenericError", "desc": "The snapshot is already in use by virtio0"}}
|
||||||
|
{"error": {"class": "GenericError", "desc": "The snapshot is already in use by virtio1"}}
|
||||||
|
|
||||||
|
=== Invalid command - snapshot node used as backing hd ===
|
||||||
|
|
||||||
|
{"error": {"class": "GenericError", "desc": "Node 'snap_11' is busy: node is used as backing hd of 'virtio0'"}}
|
||||||
|
|
||||||
|
=== Invalid command - snapshot node has a backing image ===
|
||||||
|
|
||||||
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/12-snapshot-v0.IMGFMT
|
||||||
|
{"return": {}}
|
||||||
|
{"error": {"class": "GenericError", "desc": "The snapshot already has a backing image"}}
|
||||||
|
|
||||||
|
=== Invalid command - The node does not exist ===
|
||||||
|
|
||||||
|
{"error": {"class": "GenericError", "desc": "Cannot find device=snap_14 nor node_name=snap_14"}}
|
||||||
|
{"error": {"class": "GenericError", "desc": "Cannot find device=nodevice nor node_name=nodevice"}}
|
||||||
*** done
|
*** done
|
||||||
|
Loading…
Reference in New Issue
Block a user