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