mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
snapshot: Add tests of virsh -c test:///default snapshot*
Had this been in place earlier, I would have avoided the bugs in commit0baf6945
and55c2ab3e
. Writing the test required me to extend the power of virsh - creating enough snapshots to cause fanout requires enough input in a single session that adding comments and markers makes it easier to check that output is correct. It's still a bit odd that with test:///default, reverting to a snapshot changes the domain from running to paused (possibly a bug in how the test driver copied from the qemu driver) - but the important part is that the test is reproducible, and any future tweaks we make to snapshot code have less chance of breaking successful command sequences. Signed-off-by: Eric Blake <eblake@redhat.com> Acked-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
2efb42e9ac
commit
280a2b41e6
@ -1,6 +1,6 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
## Copyright (C) 2005-2015 Red Hat, Inc.
|
||||
## Copyright (C) 2005-2019 Red Hat, Inc.
|
||||
##
|
||||
## This library is free software; you can redistribute it and/or
|
||||
## modify it under the terms of the GNU Lesser General Public
|
||||
@ -410,6 +410,7 @@ libvirtd_test_scripts = \
|
||||
virsh-schedinfo \
|
||||
virsh-self-test \
|
||||
virt-admin-self-test \
|
||||
virsh-snapshot \
|
||||
virsh-start \
|
||||
virsh-undefine \
|
||||
virsh-uriprecedence \
|
||||
|
212
tests/virsh-snapshot
Executable file
212
tests/virsh-snapshot
Executable file
@ -0,0 +1,212 @@
|
||||
#!/bin/sh
|
||||
# simple testing of snapshot APIs on test driver
|
||||
|
||||
# Copyright (C) 2019 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/>.
|
||||
|
||||
. "$(dirname $0)/test-lib.sh"
|
||||
|
||||
if test "$VERBOSE" = yes; then
|
||||
set -x
|
||||
$abs_top_builddir/tools/virsh --version
|
||||
fi
|
||||
|
||||
fail=0
|
||||
|
||||
# The test driver loses states between restarts, so we perform a script
|
||||
# with some convenient markers for later post-processing of output.
|
||||
$abs_top_builddir/tools/virsh --connect test:///default >out 2>err '
|
||||
# Create a series of snapshots, with names that intentionally sort
|
||||
# differently by topology than by name. Use revert to create fanout.
|
||||
snapshot-create-as test s1
|
||||
snapshot-create-as test s3
|
||||
snapshot-create-as test s2
|
||||
snapshot-revert test s3
|
||||
snapshot-create-as test s6
|
||||
snapshot-create-as test s5
|
||||
snapshot-revert test s6
|
||||
snapshot-create-as test s4
|
||||
snapshot-revert test s1
|
||||
snapshot-create-as test s7
|
||||
snapshot-create-as test s8
|
||||
# Checking tree view (siblings sorted alphabetically)
|
||||
snapshot-list test --tree
|
||||
# Current was last one created, but we can change that
|
||||
snapshot-current test --name
|
||||
snapshot-current test s1
|
||||
snapshot-current test --name
|
||||
# Deleting current root leads to multiple roots, demonstrate list filtering
|
||||
snapshot-delete test --current
|
||||
echo --err marker
|
||||
snapshot-current test --name
|
||||
echo --err marker
|
||||
snapshot-list test --roots
|
||||
snapshot-list test --leaves
|
||||
snapshot-list test --parent --no-leaves
|
||||
snapshot-list test --from s3
|
||||
snapshot-list test --from s3 --descendants --name
|
||||
# More fun with delete flags, current node moves up to remaining parent
|
||||
snapshot-current test s4
|
||||
snapshot-delete test --children-only s6
|
||||
snapshot-current test --name
|
||||
snapshot-delete test --children s7
|
||||
snapshot-current test --name
|
||||
snapshot-delete test s6
|
||||
snapshot-current test --name
|
||||
# Now the tree is linear, so we have an unambiguous topological order
|
||||
snapshot-list test --name
|
||||
snapshot-list test --name --topological
|
||||
# Capture some XML for later redefine
|
||||
echo "<!--MarkerA-->"
|
||||
snapshot-dumpxml test s3
|
||||
echo "<!--MarkerB-->"
|
||||
snapshot-dumpxml test s2
|
||||
echo "<!--MarkerC-->"
|
||||
# All done
|
||||
' || fail=1
|
||||
|
||||
# First part is expected output, --tree results in trailing spaces,
|
||||
# and snapshot-list produces timestamps
|
||||
sed 's/ *$//; s/[0-9-]\{10\} [0-9:.]* .[0-9]\{4\}/TIMESTAMP/;
|
||||
/MarkerA/,/MarkerC/d' < out > out.cooked || fail=1
|
||||
# Second part holds domain XMLs
|
||||
sed -n '/MarkerA/,/MarkerB/p' < out > s3.xml || fail=1
|
||||
sed -n '/MarkerB/,/MarkerC/p' < out > s2.xml || fail=1
|
||||
|
||||
cat <<\EOF > exp || fail=1
|
||||
Domain snapshot s1 created
|
||||
Domain snapshot s3 created
|
||||
Domain snapshot s2 created
|
||||
|
||||
Domain snapshot s6 created
|
||||
Domain snapshot s5 created
|
||||
|
||||
Domain snapshot s4 created
|
||||
|
||||
Domain snapshot s7 created
|
||||
Domain snapshot s8 created
|
||||
s1
|
||||
|
|
||||
+- s3
|
||||
| |
|
||||
| +- s2
|
||||
| +- s6
|
||||
| |
|
||||
| +- s4
|
||||
| +- s5
|
||||
|
|
||||
+- s7
|
||||
|
|
||||
+- s8
|
||||
|
||||
|
||||
s8
|
||||
Snapshot s1 set as current
|
||||
s1
|
||||
Domain snapshot s1 deleted
|
||||
|
||||
|
||||
|
||||
|
||||
Name Creation Time State
|
||||
---------------------------------------------
|
||||
s3 TIMESTAMP running
|
||||
s7 TIMESTAMP paused
|
||||
|
||||
Name Creation Time State
|
||||
---------------------------------------------
|
||||
s2 TIMESTAMP running
|
||||
s4 TIMESTAMP paused
|
||||
s5 TIMESTAMP paused
|
||||
s8 TIMESTAMP paused
|
||||
|
||||
Name Creation Time State Parent
|
||||
------------------------------------------------------
|
||||
s3 TIMESTAMP running
|
||||
s6 TIMESTAMP paused s3
|
||||
s7 TIMESTAMP paused
|
||||
|
||||
Name Creation Time State
|
||||
---------------------------------------------
|
||||
s2 TIMESTAMP running
|
||||
s6 TIMESTAMP paused
|
||||
|
||||
s2
|
||||
s4
|
||||
s5
|
||||
s6
|
||||
|
||||
Snapshot s4 set as current
|
||||
Domain snapshot s6 children deleted
|
||||
|
||||
s6
|
||||
Domain snapshot s7 deleted
|
||||
|
||||
s6
|
||||
Domain snapshot s6 deleted
|
||||
|
||||
s3
|
||||
s2
|
||||
s3
|
||||
|
||||
s3
|
||||
s2
|
||||
|
||||
EOF
|
||||
compare exp out.cooked || fail=1
|
||||
|
||||
cat <<EOF > exp || fail=1
|
||||
error: marker
|
||||
error: domain 'test' has no current snapshot
|
||||
error: marker
|
||||
EOF
|
||||
compare exp err || fail=1
|
||||
|
||||
# Restore state with redefine
|
||||
$abs_top_builddir/tools/virsh -c test:///default >out 2>err <<EOF || fail=1
|
||||
# Redefine must be in topological order; this will fail
|
||||
snapshot-create test --redefine s2.xml
|
||||
echo --err marker
|
||||
# This is the right order
|
||||
snapshot-create test --redefine s3.xml
|
||||
snapshot-create test --redefine s2.xml --current
|
||||
snapshot-info test --current
|
||||
EOF
|
||||
|
||||
cat <<\EOF > exp || fail=1
|
||||
|
||||
|
||||
Domain snapshot s3 created from 's3.xml'
|
||||
Domain snapshot s2 created from 's2.xml'
|
||||
Name: s2
|
||||
Domain: test
|
||||
Current: yes
|
||||
State: running
|
||||
Location: internal
|
||||
Parent: s3
|
||||
Children: 0
|
||||
Descendants: 0
|
||||
Metadata: yes
|
||||
|
||||
EOF
|
||||
|
||||
cat <<EOF > exp || fail=1
|
||||
error: invalid argument: parent s3 for snapshot s2 not found
|
||||
error: marker
|
||||
EOF
|
||||
compare exp err || fail=1
|
||||
|
||||
(exit $fail); exit $fail
|
Loading…
Reference in New Issue
Block a user