Browse Source
The common.qemu bash functions allow tests to interact with the QMP monitor of a QEMU process. I spent two days trying to update 141 when the order of the test output changed, but found it would still fail occassionally because printf() and QMP events race with synchronous QMP communication. I gave up and ported 141 to the existing Python API for QMP tests. The Python API is less affected by the order in which QEMU prints output because it does not print all QMP traffic by default. The next commit changes the order in which QMP messages are received. Make 141 reliable first. Cc: Hanna Czenczek <hreitz@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-ID: <20240118144823.1497953-3-stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>coverity
committed by
Kevin Wolf
2 changed files with 176 additions and 331 deletions
@ -1,179 +1,69 @@ |
|||
QA output created by 141 |
|||
Formatting 'TEST_DIR/b.IMGFMT', fmt=IMGFMT size=1048576 |
|||
Formatting 'TEST_DIR/m.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/b.IMGFMT backing_fmt=IMGFMT |
|||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/m.IMGFMT backing_fmt=IMGFMT |
|||
{'execute': 'qmp_capabilities'} |
|||
{"return": {}} |
|||
|
|||
Creating bottom <- middle <- top backing file chain... |
|||
Starting VM... |
|||
=== Testing drive-backup === |
|||
|
|||
{'execute': 'blockdev-add', |
|||
'arguments': { |
|||
'node-name': 'drv0', |
|||
'driver': 'IMGFMT', |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': 'TEST_DIR/t.IMGFMT' |
|||
}}} |
|||
{"return": {}} |
|||
{'execute': 'drive-backup', |
|||
'arguments': {'job-id': 'job0', |
|||
'device': 'drv0', |
|||
'target': 'TEST_DIR/o.IMGFMT', |
|||
'format': 'IMGFMT', |
|||
'sync': 'none'}} |
|||
Formatting 'TEST_DIR/o.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"execute": "blockdev-add", "arguments": {"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/PID-top"}, "node-name": "drv0"}} |
|||
{"return": {}} |
|||
{"execute": "drive-backup", "arguments": {"device": "drv0", "format": "IMGFMT", "job-id": "job0", "sync": "none", "target": "TEST_DIR/PID-target"}} |
|||
{"return": {}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is used as backing hd of 'NODE_NAME'"}} |
|||
{'execute': 'block-job-cancel', |
|||
'arguments': {'device': 'job0'}} |
|||
{"execute": "block-job-cancel", "arguments": {"device": "job0"}} |
|||
{"return": {}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 0, "speed": 0, "type": "backup"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"data": {"device": "job0", "len": 1048576, "offset": 0, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"return": {}} |
|||
|
|||
=== Testing drive-mirror === |
|||
|
|||
{'execute': 'blockdev-add', |
|||
'arguments': { |
|||
'node-name': 'drv0', |
|||
'driver': 'IMGFMT', |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': 'TEST_DIR/t.IMGFMT' |
|||
}}} |
|||
{"return": {}} |
|||
{'execute': 'drive-mirror', |
|||
'arguments': {'job-id': 'job0', |
|||
'device': 'drv0', |
|||
'target': 'TEST_DIR/o.IMGFMT', |
|||
'format': 'IMGFMT', |
|||
'sync': 'none'}} |
|||
Formatting 'TEST_DIR/o.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"execute": "blockdev-add", "arguments": {"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/PID-top"}, "node-name": "drv0"}} |
|||
{"return": {}} |
|||
{"execute": "drive-mirror", "arguments": {"device": "drv0", "format": "IMGFMT", "job-id": "job0", "sync": "none", "target": "TEST_DIR/PID-target"}} |
|||
{"return": {}} |
|||
{"data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: mirror"}} |
|||
{'execute': 'block-job-cancel', |
|||
'arguments': {'device': 'job0'}} |
|||
{"execute": "block-job-cancel", "arguments": {"device": "job0"}} |
|||
{"return": {}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"return": {}} |
|||
|
|||
=== Testing active block-commit === |
|||
|
|||
{'execute': 'blockdev-add', |
|||
'arguments': { |
|||
'node-name': 'drv0', |
|||
'driver': 'IMGFMT', |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': 'TEST_DIR/t.IMGFMT' |
|||
}}} |
|||
{"return": {}} |
|||
{'execute': 'block-commit', |
|||
'arguments': {'job-id': 'job0', 'device': 'drv0'}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"execute": "blockdev-add", "arguments": {"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/PID-top"}, "node-name": "drv0"}} |
|||
{"return": {}} |
|||
{"execute": "block-commit", "arguments": {"device": "drv0", "job-id": "job0"}} |
|||
{"return": {}} |
|||
{"data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: commit"}} |
|||
{'execute': 'block-job-cancel', |
|||
'arguments': {'device': 'job0'}} |
|||
{"execute": "block-job-cancel", "arguments": {"device": "job0"}} |
|||
{"return": {}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"return": {}} |
|||
|
|||
=== Testing non-active block-commit === |
|||
|
|||
wrote 1048576/1048576 bytes at offset 0 |
|||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
|||
{'execute': 'blockdev-add', |
|||
'arguments': { |
|||
'node-name': 'drv0', |
|||
'driver': 'IMGFMT', |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': 'TEST_DIR/t.IMGFMT' |
|||
}}} |
|||
{"return": {}} |
|||
{'execute': 'block-commit', |
|||
'arguments': {'job-id': 'job0', |
|||
'device': 'drv0', |
|||
'top': 'TEST_DIR/m.IMGFMT', |
|||
'speed': 1}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"execute": "blockdev-add", "arguments": {"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/PID-top"}, "node-name": "drv0"}} |
|||
{"return": {}} |
|||
{"execute": "block-commit", "arguments": {"device": "drv0", "job-id": "job0", "speed": 1, "top": "TEST_DIR/PID-middle"}} |
|||
{"return": {}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: commit"}} |
|||
{'execute': 'block-job-cancel', |
|||
'arguments': {'device': 'job0'}} |
|||
{"execute": "block-job-cancel", "arguments": {"device": "job0"}} |
|||
{"return": {}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "commit"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "commit"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"return": {}} |
|||
|
|||
=== Testing block-stream === |
|||
|
|||
wrote 1048576/1048576 bytes at offset 0 |
|||
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
|||
{'execute': 'blockdev-add', |
|||
'arguments': { |
|||
'node-name': 'drv0', |
|||
'driver': 'IMGFMT', |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': 'TEST_DIR/t.IMGFMT' |
|||
}}} |
|||
{"return": {}} |
|||
{'execute': 'block-stream', |
|||
'arguments': {'job-id': 'job0', |
|||
'device': 'drv0', |
|||
'speed': 1}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"execute": "blockdev-add", "arguments": {"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/PID-top"}, "node-name": "drv0"}} |
|||
{"return": {}} |
|||
{"execute": "block-stream", "arguments": {"device": "drv0", "job-id": "job0", "speed": 1}} |
|||
{"return": {}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: stream"}} |
|||
{'execute': 'block-job-cancel', |
|||
'arguments': {'device': 'job0'}} |
|||
{"execute": "block-job-cancel", "arguments": {"device": "job0"}} |
|||
{"return": {}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "stream"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}} |
|||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}} |
|||
{'execute': 'blockdev-del', |
|||
'arguments': {'node-name': 'drv0'}} |
|||
{"data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "stream"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} |
|||
{"execute": "blockdev-del", "arguments": {"node-name": "drv0"}} |
|||
{"return": {}} |
|||
*** done |
|||
|
|||
|
|||
Loading…
Reference in new issue