192b22e7bSKevin Wolf#!/usr/bin/env bash 2*9dd003a9SVladimir Sementsov-Ogievskiy# group: rw auto quick snapshot 392b22e7bSKevin Wolf# 492b22e7bSKevin Wolf# Test which nodes are involved in internal snapshots 592b22e7bSKevin Wolf# 692b22e7bSKevin Wolf# Copyright (C) 2019 Red Hat, Inc. 792b22e7bSKevin Wolf# 892b22e7bSKevin Wolf# This program is free software; you can redistribute it and/or modify 992b22e7bSKevin Wolf# it under the terms of the GNU General Public License as published by 1092b22e7bSKevin Wolf# the Free Software Foundation; either version 2 of the License, or 1192b22e7bSKevin Wolf# (at your option) any later version. 1292b22e7bSKevin Wolf# 1392b22e7bSKevin Wolf# This program is distributed in the hope that it will be useful, 1492b22e7bSKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of 1592b22e7bSKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1692b22e7bSKevin Wolf# GNU General Public License for more details. 1792b22e7bSKevin Wolf# 1892b22e7bSKevin Wolf# You should have received a copy of the GNU General Public License 1992b22e7bSKevin Wolf# along with this program. If not, see <http://www.gnu.org/licenses/>. 2092b22e7bSKevin Wolf# 2192b22e7bSKevin Wolf 2292b22e7bSKevin Wolf# creator 2392b22e7bSKevin Wolfowner=kwolf@redhat.com 2492b22e7bSKevin Wolf 2592b22e7bSKevin Wolfseq=`basename $0` 2692b22e7bSKevin Wolfecho "QA output created by $seq" 2792b22e7bSKevin Wolf 2892b22e7bSKevin Wolfstatus=1 # failure is the default! 2992b22e7bSKevin Wolf 3092b22e7bSKevin Wolf_cleanup() 3192b22e7bSKevin Wolf{ 3292b22e7bSKevin Wolf _cleanup_test_img 33f0e24942SMax Reitz rm -f "$SOCK_DIR/nbd" 3492b22e7bSKevin Wolf} 3592b22e7bSKevin Wolftrap "_cleanup; exit \$status" 0 1 2 3 15 3692b22e7bSKevin Wolf 3792b22e7bSKevin Wolf# get standard environment, filters and checks 3892b22e7bSKevin Wolf. ./common.rc 3992b22e7bSKevin Wolf. ./common.filter 4092b22e7bSKevin Wolf 4192b22e7bSKevin Wolf_supported_fmt qcow2 4292b22e7bSKevin Wolf_supported_proto file 4392b22e7bSKevin Wolf_supported_os Linux 44c85c6d9eSThomas Huth_require_drivers copy-on-read 4592b22e7bSKevin Wolf 463be2024aSMax Reitz# Internal snapshots are (currently) impossible with refcount_bits=1, 473be2024aSMax Reitz# and generally impossible with external data files 483be2024aSMax Reitz_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file 4992b22e7bSKevin Wolf 509bdabfbeSThomas Huth_require_devices virtio-blk 519bdabfbeSThomas Huth 5292b22e7bSKevin Wolfdo_run_qemu() 5392b22e7bSKevin Wolf{ 5492b22e7bSKevin Wolf echo Testing: "$@" 5592b22e7bSKevin Wolf ( 5692b22e7bSKevin Wolf if ! test -t 0; then 5792b22e7bSKevin Wolf while read cmd; do 5892b22e7bSKevin Wolf echo $cmd 5992b22e7bSKevin Wolf done 6092b22e7bSKevin Wolf fi 6192b22e7bSKevin Wolf echo quit 6292b22e7bSKevin Wolf ) | $QEMU -nographic -monitor stdio -nodefaults "$@" 6392b22e7bSKevin Wolf echo 6492b22e7bSKevin Wolf} 6592b22e7bSKevin Wolf 6692b22e7bSKevin Wolfrun_qemu() 6792b22e7bSKevin Wolf{ 6892b22e7bSKevin Wolf do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_hmp | 6992b22e7bSKevin Wolf _filter_generated_node_ids | _filter_imgfmt | _filter_vmstate_size 7092b22e7bSKevin Wolf} 7192b22e7bSKevin Wolf 7292b22e7bSKevin Wolfsize=128M 7392b22e7bSKevin Wolf 7492b22e7bSKevin Wolfrun_test() 7592b22e7bSKevin Wolf{ 76ecb4c1d1SMax Reitz if [ -n "$BACKING_FILE" ]; then 77b66ff2c2SEric Blake _make_test_img -b "$BACKING_FILE" -F $IMGFMT $size 78ecb4c1d1SMax Reitz else 7992b22e7bSKevin Wolf _make_test_img $size 80ecb4c1d1SMax Reitz fi 8192b22e7bSKevin Wolf printf "savevm snap0\ninfo snapshots\nloadvm snap0\n" | run_qemu "$@" | _filter_date 8292b22e7bSKevin Wolf} 8392b22e7bSKevin Wolf 8492b22e7bSKevin Wolf 8592b22e7bSKevin Wolfecho 8692b22e7bSKevin Wolfecho "=== No block devices at all ===" 8792b22e7bSKevin Wolfecho 8892b22e7bSKevin Wolf 8992b22e7bSKevin Wolfrun_test 9092b22e7bSKevin Wolf 9192b22e7bSKevin Wolfecho 9292b22e7bSKevin Wolfecho "=== -drive if=none ===" 9392b22e7bSKevin Wolfecho 9492b22e7bSKevin Wolf 9592b22e7bSKevin Wolfrun_test -drive driver=file,file="$TEST_IMG",if=none 9692b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=none 9792b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=none -device virtio-blk,drive=none0 9892b22e7bSKevin Wolf 9992b22e7bSKevin Wolfecho 10092b22e7bSKevin Wolfecho "=== -drive if=virtio ===" 10192b22e7bSKevin Wolfecho 10292b22e7bSKevin Wolf 10392b22e7bSKevin Wolfrun_test -drive driver=file,file="$TEST_IMG",if=virtio 10492b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=virtio 10592b22e7bSKevin Wolf 10692b22e7bSKevin Wolfecho 10792b22e7bSKevin Wolfecho "=== Simple -blockdev ===" 10892b22e7bSKevin Wolfecho 10992b22e7bSKevin Wolf 11092b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file 11192b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 11292b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,node-name=fmt 11392b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 11492b22e7bSKevin Wolf -blockdev driver=raw,file=file,node-name=raw \ 11592b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=raw,node-name=fmt 11692b22e7bSKevin Wolf 11792b22e7bSKevin Wolfecho 11892b22e7bSKevin Wolfecho "=== -blockdev with a filter on top ===" 11992b22e7bSKevin Wolfecho 12092b22e7bSKevin Wolf 12192b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 12292b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,node-name=fmt \ 12392b22e7bSKevin Wolf -blockdev driver=copy-on-read,file=fmt,node-name=filter 12492b22e7bSKevin Wolf 12592b22e7bSKevin Wolfecho 12692b22e7bSKevin Wolfecho "=== -blockdev with a backing file ===" 12792b22e7bSKevin Wolfecho 12892b22e7bSKevin Wolf 12992b22e7bSKevin WolfTEST_IMG="$TEST_IMG.base" _make_test_img $size 13092b22e7bSKevin Wolf 131ecb4c1d1SMax ReitzBACKING_FILE="$TEST_IMG.base" \ 13292b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 13392b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 13492b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-file,node-name=fmt 13592b22e7bSKevin Wolf 136ecb4c1d1SMax ReitzBACKING_FILE="$TEST_IMG.base" \ 13792b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 13892b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=backing-file,node-name=backing-fmt \ 13992b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 14092b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-fmt,node-name=fmt 14192b22e7bSKevin Wolf 14292b22e7bSKevin Wolf# A snapshot should be present on the overlay, but not the backing file 14392b22e7bSKevin Wolfecho Internal snapshots on overlay: 14492b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG" | _filter_date | _filter_vmstate_size 14592b22e7bSKevin Wolf 14692b22e7bSKevin Wolfecho Internal snapshots on backing file: 14792b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG.base" | _filter_date | _filter_vmstate_size 14892b22e7bSKevin Wolf 14992b22e7bSKevin Wolfecho 15092b22e7bSKevin Wolfecho "=== -blockdev with NBD server on the backing file ===" 15192b22e7bSKevin Wolfecho 15292b22e7bSKevin Wolf 153b66ff2c2SEric Blake_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $size 15492b22e7bSKevin Wolfcat <<EOF | 155f0e24942SMax Reitznbd_server_start unix:$SOCK_DIR/nbd 15692b22e7bSKevin Wolfnbd_server_add -w backing-fmt 15792b22e7bSKevin Wolfsavevm snap0 15892b22e7bSKevin Wolfinfo snapshots 15992b22e7bSKevin Wolfloadvm snap0 16092b22e7bSKevin WolfEOF 16192b22e7bSKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 16292b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=backing-file,node-name=backing-fmt \ 16392b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 16492b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-fmt,node-name=fmt | 16592b22e7bSKevin Wolf _filter_date 16692b22e7bSKevin Wolf 16792b22e7bSKevin Wolf# This time, a snapshot should be created on both files 16892b22e7bSKevin Wolfecho Internal snapshots on overlay: 16992b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG" | _filter_date | _filter_vmstate_size 17092b22e7bSKevin Wolf 17192b22e7bSKevin Wolfecho Internal snapshots on backing file: 17292b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG.base" | _filter_date | _filter_vmstate_size 17392b22e7bSKevin Wolf 17492b22e7bSKevin Wolf# success, all done 17592b22e7bSKevin Wolfecho "*** done" 17692b22e7bSKevin Wolfrm -f $seq.full 17792b22e7bSKevin Wolfstatus=0 178