1*92b22e7bSKevin Wolf#!/usr/bin/env bash 2*92b22e7bSKevin Wolf# 3*92b22e7bSKevin Wolf# Test which nodes are involved in internal snapshots 4*92b22e7bSKevin Wolf# 5*92b22e7bSKevin Wolf# Copyright (C) 2019 Red Hat, Inc. 6*92b22e7bSKevin Wolf# 7*92b22e7bSKevin Wolf# This program is free software; you can redistribute it and/or modify 8*92b22e7bSKevin Wolf# it under the terms of the GNU General Public License as published by 9*92b22e7bSKevin Wolf# the Free Software Foundation; either version 2 of the License, or 10*92b22e7bSKevin Wolf# (at your option) any later version. 11*92b22e7bSKevin Wolf# 12*92b22e7bSKevin Wolf# This program is distributed in the hope that it will be useful, 13*92b22e7bSKevin Wolf# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*92b22e7bSKevin Wolf# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*92b22e7bSKevin Wolf# GNU General Public License for more details. 16*92b22e7bSKevin Wolf# 17*92b22e7bSKevin Wolf# You should have received a copy of the GNU General Public License 18*92b22e7bSKevin Wolf# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*92b22e7bSKevin Wolf# 20*92b22e7bSKevin Wolf 21*92b22e7bSKevin Wolf# creator 22*92b22e7bSKevin Wolfowner=kwolf@redhat.com 23*92b22e7bSKevin Wolf 24*92b22e7bSKevin Wolfseq=`basename $0` 25*92b22e7bSKevin Wolfecho "QA output created by $seq" 26*92b22e7bSKevin Wolf 27*92b22e7bSKevin Wolfstatus=1 # failure is the default! 28*92b22e7bSKevin Wolf 29*92b22e7bSKevin Wolf_cleanup() 30*92b22e7bSKevin Wolf{ 31*92b22e7bSKevin Wolf _cleanup_test_img 32*92b22e7bSKevin Wolf rm -f "$TEST_DIR/nbd" 33*92b22e7bSKevin Wolf} 34*92b22e7bSKevin Wolftrap "_cleanup; exit \$status" 0 1 2 3 15 35*92b22e7bSKevin Wolf 36*92b22e7bSKevin Wolf# get standard environment, filters and checks 37*92b22e7bSKevin Wolf. ./common.rc 38*92b22e7bSKevin Wolf. ./common.filter 39*92b22e7bSKevin Wolf 40*92b22e7bSKevin Wolf_supported_fmt qcow2 41*92b22e7bSKevin Wolf_supported_proto file 42*92b22e7bSKevin Wolf_supported_os Linux 43*92b22e7bSKevin Wolf 44*92b22e7bSKevin Wolf# Internal snapshots are (currently) impossible with refcount_bits=1 45*92b22e7bSKevin Wolf_unsupported_imgopts 'refcount_bits=1[^0-9]' 46*92b22e7bSKevin Wolf 47*92b22e7bSKevin Wolfdo_run_qemu() 48*92b22e7bSKevin Wolf{ 49*92b22e7bSKevin Wolf echo Testing: "$@" 50*92b22e7bSKevin Wolf ( 51*92b22e7bSKevin Wolf if ! test -t 0; then 52*92b22e7bSKevin Wolf while read cmd; do 53*92b22e7bSKevin Wolf echo $cmd 54*92b22e7bSKevin Wolf done 55*92b22e7bSKevin Wolf fi 56*92b22e7bSKevin Wolf echo quit 57*92b22e7bSKevin Wolf ) | $QEMU -nographic -monitor stdio -nodefaults "$@" 58*92b22e7bSKevin Wolf echo 59*92b22e7bSKevin Wolf} 60*92b22e7bSKevin Wolf 61*92b22e7bSKevin Wolfrun_qemu() 62*92b22e7bSKevin Wolf{ 63*92b22e7bSKevin Wolf do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_hmp | 64*92b22e7bSKevin Wolf _filter_generated_node_ids | _filter_imgfmt | _filter_vmstate_size 65*92b22e7bSKevin Wolf} 66*92b22e7bSKevin Wolf 67*92b22e7bSKevin Wolfsize=128M 68*92b22e7bSKevin Wolf 69*92b22e7bSKevin Wolfrun_test() 70*92b22e7bSKevin Wolf{ 71*92b22e7bSKevin Wolf _make_test_img $size 72*92b22e7bSKevin Wolf printf "savevm snap0\ninfo snapshots\nloadvm snap0\n" | run_qemu "$@" | _filter_date 73*92b22e7bSKevin Wolf} 74*92b22e7bSKevin Wolf 75*92b22e7bSKevin Wolf 76*92b22e7bSKevin Wolfecho 77*92b22e7bSKevin Wolfecho "=== No block devices at all ===" 78*92b22e7bSKevin Wolfecho 79*92b22e7bSKevin Wolf 80*92b22e7bSKevin Wolfrun_test 81*92b22e7bSKevin Wolf 82*92b22e7bSKevin Wolfecho 83*92b22e7bSKevin Wolfecho "=== -drive if=none ===" 84*92b22e7bSKevin Wolfecho 85*92b22e7bSKevin Wolf 86*92b22e7bSKevin Wolfrun_test -drive driver=file,file="$TEST_IMG",if=none 87*92b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=none 88*92b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=none -device virtio-blk,drive=none0 89*92b22e7bSKevin Wolf 90*92b22e7bSKevin Wolfecho 91*92b22e7bSKevin Wolfecho "=== -drive if=virtio ===" 92*92b22e7bSKevin Wolfecho 93*92b22e7bSKevin Wolf 94*92b22e7bSKevin Wolfrun_test -drive driver=file,file="$TEST_IMG",if=virtio 95*92b22e7bSKevin Wolfrun_test -drive driver=$IMGFMT,file="$TEST_IMG",if=virtio 96*92b22e7bSKevin Wolf 97*92b22e7bSKevin Wolfecho 98*92b22e7bSKevin Wolfecho "=== Simple -blockdev ===" 99*92b22e7bSKevin Wolfecho 100*92b22e7bSKevin Wolf 101*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file 102*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 103*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,node-name=fmt 104*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 105*92b22e7bSKevin Wolf -blockdev driver=raw,file=file,node-name=raw \ 106*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=raw,node-name=fmt 107*92b22e7bSKevin Wolf 108*92b22e7bSKevin Wolfecho 109*92b22e7bSKevin Wolfecho "=== -blockdev with a filter on top ===" 110*92b22e7bSKevin Wolfecho 111*92b22e7bSKevin Wolf 112*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 113*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,node-name=fmt \ 114*92b22e7bSKevin Wolf -blockdev driver=copy-on-read,file=fmt,node-name=filter 115*92b22e7bSKevin Wolf 116*92b22e7bSKevin Wolfecho 117*92b22e7bSKevin Wolfecho "=== -blockdev with a backing file ===" 118*92b22e7bSKevin Wolfecho 119*92b22e7bSKevin Wolf 120*92b22e7bSKevin WolfTEST_IMG="$TEST_IMG.base" _make_test_img $size 121*92b22e7bSKevin Wolf 122*92b22e7bSKevin WolfIMGOPTS="backing_file=$TEST_IMG.base" \ 123*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 124*92b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 125*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-file,node-name=fmt 126*92b22e7bSKevin Wolf 127*92b22e7bSKevin WolfIMGOPTS="backing_file=$TEST_IMG.base" \ 128*92b22e7bSKevin Wolfrun_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 129*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=backing-file,node-name=backing-fmt \ 130*92b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 131*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-fmt,node-name=fmt 132*92b22e7bSKevin Wolf 133*92b22e7bSKevin Wolf# A snapshot should be present on the overlay, but not the backing file 134*92b22e7bSKevin Wolfecho Internal snapshots on overlay: 135*92b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG" | _filter_date | _filter_vmstate_size 136*92b22e7bSKevin Wolf 137*92b22e7bSKevin Wolfecho Internal snapshots on backing file: 138*92b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG.base" | _filter_date | _filter_vmstate_size 139*92b22e7bSKevin Wolf 140*92b22e7bSKevin Wolfecho 141*92b22e7bSKevin Wolfecho "=== -blockdev with NBD server on the backing file ===" 142*92b22e7bSKevin Wolfecho 143*92b22e7bSKevin Wolf 144*92b22e7bSKevin WolfIMGOPTS="backing_file=$TEST_IMG.base" _make_test_img $size 145*92b22e7bSKevin Wolfcat <<EOF | 146*92b22e7bSKevin Wolfnbd_server_start unix:$TEST_DIR/nbd 147*92b22e7bSKevin Wolfnbd_server_add -w backing-fmt 148*92b22e7bSKevin Wolfsavevm snap0 149*92b22e7bSKevin Wolfinfo snapshots 150*92b22e7bSKevin Wolfloadvm snap0 151*92b22e7bSKevin WolfEOF 152*92b22e7bSKevin Wolfrun_qemu -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \ 153*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=backing-file,node-name=backing-fmt \ 154*92b22e7bSKevin Wolf -blockdev driver=file,filename="$TEST_IMG",node-name=file \ 155*92b22e7bSKevin Wolf -blockdev driver=$IMGFMT,file=file,backing=backing-fmt,node-name=fmt | 156*92b22e7bSKevin Wolf _filter_date 157*92b22e7bSKevin Wolf 158*92b22e7bSKevin Wolf# This time, a snapshot should be created on both files 159*92b22e7bSKevin Wolfecho Internal snapshots on overlay: 160*92b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG" | _filter_date | _filter_vmstate_size 161*92b22e7bSKevin Wolf 162*92b22e7bSKevin Wolfecho Internal snapshots on backing file: 163*92b22e7bSKevin Wolf$QEMU_IMG snapshot -l "$TEST_IMG.base" | _filter_date | _filter_vmstate_size 164*92b22e7bSKevin Wolf 165*92b22e7bSKevin Wolf# success, all done 166*92b22e7bSKevin Wolfecho "*** done" 167*92b22e7bSKevin Wolfrm -f $seq.full 168*92b22e7bSKevin Wolfstatus=0 169