osdep: protect qemu/osdep.h with extern "C"
[qemu/ar7.git] / tests / qemu-iotests / 085
blobd557522943db367465159206a4443372bd7094db
1 #!/usr/bin/env bash
2 # group: rw
4 # Live snapshot tests
6 # This tests live snapshots of images on a running QEMU instance, using
7 # QMP commands. Both single disk snapshots, and transactional group
8 # snapshots are performed.
10 # Copyright (C) 2014 Red Hat, Inc.
11 # Copyright (C) 2015 Igalia, S.L.
13 # This program is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation; either version 2 of the License, or
16 # (at your option) any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
27 # creator
28 owner=jcody@redhat.com
30 seq=`basename $0`
31 echo "QA output created by $seq"
33 status=1 # failure is the default!
35 snapshot_virt0="snapshot-v0.qcow2"
36 snapshot_virt1="snapshot-v1.qcow2"
38 SNAPSHOTS=10
40 _cleanup()
42 _cleanup_qemu
43 _cleanup_test_img
44 for i in $(seq 1 ${SNAPSHOTS})
46 _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt0}"
47 _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt1}"
48 done
49 for img in "${TEST_IMG}".{1,2,base}
51 _rm_test_img "$img"
52 done
55 trap "_cleanup; exit \$status" 0 1 2 3 15
57 # get standard environment, filters and checks
58 . ./common.rc
59 . ./common.filter
60 . ./common.qemu
62 _supported_fmt qcow2
63 _supported_proto file
66 # ${1}: unique identifier for the snapshot filename
67 create_single_snapshot()
69 cmd="{ 'execute': 'blockdev-snapshot-sync',
70 'arguments': { 'device': 'virtio0',
71 'snapshot-file':'${TEST_DIR}/${1}-${snapshot_virt0}',
72 'format': 'qcow2' } }"
73 _send_qemu_cmd $h "${cmd}" "return"
76 # ${1}: unique identifier for the snapshot filename
77 create_group_snapshot()
79 cmd="{ 'execute': 'transaction', 'arguments':
80 {'actions': [
81 { 'type': 'blockdev-snapshot-sync', 'data' :
82 { 'device': 'virtio0',
83 'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt0}' } },
84 { 'type': 'blockdev-snapshot-sync', 'data' :
85 { 'device': 'virtio1',
86 'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt1}' } } ]
87 } }"
89 _send_qemu_cmd $h "${cmd}" "return"
92 # ${1}: unique identifier for the snapshot filename
93 # ${2}: extra_params to the blockdev-add command
94 # ${3}: filename
95 do_blockdev_add()
97 cmd="{ 'execute': 'blockdev-add', 'arguments':
98 { 'driver': 'qcow2', 'node-name': 'snap_${1}', ${2}
99 'file':
100 { 'driver': 'file', 'filename': '${3}',
101 'node-name': 'file_${1}' } } }"
102 _send_qemu_cmd $h "${cmd}" "return"
105 # ${1}: unique identifier for the snapshot filename
106 add_snapshot_image()
108 base_image="${TEST_DIR}/$((${1}-1))-${snapshot_virt0}"
109 snapshot_file="${TEST_DIR}/${1}-${snapshot_virt0}"
110 TEST_IMG=$snapshot_file _make_test_img -u -b "${base_image}" -F $IMGFMT "$size"
111 do_blockdev_add "$1" "'backing': null, " "${snapshot_file}"
114 # ${1}: unique identifier for the snapshot filename
115 # ${2}: expected response, defaults to 'return'
116 blockdev_snapshot()
118 cmd="{ 'execute': 'blockdev-snapshot',
119 'arguments': { 'node': 'virtio0',
120 'overlay':'snap_${1}' } }"
121 _send_qemu_cmd $h "${cmd}" "${2:-return}"
124 size=128M
126 TEST_IMG="$TEST_IMG.1" _make_test_img $size
127 TEST_IMG="$TEST_IMG.2" _make_test_img $size
129 echo
130 echo === Running QEMU ===
131 echo
133 qemu_comm_method="qmp"
134 _launch_qemu -drive file="${TEST_IMG}.1",if=virtio -drive file="${TEST_IMG}.2",if=virtio
135 h=$QEMU_HANDLE
137 echo
138 echo === Sending capabilities ===
139 echo
141 _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
143 # Tests for the blockdev-snapshot-sync command
145 echo
146 echo === Create a single snapshot on virtio0 ===
147 echo
149 create_single_snapshot 1
152 echo
153 echo === Invalid command - missing device and nodename ===
154 echo
156 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
157 'arguments': { 'snapshot-file':'${TEST_DIR}/1-${snapshot_virt0}',
158 'format': 'qcow2' } }" "error"
160 echo
161 echo === Invalid command - missing snapshot-file ===
162 echo
164 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
165 'arguments': { 'device': 'virtio0',
166 'format': 'qcow2' } }" "error"
167 echo
168 echo
169 echo === Create several transactional group snapshots ===
170 echo
172 for i in $(seq 2 ${SNAPSHOTS})
174 create_group_snapshot ${i}
175 done
177 # Tests for the blockdev-snapshot command
179 echo
180 echo === Create a couple of snapshots using blockdev-snapshot ===
181 echo
183 SNAPSHOTS=$((${SNAPSHOTS}+1))
184 add_snapshot_image ${SNAPSHOTS}
185 blockdev_snapshot ${SNAPSHOTS}
187 SNAPSHOTS=$((${SNAPSHOTS}+1))
188 add_snapshot_image ${SNAPSHOTS}
189 blockdev_snapshot ${SNAPSHOTS}
191 echo
192 echo === Invalid command - cannot create a snapshot using a file BDS ===
193 echo
195 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
196 'arguments': { 'node':'virtio0',
197 'overlay':'file_${SNAPSHOTS}' }
198 }" "error"
200 echo
201 echo === Invalid command - snapshot node used as active layer ===
202 echo
204 blockdev_snapshot ${SNAPSHOTS} error
206 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
207 'arguments': { 'node':'virtio0',
208 'overlay':'virtio0' }
209 }" "error"
211 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
212 'arguments': { 'node':'virtio0',
213 'overlay':'virtio1' }
214 }" "error"
216 echo
217 echo === Invalid command - snapshot node used as backing hd ===
218 echo
220 blockdev_snapshot $((${SNAPSHOTS}-1)) error
222 echo
223 echo === Invalid command - snapshot node has a backing image ===
224 echo
226 SNAPSHOTS=$((${SNAPSHOTS}+1))
228 TEST_IMG="$TEST_IMG.base" _make_test_img "$size"
229 _make_test_img -b "${TEST_IMG}.base" -F $IMGFMT "$size"
230 do_blockdev_add ${SNAPSHOTS} "" "${TEST_IMG}"
231 blockdev_snapshot ${SNAPSHOTS} error
233 echo
234 echo === Invalid command - The node does not exist ===
235 echo
237 blockdev_snapshot $((${SNAPSHOTS}+1)) error
239 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
240 'arguments': { 'node':'nodevice',
241 'overlay':'snap_${SNAPSHOTS}' }
242 }" "error"
244 # success, all done
245 echo "*** done"
246 rm -f $seq.full
247 status=0