Skip to content

Commit a9b4339

Browse files
committed
qemu-iotests: Check autodel behaviour for device_del
Block devices creates with -drive and drive_add should automatically disappear if the guest device is unplugged. blockdev-add ones shouldn't. Signed-off-by: Kevin Wolf <[email protected]> Reviewed-by: Max Reitz <[email protected]> Reviewed-by: Eric Blake <[email protected]>
1 parent 4f8a066 commit a9b4339

File tree

4 files changed

+222
-0
lines changed

4 files changed

+222
-0
lines changed

tests/qemu-iotests/067

+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#!/bin/bash
2+
#
3+
# Test automatic deletion of BDSes created by -drive/drive_add
4+
#
5+
# Copyright (C) 2013 Red Hat, Inc.
6+
#
7+
# This program is free software; you can redistribute it and/or modify
8+
# it under the terms of the GNU General Public License as published by
9+
# the Free Software Foundation; either version 2 of the License, or
10+
# (at your option) any later version.
11+
#
12+
# This program is distributed in the hope that it will be useful,
13+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
# GNU General Public License for more details.
16+
#
17+
# You should have received a copy of the GNU General Public License
18+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
#
20+
21+
# creator
22+
23+
24+
seq=`basename $0`
25+
echo "QA output created by $seq"
26+
27+
here=`pwd`
28+
tmp=/tmp/$$
29+
status=1 # failure is the default!
30+
31+
# get standard environment, filters and checks
32+
. ./common.rc
33+
. ./common.filter
34+
35+
_supported_fmt qcow2
36+
_supported_proto file
37+
_supported_os Linux
38+
39+
function do_run_qemu()
40+
{
41+
echo Testing: "$@"
42+
$QEMU -nographic -qmp stdio -serial none "$@"
43+
echo
44+
}
45+
46+
function run_qemu()
47+
{
48+
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp
49+
}
50+
51+
size=128M
52+
53+
_make_test_img $size
54+
55+
echo
56+
echo === -drive/-device and device_del ===
57+
echo
58+
59+
run_qemu -drive file=$TEST_IMG,format=$IMGFMT,if=none,id=disk -device virtio-blk-pci,drive=disk,id=virtio0 <<EOF
60+
{ "execute": "qmp_capabilities" }
61+
{ "execute": "query-block" }
62+
{ "execute": "device_del", "arguments": { "id": "virtio0" } }
63+
{ "execute": "system_reset" }
64+
{ "execute": "query-block" }
65+
{ "execute": "quit" }
66+
EOF
67+
68+
echo
69+
echo === -drive/device_add and device_del ===
70+
echo
71+
72+
run_qemu -drive file=$TEST_IMG,format=$IMGFMT,if=none,id=disk <<EOF
73+
{ "execute": "qmp_capabilities" }
74+
{ "execute": "query-block" }
75+
{ "execute": "device_add",
76+
"arguments": { "driver": "virtio-blk-pci", "drive": "disk",
77+
"id": "virtio0" } }
78+
{ "execute": "device_del", "arguments": { "id": "virtio0" } }
79+
{ "execute": "system_reset" }
80+
{ "execute": "query-block" }
81+
{ "execute": "quit" }
82+
EOF
83+
84+
echo
85+
echo === drive_add/device_add and device_del ===
86+
echo
87+
88+
run_qemu <<EOF
89+
{ "execute": "qmp_capabilities" }
90+
{ "execute": "human-monitor-command",
91+
"arguments": { "command-line": "drive_add 0 file=$TEST_IMG,format=$IMGFMT,if=none,id=disk" } }
92+
{ "execute": "query-block" }
93+
{ "execute": "device_add",
94+
"arguments": { "driver": "virtio-blk-pci", "drive": "disk",
95+
"id": "virtio0" } }
96+
{ "execute": "device_del", "arguments": { "id": "virtio0" } }
97+
{ "execute": "system_reset" }
98+
{ "execute": "query-block" }
99+
{ "execute": "quit" }
100+
EOF
101+
102+
echo
103+
echo === blockdev_add/device_add and device_del ===
104+
echo
105+
106+
run_qemu <<EOF
107+
{ "execute": "qmp_capabilities" }
108+
{ "execute": "blockdev-add",
109+
"arguments": {
110+
"options": {
111+
"driver": "$IMGFMT",
112+
"id": "disk",
113+
"file": {
114+
"driver": "file",
115+
"filename": "$TEST_IMG"
116+
}
117+
}
118+
}
119+
}
120+
{ "execute": "query-block" }
121+
{ "execute": "device_add",
122+
"arguments": { "driver": "virtio-blk-pci", "drive": "disk",
123+
"id": "virtio0" } }
124+
{ "execute": "device_del", "arguments": { "id": "virtio0" } }
125+
{ "execute": "system_reset" }
126+
{ "execute": "query-block" }
127+
{ "execute": "quit" }
128+
EOF
129+
130+
# success, all done
131+
echo "*** done"
132+
rm -f $seq.full
133+
status=0

tests/qemu-iotests/067.out

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
QA output created by 067
2+
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
3+
4+
=== -drive/-device and device_del ===
5+
6+
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,if=none,id=disk -device virtio-blk-pci,drive=disk,id=virtio0
7+
QMP_VERSION
8+
{"return": {}}
9+
{"return": [{"io-status": "ok", "device": "disk", "locked": false, "removable": false, "inserted": {"iops_rd": 0, "image": {"virtual-size": 134217728, "filename": "TEST_DIR/t.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 139264, "format-specific": {"type": "qcow2", "data": {"compat": "1.1", "lazy-refcounts": false}}, "dirty-flag": false}, "iops_wr": 0, "ro": false, "backing_file_depth": 0, "drv": "qcow2", "iops": 0, "bps_wr": 0, "encrypted": false, "bps": 0, "bps_rd": 0, "file": "TEST_DIR/t.qcow2", "encryption_key_missing": false}, "type": "unknown"}, {"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}]}
10+
{"return": {}}
11+
{"return": {}}
12+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"path": "/machine/peripheral/virtio0/virtio-backend"}}
13+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"device": "virtio0", "path": "/machine/peripheral/virtio0"}}
14+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESET"}
15+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}]}
16+
{"return": {}}
17+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
18+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
19+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
20+
21+
22+
=== -drive/device_add and device_del ===
23+
24+
Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,if=none,id=disk
25+
QMP_VERSION
26+
{"return": {}}
27+
{"return": [{"device": "disk", "locked": false, "removable": true, "inserted": {"iops_rd": 0, "image": {"virtual-size": 134217728, "filename": "TEST_DIR/t.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 139264, "format-specific": {"type": "qcow2", "data": {"compat": "1.1", "lazy-refcounts": false}}, "dirty-flag": false}, "iops_wr": 0, "ro": false, "backing_file_depth": 0, "drv": "qcow2", "iops": 0, "bps_wr": 0, "encrypted": false, "bps": 0, "bps_rd": 0, "file": "TEST_DIR/t.qcow2", "encryption_key_missing": false}, "tray_open": false, "type": "unknown"}, {"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}]}
28+
{"return": {}}
29+
{"return": {}}
30+
{"return": {}}
31+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"path": "/machine/peripheral/virtio0/virtio-backend"}}
32+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"device": "virtio0", "path": "/machine/peripheral/virtio0"}}
33+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESET"}
34+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}]}
35+
{"return": {}}
36+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
37+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
38+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
39+
40+
41+
=== drive_add/device_add and device_del ===
42+
43+
Testing:
44+
QMP_VERSION
45+
{"return": {}}
46+
{"return": "OK\r\n"}
47+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "disk", "locked": false, "removable": true, "inserted": {"iops_rd": 0, "image": {"virtual-size": 134217728, "filename": "TEST_DIR/t.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 139264, "format-specific": {"type": "qcow2", "data": {"compat": "1.1", "lazy-refcounts": false}}, "dirty-flag": false}, "iops_wr": 0, "ro": false, "backing_file_depth": 0, "drv": "qcow2", "iops": 0, "bps_wr": 0, "encrypted": false, "bps": 0, "bps_rd": 0, "file": "TEST_DIR/t.qcow2", "encryption_key_missing": false}, "tray_open": false, "type": "unknown"}]}
48+
{"return": {}}
49+
{"return": {}}
50+
{"return": {}}
51+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"path": "/machine/peripheral/virtio0/virtio-backend"}}
52+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"device": "virtio0", "path": "/machine/peripheral/virtio0"}}
53+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESET"}
54+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}]}
55+
{"return": {}}
56+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
57+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
58+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
59+
60+
61+
=== blockdev_add/device_add and device_del ===
62+
63+
Testing:
64+
QMP_VERSION
65+
{"return": {}}
66+
{"return": {}}
67+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "disk", "locked": false, "removable": true, "inserted": {"iops_rd": 0, "image": {"virtual-size": 134217728, "filename": "TEST_DIR/t.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 139264, "format-specific": {"type": "qcow2", "data": {"compat": "1.1", "lazy-refcounts": false}}, "dirty-flag": false}, "iops_wr": 0, "ro": false, "backing_file_depth": 0, "drv": "qcow2", "iops": 0, "bps_wr": 0, "encrypted": false, "bps": 0, "bps_rd": 0, "file": "TEST_DIR/t.qcow2", "encryption_key_missing": false}, "tray_open": false, "type": "unknown"}]}
68+
{"return": {}}
69+
{"return": {}}
70+
{"return": {}}
71+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"path": "/machine/peripheral/virtio0/virtio-backend"}}
72+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_DELETED", "data": {"device": "virtio0", "path": "/machine/peripheral/virtio0"}}
73+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESET"}
74+
{"return": [{"io-status": "ok", "device": "ide1-cd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "floppy0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"device": "sd0", "locked": false, "removable": true, "tray_open": false, "type": "unknown"}, {"io-status": "ok", "device": "disk", "locked": false, "removable": true, "inserted": {"iops_rd": 0, "image": {"virtual-size": 134217728, "filename": "TEST_DIR/t.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 139264, "format-specific": {"type": "qcow2", "data": {"compat": "1.1", "lazy-refcounts": false}}, "dirty-flag": false}, "iops_wr": 0, "ro": false, "backing_file_depth": 0, "drv": "qcow2", "iops": 0, "bps_wr": 0, "encrypted": false, "bps": 0, "bps_rd": 0, "file": "TEST_DIR/t.qcow2", "encryption_key_missing": false}, "tray_open": false, "type": "unknown"}]}
75+
{"return": {}}
76+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN"}
77+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}}
78+
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "floppy0", "tray-open": true}}
79+
80+
*** done

tests/qemu-iotests/common.filter

+8
Original file line numberDiff line numberDiff line change
@@ -159,5 +159,13 @@ _filter_qemu()
159159
-e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#'
160160
}
161161

162+
# replace problematic QMP output like timestamps
163+
_filter_qmp()
164+
{
165+
_filter_win32 | \
166+
sed -e 's#\("\(micro\)\?seconds": \)[0-9]\+#\1 TIMESTAMP#g' \
167+
-e 's#^{"QMP":.*}$#QMP_VERSION#'
168+
}
169+
162170
# make sure this script returns success
163171
/bin/true

tests/qemu-iotests/group

+1
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@
7272
064 rw auto
7373
065 rw auto
7474
066 rw auto
75+
067 rw auto

0 commit comments

Comments
 (0)