From 43686f362cc08a3f1e5bc94ec7822d3e0d887731 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 6 Jul 2019 10:48:59 -0500 Subject: [PATCH] backup: Add virsh-checkpoints test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similar to virsh-snapshots. Provides decent coverage of the checkpoint API, the test driver implementation, and the virsh access to the API. A later patch will worry about testing that snapshots and checkpoints are mutually exclusive (in part so it is easier to revert that when we finally implement the interaction and lift that restriction). Signed-off-by: Eric Blake Reviewed-by: Daniel P. Berrangé --- tests/Makefile.am | 1 + tests/virsh-checkpoint | 167 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100755 tests/virsh-checkpoint diff --git a/tests/Makefile.am b/tests/Makefile.am index 544328bb18..1c92e3ca6f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -413,6 +413,7 @@ libvirtd_test_scripts = \ virsh-schedinfo \ virsh-self-test \ virt-admin-self-test \ + virsh-checkpoint \ virsh-snapshot \ virsh-start \ virsh-undefine \ diff --git a/tests/virsh-checkpoint b/tests/virsh-checkpoint new file mode 100755 index 0000000000..4fe111f5b7 --- /dev/null +++ b/tests/virsh-checkpoint @@ -0,0 +1,167 @@ +#!/bin/sh +# simple testing of checkpoint 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 +# . + +. "$(dirname $0)/test-lib.sh" + +if test "$VERBOSE" = yes; then + set -x + $abs_top_builddir/tools/virsh --version +fi + +fail=0 + +mock_xdg_ || framework_failure + +# 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 checkpoints, with names that intentionally sort + # differently by topology than by name. For now, it is not possible + # to create fanout without hacking through redefines. + checkpoint-create-as test c1 + checkpoint-create-as test c1 + checkpoint-create-as test c3 + checkpoint-create-as test c2 + # Checking tree view (siblings sorted alphabetically) + checkpoint-list test --tree + # Demonstrate list filtering + checkpoint-list test --roots + checkpoint-list test --leaves + checkpoint-list test --parent --no-leaves + checkpoint-list test --from c3 + checkpoint-list test --from c1 --descendants --name + # Now the tree is linear, so we have an unambiguous topological order + checkpoint-list test --name + checkpoint-list test --name --topological + # Capture some XML for later redefine + checkpoint-delete test c1 + echo "" + checkpoint-dumpxml test c3 + echo "" + checkpoint-dumpxml test c2 + echo "" + # Deleting current checkpoint moves current up to remaining parent + checkpoint-delete test --children-only c3 + checkpoint-list test --leaves --name + checkpoint-delete test --children c3 + checkpoint-list test --leaves --name + # All done +' || fail=1 + +# First part is expected output, --tree results in trailing spaces, +# and checkpoint-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 checkpoint XMLs +sed -n '/MarkerA/,/MarkerB/p' < out > c3.xml || fail=1 +sed -n '/MarkerB/,/MarkerC/p' < out > c2.xml || fail=1 + +cat <<\EOF > exp || fail=1 +Domain checkpoint c1 created + +Domain checkpoint c3 created +Domain checkpoint c2 created +c1 + | + +- c3 + | + +- c2 + + + Name Creation Time +----------------------------------- + c1 TIMESTAMP + + Name Creation Time +----------------------------------- + c2 TIMESTAMP + + Name Creation Time Parent +-------------------------------------------- + c1 TIMESTAMP + c3 TIMESTAMP c1 + + Name Creation Time +----------------------------------- + c2 TIMESTAMP + +c2 +c3 + +c1 +c2 +c3 + +c1 +c3 +c2 + +Domain checkpoint c1 deleted + +Domain checkpoint c3 children deleted + +c3 + +Domain checkpoint c3 deleted + + +EOF +compare exp out.cooked || fail=1 + +cat < exp || fail=1 +error: operation failed: domain moment c1 already exists +EOF +compare exp err || fail=1 + +# Restore state with redefine +$abs_top_builddir/tools/virsh -c test:///default >out 2>err < exp || fail=1 + + +Domain checkpoint c3 created from 'c3.xml' +Domain checkpoint c2 created from 'c2.xml' +c2 + +Name: c2 +Domain: test +Parent: c3 +Children: 0 +Descendants: 0 + +EOF +sed '1,/^virsh #/d; /virsh #/d' < out > out.cooked || fail=1 +compare exp out.cooked || fail=1 + +cat < exp || fail=1 +error: invalid argument: parent c3 for moment c2 not found +error: marker +EOF +compare exp err || fail=1 + +(exit $fail); exit $fail