Convert tests 181 and 192 from HMP monitor commands to QMP:
- Remove qemu_comm_method="monitor" and add qmp_capabilities
negotiation.
- Replace HMP commands (qemu-io, migrate_set_capability,
migrate_set_parameter, migrate, info migrate, nbd_server_start,
nbd_server_add, quit) with their QMP equivalents (x-qemu-io,
migrate-set-capabilities, migrate-set-parameters, migrate,
query-migrate, nbd-server-start, nbd-server-add, quit).
Unlike human-monitor-command which wraps errors inside
{"return": "Error: ..."}, x-qemu-io returns errors as a proper QMP
{"error": ...} response. Match 'return\|error' on x-qemu-io calls so
the test terminates on both success and failure, rather than hanging
until timeout. Apply the same fix to test 249.
Remove the HMP output drain idiom (send empty command, wait for
prompt) after query-migrate polling in test 181. In QMP, an empty line
produces no response, so this would hang.
Capture the RESUME event delivered on the destination QMP channel after
postcopy migration completes. This event was not visible in HMP mode.
Update expected output for all three tests.
Signed-off-by: Marc-André Lureau <[email protected]>
---
tests/qemu-iotests/181 | 99 ++++++++++++++++++++++++++++++++++------------
tests/qemu-iotests/181.out | 36 ++++++++++++-----
tests/qemu-iotests/192 | 22 +++++++++--
tests/qemu-iotests/192.out | 17 ++++++--
tests/qemu-iotests/249 | 6 +--
5 files changed, 134 insertions(+), 46 deletions(-)
diff --git a/tests/qemu-iotests/181 b/tests/qemu-iotests/181
index dc90a10757f..3de24090c68 100755
--- a/tests/qemu-iotests/181
+++ b/tests/qemu-iotests/181
@@ -55,8 +55,6 @@ echo
echo === Starting VMs ===
echo
-qemu_comm_method="monitor"
-
if [ "$IMGOPTSSYNTAX" = "true" ]; then
_launch_qemu \
-drive "${TEST_IMG}",cache=${CACHEMODE},aio=$AIOMODE,id=disk
@@ -77,15 +75,30 @@ else
fi
dest=$QEMU_HANDLE
+_send_qemu_cmd $src \
+ "{ 'execute': 'qmp_capabilities' }" \
+ 'return'
+
+_send_qemu_cmd $dest \
+ "{ 'execute': 'qmp_capabilities' }" \
+ 'return'
+
echo
echo === Write something on the source ===
echo
silent=
-_send_qemu_cmd $src 'qemu-io disk "write -P 0x55 0 64k"' "(qemu)"
-_send_qemu_cmd $src "" "ops/sec"
-_send_qemu_cmd $src 'qemu-io disk "read -P 0x55 0 64k"' "(qemu)"
-_send_qemu_cmd $src "" "ops/sec"
+_send_qemu_cmd $src \
+ "{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'write -P 0x55 0 64k' } }" \
+ 'return\|error'
+
+_send_qemu_cmd $src \
+ "{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'read -P 0x55 0 64k' } }" \
+ 'return\|error'
echo
echo === Do postcopy migration to destination ===
@@ -95,28 +108,49 @@ echo
# switch to postcopy
# Enable postcopy-ram capability both on source and destination
silent=yes
-_send_qemu_cmd $dest 'migrate_set_capability postcopy-ram on' "(qemu)"
-
qemu_error_no_exit=yes success_or_failure=yes \
- _send_qemu_cmd $dest '' "(qemu)" "Postcopy is not supported"
-if [ ${QEMU_STATUS[$dest]} -lt 0 ]; then
- _send_qemu_cmd $dest '' "(qemu)"
+ _send_qemu_cmd $dest \
+ "{ 'execute': 'migrate-set-capabilities',
+ 'arguments': { 'capabilities': [
+ { 'capability': 'postcopy-ram', 'state': true } ] } }" \
+ 'return' 'error'
- _send_qemu_cmd $src 'quit' ""
- _send_qemu_cmd $dest 'quit' ""
+if [ ${QEMU_STATUS[$dest]} -lt 0 ]; then
+ _send_qemu_cmd $src \
+ "{ 'execute': 'quit' }" \
+ 'return'
+ _send_qemu_cmd $dest \
+ "{ 'execute': 'quit' }" \
+ 'return'
wait=1 _cleanup_qemu
_notrun 'Postcopy is not supported'
fi
-_send_qemu_cmd $src 'migrate_set_parameter max-bandwidth 4k' "(qemu)"
-_send_qemu_cmd $src 'migrate_set_capability postcopy-ram on' "(qemu)"
-_send_qemu_cmd $src "migrate -d unix:${MIG_SOCKET}" "(qemu)"
-_send_qemu_cmd $src 'migrate_start_postcopy' "(qemu)"
+_send_qemu_cmd $src \
+ "{ 'execute': 'migrate-set-parameters',
+ 'arguments': { 'max-bandwidth': 4096 } }" \
+ 'return'
+
+_send_qemu_cmd $src \
+ "{ 'execute': 'migrate-set-capabilities',
+ 'arguments': { 'capabilities': [
+ { 'capability': 'postcopy-ram', 'state': true } ] } }" \
+ 'return'
+
+_send_qemu_cmd $src \
+ "{ 'execute': 'migrate',
+ 'arguments': { 'uri': 'unix:${MIG_SOCKET}' } }" \
+ 'return'
+
+_send_qemu_cmd $src \
+ "{ 'execute': 'migrate-start-postcopy' }" \
+ 'return'
QEMU_COMM_TIMEOUT=1 qemu_cmd_repeat=10 silent=yes \
- _send_qemu_cmd $src "info migrate" "completed\|failed"
-silent=yes _send_qemu_cmd $src "" "(qemu)"
+ _send_qemu_cmd $src \
+ "{ 'execute': 'query-migrate' }" \
+ "completed\|failed"
echo
echo === Do some I/O on the destination ===
@@ -126,17 +160,32 @@ echo
# of the node name, which would create a new BlockBackend and not test whether
# the guest has the necessary permissions to access the image now
silent=
-_send_qemu_cmd $dest 'qemu-io disk "read -P 0x55 0 64k"' "(qemu)"
-_send_qemu_cmd $dest "" "ops/sec"
-_send_qemu_cmd $dest 'qemu-io disk "write -P 0x66 1M 64k"' "(qemu)"
-_send_qemu_cmd $dest "" "ops/sec"
+capture_events="RESUME"
+_send_qemu_cmd $dest \
+ "{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'read -P 0x55 0 64k' } }" \
+ 'return\|error'
+capture_events=
+
+_send_qemu_cmd $dest \
+ "{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'write -P 0x66 1M 64k' } }" \
+ 'return\|error'
echo
echo === Shut down and check image ===
echo
-_send_qemu_cmd $src 'quit' ""
-_send_qemu_cmd $dest 'quit' ""
+_send_qemu_cmd $src \
+ "{ 'execute': 'quit' }" \
+ 'return'
+
+_send_qemu_cmd $dest \
+ "{ 'execute': 'quit' }" \
+ 'return'
+
wait=1 _cleanup_qemu
_check_test_img
diff --git a/tests/qemu-iotests/181.out b/tests/qemu-iotests/181.out
index d58c6a9dabb..ddcce564699 100644
--- a/tests/qemu-iotests/181.out
+++ b/tests/qemu-iotests/181.out
@@ -3,35 +3,51 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
=== Starting VMs ===
+{ 'execute': 'qmp_capabilities' }
+{"return": {}}
+{ 'execute': 'qmp_capabilities' }
+{"return": {}}
=== Write something on the source ===
-QEMU X.Y.Z monitor - type 'help' for more information
-(qemu) qemu-io disk "write -P 0x55 0 64k"
+{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'write -P 0x55 0 64k' } }
wrote 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-(qemu)
-(qemu) qemu-io disk "read -P 0x55 0 64k"
+{"return": {}}
+{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'read -P 0x55 0 64k' } }
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+{"return": {}}
=== Do postcopy migration to destination ===
=== Do some I/O on the destination ===
-(qemu) qemu-io disk "read -P 0x55 0 64k"
+{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'read -P 0x55 0 64k' } }
read 65536/65536 bytes at offset 0
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-(qemu)
-(qemu) qemu-io disk "write -P 0x66 1M 64k"
+{"return": {}}
+{ 'execute': 'x-qemu-io',
+ 'arguments': { 'device': 'disk',
+ 'command': 'write -P 0x66 1M 64k' } }
wrote 65536/65536 bytes at offset 1048576
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+{"return": {}}
=== Shut down and check image ===
-(qemu) quit
-(qemu)
-(qemu) quit
+{ 'execute': 'quit' }
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event":
"SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
+{"return": {}}
+{ 'execute': 'quit' }
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event":
"SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
+{"return": {}}
No errors were found on the image.
*** done
diff --git a/tests/qemu-iotests/192 b/tests/qemu-iotests/192
index e66e1a4f06a..ea89cffe107 100755
--- a/tests/qemu-iotests/192
+++ b/tests/qemu-iotests/192
@@ -58,7 +58,6 @@ else
DRIVE_ARG=if=ide,id=drive0,format=$IMGFMT,file=$TEST_IMG
fi
-qemu_comm_method="monitor"
_launch_qemu -drive $DRIVE_ARG -incoming defer
h=$QEMU_HANDLE
if [ "${VALGRIND_QEMU}" == "y" ]; then
@@ -67,9 +66,24 @@ else
QEMU_COMM_TIMEOUT=1
fi
-_send_qemu_cmd $h "nbd_server_start unix:$SOCK_DIR/nbd" "(qemu)"
-_send_qemu_cmd $h "nbd_server_add -w drive0" "(qemu)"
-_send_qemu_cmd $h "q" "(qemu)"
+_send_qemu_cmd $h \
+ "{ 'execute': 'qmp_capabilities' }" \
+ 'return'
+
+_send_qemu_cmd $h \
+ "{ 'execute': 'nbd-server-start',
+ 'arguments': { 'addr': { 'type': 'unix',
+ 'data': { 'path': '$SOCK_DIR/nbd' } } } }" \
+ 'return'
+
+_send_qemu_cmd $h \
+ "{ 'execute': 'nbd-server-add',
+ 'arguments': { 'device': 'drive0', 'writable': true } }" \
+ 'return'
+
+_send_qemu_cmd $h \
+ "{ 'execute': 'quit' }" \
+ 'return'
# success, all done
echo "*** done"
diff --git a/tests/qemu-iotests/192.out b/tests/qemu-iotests/192.out
index b9429dbe367..88185a2e8ff 100644
--- a/tests/qemu-iotests/192.out
+++ b/tests/qemu-iotests/192.out
@@ -1,7 +1,16 @@
QA output created by 192
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
-QEMU X.Y.Z monitor - type 'help' for more information
-(qemu) nbd_server_start unix:SOCK_DIR/nbd
-(qemu) nbd_server_add -w drive0
-(qemu) q
+{ 'execute': 'qmp_capabilities' }
+{"return": {}}
+{ 'execute': 'nbd-server-start',
+ 'arguments': { 'addr': { 'type': 'unix',
+ 'data': { 'path': 'SOCK_DIR/nbd' } } } }
+{"return": {}}
+{ 'execute': 'nbd-server-add',
+ 'arguments': { 'device': 'drive0', 'writable': true } }
+{"return": {}}
+{ 'execute': 'quit' }
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event":
"SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event":
"BLOCK_EXPORT_DELETED", "data": {"id": "drive0"}}
+{"return": {}}
*** done
diff --git a/tests/qemu-iotests/249 b/tests/qemu-iotests/249
index 16cf6c2d8c4..d30a2ac6bc8 100755
--- a/tests/qemu-iotests/249
+++ b/tests/qemu-iotests/249
@@ -69,7 +69,7 @@ echo
_send_qemu_cmd $QEMU_HANDLE \
"{ 'execute': 'x-qemu-io',
'arguments': {'device': 'none0', 'command': 'aio_write 0 2k'}}" \
- 'return'
+ 'return\|error'
echo
echo '=== Run block-commit on base using an invalid filter node name'
@@ -86,7 +86,7 @@ echo
_send_qemu_cmd $QEMU_HANDLE \
"{ 'execute': 'x-qemu-io',
'arguments': {'device': 'none0', 'command': 'aio_write 0 2k'}}" \
- 'return'
+ 'return\|error'
echo
echo '=== Run block-commit on base using the default filter node name'
@@ -106,7 +106,7 @@ echo
_send_qemu_cmd $QEMU_HANDLE \
"{ 'execute': 'x-qemu-io',
'arguments': {'device': 'none0', 'command': 'aio_write 0 2k'}}" \
- 'return'
+ 'return\|error'
_cleanup_qemu
--
2.54.0