[libvirt] [PATCH 5/5] snapshot: Add tests of virsh -c test:///default snapshot*

Eric Blake eblake at redhat.com
Sun Mar 24 04:02:03 UTC 2019


Had this been in place earlier, I would have avoided the bugs in
commit 0baf6945 and 55c2ab3e. 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 at redhat.com>
---
 tests/Makefile.am    |   3 +-
 tests/virsh-snapshot | 212 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 214 insertions(+), 1 deletion(-)
 create mode 100755 tests/virsh-snapshot

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 29f1fe2d2a..d3cdbff8bb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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 \
diff --git a/tests/virsh-snapshot b/tests/virsh-snapshot
new file mode 100755
index 0000000000..3e6ff39f5f
--- /dev/null
+++ b/tests/virsh-snapshot
@@ -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 --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
-- 
2.20.1




More information about the libvir-list mailing list