iotests: Fix cleanup path in some tests
[qemu.git] / tests / qemu-iotests / 085
1 #!/usr/bin/env bash
2 #
3 # Live snapshot tests
4 #
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.
8 #
9 # Copyright (C) 2014 Red Hat, Inc.
10 # Copyright (C) 2015 Igalia, S.L.
11 #
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.
16 #
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.
21 #
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/>.
24 #
25
26 # creator
27 owner=jcody@redhat.com
28
29 seq=`basename $0`
30 echo "QA output created by $seq"
31
32 status=1        # failure is the default!
33
34 snapshot_virt0="snapshot-v0.qcow2"
35 snapshot_virt1="snapshot-v1.qcow2"
36
37 SNAPSHOTS=10
38
39 _cleanup()
40 {
41     _cleanup_qemu
42     _cleanup_test_img
43     for i in $(seq 1 ${SNAPSHOTS})
44     do
45         _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt0}"
46         _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt1}"
47     done
48     for img in "${TEST_IMG}".{1,2,base}
49     do
50         _rm_test_img "$img"
51     done
52
53 }
54 trap "_cleanup; exit \$status" 0 1 2 3 15
55
56 # get standard environment, filters and checks
57 . ./common.rc
58 . ./common.filter
59 . ./common.qemu
60
61 _supported_fmt qcow2
62 _supported_proto file
63
64
65 # ${1}: unique identifier for the snapshot filename
66 create_single_snapshot()
67 {
68     cmd="{ 'execute': 'blockdev-snapshot-sync',
69                       'arguments': { 'device': 'virtio0',
70                                      'snapshot-file':'${TEST_DIR}/${1}-${snapshot_virt0}',
71                                      'format': 'qcow2' } }"
72     _send_qemu_cmd $h "${cmd}" "return"
73 }
74
75 # ${1}: unique identifier for the snapshot filename
76 create_group_snapshot()
77 {
78     cmd="{ 'execute': 'transaction', 'arguments':
79            {'actions': [
80                { 'type': 'blockdev-snapshot-sync', 'data' :
81                    { 'device': 'virtio0',
82                       'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt0}' } },
83                { 'type': 'blockdev-snapshot-sync', 'data' :
84                    { 'device': 'virtio1',
85                        'snapshot-file': '${TEST_DIR}/${1}-${snapshot_virt1}' } } ]
86              } }"
87
88     _send_qemu_cmd $h "${cmd}" "return"
89 }
90
91 # ${1}: unique identifier for the snapshot filename
92 # ${2}: extra_params to the blockdev-add command
93 # ${3}: filename
94 do_blockdev_add()
95 {
96     cmd="{ 'execute': 'blockdev-add', 'arguments':
97            { 'driver': 'qcow2', 'node-name': 'snap_${1}', ${2}
98              'file':
99              { 'driver': 'file', 'filename': '${3}',
100                'node-name': 'file_${1}' } } }"
101     _send_qemu_cmd $h "${cmd}" "return"
102 }
103
104 # ${1}: unique identifier for the snapshot filename
105 add_snapshot_image()
106 {
107     base_image="${TEST_DIR}/$((${1}-1))-${snapshot_virt0}"
108     snapshot_file="${TEST_DIR}/${1}-${snapshot_virt0}"
109     TEST_IMG=$snapshot_file _make_test_img -u -b "${base_image}" "$size"
110     do_blockdev_add "$1" "'backing': null, " "${snapshot_file}"
111 }
112
113 # ${1}: unique identifier for the snapshot filename
114 # ${2}: expected response, defaults to 'return'
115 blockdev_snapshot()
116 {
117     cmd="{ 'execute': 'blockdev-snapshot',
118                       'arguments': { 'node': 'virtio0',
119                                      'overlay':'snap_${1}' } }"
120     _send_qemu_cmd $h "${cmd}" "${2:-return}"
121 }
122
123 size=128M
124
125 TEST_IMG="$TEST_IMG.1" _make_test_img $size
126 TEST_IMG="$TEST_IMG.2" _make_test_img $size
127
128 echo
129 echo === Running QEMU ===
130 echo
131
132 qemu_comm_method="qmp"
133 _launch_qemu -drive file="${TEST_IMG}.1",if=virtio -drive file="${TEST_IMG}.2",if=virtio
134 h=$QEMU_HANDLE
135
136 echo
137 echo === Sending capabilities ===
138 echo
139
140 _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
141
142 # Tests for the blockdev-snapshot-sync command
143
144 echo
145 echo === Create a single snapshot on virtio0 ===
146 echo
147
148 create_single_snapshot 1
149
150
151 echo
152 echo === Invalid command - missing device and nodename ===
153 echo
154
155 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
156                          'arguments': { 'snapshot-file':'${TEST_DIR}/1-${snapshot_virt0}',
157                                      'format': 'qcow2' } }" "error"
158
159 echo
160 echo === Invalid command - missing snapshot-file ===
161 echo
162
163 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
164                          'arguments': { 'device': 'virtio0',
165                                      'format': 'qcow2' } }" "error"
166 echo
167 echo
168 echo === Create several transactional group snapshots ===
169 echo
170
171 for i in $(seq 2 ${SNAPSHOTS})
172 do
173     create_group_snapshot ${i}
174 done
175
176 # Tests for the blockdev-snapshot command
177
178 echo
179 echo === Create a couple of snapshots using blockdev-snapshot ===
180 echo
181
182 SNAPSHOTS=$((${SNAPSHOTS}+1))
183 add_snapshot_image ${SNAPSHOTS}
184 blockdev_snapshot ${SNAPSHOTS}
185
186 SNAPSHOTS=$((${SNAPSHOTS}+1))
187 add_snapshot_image ${SNAPSHOTS}
188 blockdev_snapshot ${SNAPSHOTS}
189
190 echo
191 echo === Invalid command - cannot create a snapshot using a file BDS ===
192 echo
193
194 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
195                      'arguments': { 'node':'virtio0',
196                                     'overlay':'file_${SNAPSHOTS}' }
197                    }" "error"
198
199 echo
200 echo === Invalid command - snapshot node used as active layer ===
201 echo
202
203 blockdev_snapshot ${SNAPSHOTS} error
204
205 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
206                      'arguments': { 'node':'virtio0',
207                                     'overlay':'virtio0' }
208                    }" "error"
209
210 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
211                      'arguments': { 'node':'virtio0',
212                                     'overlay':'virtio1' }
213                    }" "error"
214
215 echo
216 echo === Invalid command - snapshot node used as backing hd ===
217 echo
218
219 blockdev_snapshot $((${SNAPSHOTS}-1)) error
220
221 echo
222 echo === Invalid command - snapshot node has a backing image ===
223 echo
224
225 SNAPSHOTS=$((${SNAPSHOTS}+1))
226
227 TEST_IMG="$TEST_IMG.base" _make_test_img "$size"
228 _make_test_img -b "${TEST_IMG}.base" "$size"
229 do_blockdev_add ${SNAPSHOTS} "" "${TEST_IMG}"
230 blockdev_snapshot ${SNAPSHOTS} error
231
232 echo
233 echo === Invalid command - The node does not exist ===
234 echo
235
236 blockdev_snapshot $((${SNAPSHOTS}+1)) error
237
238 _send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot',
239                      'arguments': { 'node':'nodevice',
240                                     'overlay':'snap_${SNAPSHOTS}' }
241                    }" "error"
242
243 # success, all done
244 echo "*** done"
245 rm -f $seq.full
246 status=0