xref: /openbmc/qemu/tests/qemu-iotests/267 (revision 92b22e7b1789b0e5f20d245706e72eae70dbddce)
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