docs: rstfy vfio-ap documentation
[qemu/ar7.git] / tests / qemu-iotests / 085
blob46981dbb64aef1d58a8a94e286930702769d88cb
1 #!/usr/bin/env bash
3 # Live snapshot tests
5 # This tests live snapshots of images on a running QEMU instance, using
6 # QMP commands. Both single disk snapshots, and transactional group
7 # snapshots are performed.
9 # Copyright (C) 2014 Red Hat, Inc.
10 # Copyright (C) 2015 Igalia, S.L.
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2 of the License, or
15 # (at your option) any later version.
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 # creator
27 owner=jcody@redhat.com
29 seq=`basename $0`
30 echo "QA output created by $seq"
32 status=1 # failure is the default!
34 snapshot_virt0="snapshot-v0.qcow2"
35 snapshot_virt1="snapshot-v1.qcow2"
37 SNAPSHOTS=10
39 _cleanup()
41 _cleanup_qemu
42 for i in $(seq 1 ${SNAPSHOTS})
44 _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt0}"
45 _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt1}"
46 done
47 for img in "${TEST_IMG}".{1,2,base}
49 _rm_test_img "$img"
50 done
53 trap "_cleanup; exit \$status" 0 1 2 3 15
55 # get standard environment, filters and checks
56 . ./common.rc
57 . ./common.filter
58 . ./common.qemu
60 _supported_fmt qcow2
61 _supported_proto file
64 # ${1}: unique identifier for the snapshot filename
65 create_single_snapshot()
67 cmd="{ 'execute': 'blockdev-snapshot-sync',
68 'arguments': { 'device': 'virtio0',
69 'snapshot-file':'${TEST_DIR}/${1}-${snapshot_virt0}',
70 'format': 'qcow2' } }"
71 _send_qemu_cmd $h "${cmd}" "return"
74 # ${1}: unique identifier for the snapshot filename
75 create_group_snapshot()
77 cmd="{ 'execute': 'transaction', 'arguments':
78 {'actions': [
79 { 'type': 'blockdev-snapshot-sync', 'data' :
80 { 'device': 'virtio0',
81 'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt0}' } },
82 { 'type': 'blockdev-snapshot-sync', 'data' :
83 { 'device': 'virtio1',
84 'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt1}' } } ]
85 } }"
87 _send_qemu_cmd $h "${cmd}" "return"
90 # ${1}: unique identifier for the snapshot filename
91 # ${2}: extra_params to the blockdev-add command
92 # ${3}: filename
93 do_blockdev_add()
95 cmd="{ 'execute': 'blockdev-add', 'arguments':
96 { 'driver': 'qcow2', 'node-name': 'snap_${1}', ${2}
97 'file':
98 { 'driver': 'file', 'filename': '${3}',
99 'node-name': 'file_${1}' } } }"
100 _send_qemu_cmd $h "${cmd}" "return"
103 # ${1}: unique identifier for the snapshot filename
104 add_snapshot_image()
106 base_image="${TEST_DIR}/$((${1}-1))-${snapshot_virt0}"
107 snapshot_file="${TEST_DIR}/${1}-${snapshot_virt0}"
108 TEST_IMG=$snapshot_file _make_test_img -u -b "${base_image}" "$size"
109 do_blockdev_add "$1" "'backing': null, " "${snapshot_file}"
112 # ${1}: unique identifier for the snapshot filename
113 # ${2}: expected response, defaults to 'return'
114 blockdev_snapshot()
116 cmd="{ 'execute': 'blockdev-snapshot',
117 'arguments': { 'node': 'virtio0',
118 'overlay':'snap_${1}' } }"
119 _send_qemu_cmd $h "${cmd}" "${2:-return}"
122 size=128M
124 TEST_IMG="$TEST_IMG.1" _make_test_img $size
125 TEST_IMG="$TEST_IMG.2" _make_test_img $size
127 echo
128 echo === Running QEMU ===
129 echo
131 qemu_comm_method="qmp"
132 _launch_qemu -drive file="${TEST_IMG}.1",if=virtio -drive file="${TEST_IMG}.2",if=virtio
133 h=$QEMU_HANDLE
135 echo
136 echo === Sending capabilities ===
137 echo
139 _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
141 # Tests for the blockdev-snapshot-sync command
143 echo
144 echo === Create a single snapshot on virtio0 ===
145 echo
147 create_single_snapshot 1
150 echo
151 echo === Invalid command - missing device and nodename ===
152 echo
154 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
155 'arguments': { 'snapshot-file':'${TEST_DIR}/1-${snapshot_virt0}',
156 'format': 'qcow2' } }" "error"
158 echo
159 echo === Invalid command - missing snapshot-file ===
160 echo
162 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
163 'arguments': { 'device': 'virtio0',
164 'format': 'qcow2' } }" "error"
165 echo
166 echo
167 echo === Create several transactional group snapshots ===
168 echo
170 for i in $(seq 2 ${SNAPSHOTS})
172 create_group_snapshot ${i}
173 done
175 # Tests for the blockdev-snapshot command
177 echo
178 echo === Create a couple of snapshots using blockdev-snapshot ===
179 echo
181 SNAPSHOTS=$((${SNAPSHOTS}+1))
182 add_snapshot_image ${SNAPSHOTS}
183 blockdev_snapshot ${SNAPSHOTS}
185 SNAPSHOTS=$((${SNAPSHOTS}+1))
186 add_snapshot_image ${SNAPSHOTS}
187 blockdev_snapshot ${SNAPSHOTS}
189 echo
190 echo === Invalid command - cannot create a snapshot using a file BDS ===
191 echo
193 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
194 'arguments': { 'node':'virtio0',
195 'overlay':'file_${SNAPSHOTS}' }
196 }" "error"
198 echo
199 echo === Invalid command - snapshot node used as active layer ===
200 echo
202 blockdev_snapshot ${SNAPSHOTS} error
204 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
205 'arguments': { 'node':'virtio0',
206 'overlay':'virtio0' }
207 }" "error"
209 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
210 'arguments': { 'node':'virtio0',
211 'overlay':'virtio1' }
212 }" "error"
214 echo
215 echo === Invalid command - snapshot node used as backing hd ===
216 echo
218 blockdev_snapshot $((${SNAPSHOTS}-1)) error
220 echo
221 echo === Invalid command - snapshot node has a backing image ===
222 echo
224 SNAPSHOTS=$((${SNAPSHOTS}+1))
226 TEST_IMG="$TEST_IMG.base" _make_test_img "$size"
227 _make_test_img -b "${TEST_IMG}.base" "$size"
228 do_blockdev_add ${SNAPSHOTS} "" "${TEST_IMG}"
229 blockdev_snapshot ${SNAPSHOTS} error
231 echo
232 echo === Invalid command - The node does not exist ===
233 echo
235 blockdev_snapshot $((${SNAPSHOTS}+1)) error
237 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
238 'arguments': { 'node':'nodevice',
239 'overlay':'snap_${SNAPSHOTS}' }
240 }" "error"
242 # success, all done
243 echo "*** done"
244 rm -f $seq.full
245 status=0