Blame SOURCES/kvm-iotests-Unify-log-outputs-between-Python-2-and-3.patch

4ec855
From f58a88cc157331a911eb2cf1faee6d494b0c9333 Mon Sep 17 00:00:00 2001
4ec855
From: Pino Toscano <ptoscano@redhat.com>
4ec855
Date: Mon, 8 Jul 2019 15:25:59 +0100
4ec855
Subject: [PATCH 13/39] iotests: Unify log outputs between Python 2 and 3
4ec855
MIME-Version: 1.0
4ec855
Content-Type: text/plain; charset=UTF-8
4ec855
Content-Transfer-Encoding: 8bit
4ec855
4ec855
RH-Author: Pino Toscano <ptoscano@redhat.com>
4ec855
Message-id: <20190708152601.21123-9-ptoscano@redhat.com>
4ec855
Patchwork-id: 89420
4ec855
O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v3 08/10] iotests: Unify log outputs between Python 2 and 3
4ec855
Bugzilla: 1513367
4ec855
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4ec855
RH-Acked-by: Max Reitz <mreitz@redhat.com>
4ec855
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
4ec855
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
4ec855
4ec855
From: Max Reitz <mreitz@redhat.com>
4ec855
4ec855
When dumping an object into the log, there are differences between
4ec855
Python 2 and 3.  First, unicode strings are prefixed by 'u' in Python 2
4ec855
(they are no longer in 3, because unicode strings are the default
4ec855
there).  Second, the order of keys in dicts may differ.  Third,
4ec855
especially long numbers are longs in Python 2 and thus get an 'L'
4ec855
suffix, which does not happen in Python 3.
4ec855
4ec855
We can get around all of these differences by dumping objects (lists and
4ec855
dicts) in a language-independent format, namely JSON.  The JSON
4ec855
generator even allows emitting dicts with their keys sorted
4ec855
alphabetically.
4ec855
4ec855
This changes the output of all tests that use these logging functions
4ec855
(dict keys are ordered now, strings in dicts are now enclosed in double
4ec855
quotes instead of single quotes, the 'L' suffix of large integers is
4ec855
dropped, and "true" and "false" are now in lower case).
4ec855
The quote change necessitates a small change to a filter used in test
4ec855
207.
4ec855
4ec855
Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
4ec855
Signed-off-by: Max Reitz <mreitz@redhat.com>
4ec855
Reviewed-by: Cleber Rosa <crosa@redhat.com>
4ec855
Message-Id: <20181022135307.14398-10-mreitz@redhat.com>
4ec855
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
4ec855
(cherry picked from commit e21b5f34d669b82087597273f3783626947291a0)
4ec855
Signed-off-by: Pino Toscano <ptoscano@redhat.com>
4ec855
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
4ec855
---
4ec855
 tests/qemu-iotests/194.out    |  22 +-
4ec855
 tests/qemu-iotests/202.out    |  12 +-
4ec855
 tests/qemu-iotests/203.out    |  14 +-
4ec855
 tests/qemu-iotests/206.out    | 218 ++++++++---------
4ec855
 tests/qemu-iotests/207        |   2 +-
4ec855
 tests/qemu-iotests/207.out    |  72 +++---
4ec855
 tests/qemu-iotests/208.out    |   8 +-
4ec855
 tests/qemu-iotests/210.out    |  94 ++++----
4ec855
 tests/qemu-iotests/211.out    | 102 ++++----
4ec855
 tests/qemu-iotests/212.out    | 174 +++++++-------
4ec855
 tests/qemu-iotests/213.out    | 182 +++++++--------
4ec855
 tests/qemu-iotests/216.out    |   4 +-
4ec855
 tests/qemu-iotests/218.out    |  20 +-
4ec855
 tests/qemu-iotests/219.out    | 526 +++++++++++++++++++++---------------------
4ec855
 tests/qemu-iotests/222.out    |  24 +-
4ec855
 tests/qemu-iotests/iotests.py |  10 +-
4ec855
 16 files changed, 744 insertions(+), 740 deletions(-)
4ec855
4ec855
diff --git a/tests/qemu-iotests/194.out b/tests/qemu-iotests/194.out
4ec855
index 50ac50d..7185785 100644
4ec855
--- a/tests/qemu-iotests/194.out
4ec855
+++ b/tests/qemu-iotests/194.out
4ec855
@@ -1,18 +1,18 @@
4ec855
 Launching VMs...
4ec855
 Launching NBD server on destination...
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 Starting `drive-mirror` on source...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Waiting for `drive-mirror` to complete...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror-job0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_READY'}
4ec855
+{"data": {"device": "mirror-job0", "len": 1073741824, "offset": 1073741824, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 Starting migration...
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'setup'}, u'event': u'MIGRATION'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'active'}, u'event': u'MIGRATION'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'completed'}, u'event': u'MIGRATION'}
4ec855
+{"return": {}}
4ec855
+{"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 Gracefully ending the `drive-mirror` job on source...
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror-job0', u'type': u'mirror', u'speed': 0, u'len': 1073741824, u'offset': 1073741824}, u'event': u'BLOCK_JOB_COMPLETED'}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "mirror-job0", "len": 1073741824, "offset": 1073741824, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 Stopping the NBD server on destination...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
diff --git a/tests/qemu-iotests/202.out b/tests/qemu-iotests/202.out
4ec855
index d5ea374..9a8619e 100644
4ec855
--- a/tests/qemu-iotests/202.out
4ec855
+++ b/tests/qemu-iotests/202.out
4ec855
@@ -1,11 +1,11 @@
4ec855
 Launching VM...
4ec855
 Adding IOThread...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Adding blockdevs...
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 Setting iothread...
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 Creating external snapshots...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
diff --git a/tests/qemu-iotests/203.out b/tests/qemu-iotests/203.out
4ec855
index 1a11f09..9d4abba 100644
4ec855
--- a/tests/qemu-iotests/203.out
4ec855
+++ b/tests/qemu-iotests/203.out
4ec855
@@ -1,11 +1,11 @@
4ec855
 Launching VM...
4ec855
 Setting IOThreads...
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 Enabling migration QMP events...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Starting migration...
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'setup'}, u'event': u'MIGRATION'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'active'}, u'event': u'MIGRATION'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'completed'}, u'event': u'MIGRATION'}
4ec855
+{"return": {}}
4ec855
+{"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
diff --git a/tests/qemu-iotests/206.out b/tests/qemu-iotests/206.out
4ec855
index 789eebe..91f4db5 100644
4ec855
--- a/tests/qemu-iotests/206.out
4ec855
+++ b/tests/qemu-iotests/206.out
4ec855
@@ -1,16 +1,16 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
-
4ec855
-{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'imgfile', 'size': 134217728}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
+
4ec855
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2", "node_name": "imgfile"}}
4ec855
+{"return": {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "imgfile", "size": 134217728}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -24,15 +24,15 @@ Format specific information:
4ec855
 
4ec855
 === Successful image creation (inline blockdev-add, explicit defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'nocow': False, 'preallocation': 'off', 'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2", "nocow": false, "preallocation": "off", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 65536, 'refcount-bits': 16, 'version': 'v3', 'preallocation': 'off', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}, 'lazy-refcounts': False, 'driver': 'qcow2', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 65536, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2"}, "lazy-refcounts": false, "preallocation": "off", "refcount-bits": 16, "size": 67108864, "version": "v3"}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -46,15 +46,15 @@ Format specific information:
4ec855
 
4ec855
 === Successful image creation (v3 non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'nocow': True, 'preallocation': 'falloc', 'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2", "nocow": true, "preallocation": "falloc", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 2097152, 'refcount-bits': 1, 'version': 'v3', 'preallocation': 'metadata', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}, 'lazy-refcounts': True, 'driver': 'qcow2', 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 2097152, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2"}, "lazy-refcounts": true, "preallocation": "metadata", "refcount-bits": 1, "size": 33554432, "version": "v3"}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -68,15 +68,15 @@ Format specific information:
4ec855
 
4ec855
 === Successful image creation (v2 non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 512, 'backing-fmt': 'qcow2', 'driver': 'qcow2', 'version': 'v2', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}, 'backing-file': 'TEST_DIR/PID-t.qcow2.base', 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"backing-file": "TEST_DIR/PID-t.qcow2.base", "backing-fmt": "qcow2", "cluster-size": 512, "driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2"}, "size": 33554432, "version": "v2"}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -90,10 +90,10 @@ Format specific information:
4ec855
 
4ec855
 === Successful image creation (encrypted) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'encrypt': {'key-secret': 'keysec0', 'iter-time': 10, 'cipher-mode': 'ctr', 'ivgen-hash-alg': 'md5', 'cipher-alg': 'twofish-128', 'format': 'luks', 'ivgen-alg': 'plain64', 'hash-alg': 'sha1'}, 'driver': 'qcow2', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}, 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "encrypt": {"cipher-alg": "twofish-128", "cipher-mode": "ctr", "format": "luks", "hash-alg": "sha1", "iter-time": 10, "ivgen-alg": "plain64", "ivgen-hash-alg": "md5", "key-secret": "keysec0"}, "file": {"driver": "file", "filename": "TEST_DIR/PID-t.qcow2"}, "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -144,113 +144,113 @@ Format specific information:
4ec855
 
4ec855
 === Invalid BlockdevRef ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': "this doesn't exist", 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "this doesn't exist", "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid sizes ===
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 1234}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 1234}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size must be a multiple of 512 bytes
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 18446744073709551104L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 18446744073709551104}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Could not resize image: Image size cannot be negative
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 9223372036854775808L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 9223372036854775808}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Could not resize image: Image size cannot be negative
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 9223372036854775296}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 9223372036854775296}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Could not resize image: Failed to grow the L1 table: File too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid version ===
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'version': 'v1', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter 'v1'"}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "size": 67108864, "version": "v1"}}}
4ec855
+{"error": {"class": "GenericError", "desc": "Invalid parameter 'v1'"}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'lazy-refcounts': True, 'version': 'v2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "lazy-refcounts": true, "size": 67108864, "version": "v2"}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Lazy refcounts only supported with compatibility level 1.1 and above (use version=v3 or greater)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 8, 'version': 'v2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "refcount-bits": 8, "size": 67108864, "version": "v2"}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Different refcount widths than 16 bits require compatibility level 1.1 or above (use version=v3 or greater)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid backing file options ===
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'preallocation': 'full', 'driver': 'qcow2', 'backing-file': '/dev/null', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"backing-file": "/dev/null", "driver": "qcow2", "file": "node0", "preallocation": "full", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Backing file and preallocation cannot be used at the same time
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'backing-fmt': 'qcow2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"backing-fmt": "qcow2", "driver": "qcow2", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Backing format cannot be used without backing file
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid cluster size ===
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 1234, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 1234, "driver": "qcow2", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a power of two between 512 and 2048k
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 128, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 128, "driver": "qcow2", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a power of two between 512 and 2048k
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 4194304, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 4194304, "driver": "qcow2", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a power of two between 512 and 2048k
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 0, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 0, "driver": "qcow2", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a power of two between 512 and 2048k
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 512, 'driver': 'qcow2', 'file': 'node0', 'size': 281474976710656}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 512, "driver": "qcow2", "file": "node0", "size": 281474976710656}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Could not resize image: Failed to grow the L1 table: File too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid refcount width ===
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 128, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "refcount-bits": 128, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Refcount width must be a power of two and may not exceed 64 bits
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 0, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "refcount-bits": 0, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Refcount width must be a power of two and may not exceed 64 bits
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 7, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "qcow2", "file": "node0", "refcount-bits": 7, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Refcount width must be a power of two and may not exceed 64 bits
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/207 b/tests/qemu-iotests/207
4ec855
index d45bf72..aaad656 100755
4ec855
--- a/tests/qemu-iotests/207
4ec855
+++ b/tests/qemu-iotests/207
4ec855
@@ -28,7 +28,7 @@ iotests.verify_image_format(supported_fmts=['raw'])
4ec855
 iotests.verify_protocol(supported=['ssh'])
4ec855
 
4ec855
 def filter_hash(msg):
4ec855
-    return re.sub("'hash': '[0-9a-f]+'", "'hash': HASH", msg)
4ec855
+    return re.sub('"hash": "[0-9a-f]+"', '"hash": HASH', msg)
4ec855
 
4ec855
 def blockdev_create(vm, options):
4ec855
     result = vm.qmp_log('blockdev-create', job_id='job0', options=options,
4ec855
diff --git a/tests/qemu-iotests/207.out b/tests/qemu-iotests/207.out
4ec855
index fc131a6..789b465 100644
4ec855
--- a/tests/qemu-iotests/207.out
4ec855
+++ b/tests/qemu-iotests/207.out
4ec855
@@ -1,9 +1,9 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 4194304}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -16,49 +16,49 @@ virtual size: 4.0M (4194304 bytes)
4ec855
 
4ec855
 === Test host-key-check options ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'none'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 8388608}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"mode": "none"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 8388608}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
 virtual size: 8.0M (8388608 bytes)
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'known_hosts'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"mode": "known_hosts"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 4194304}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
 virtual size: 4.0M (4194304 bytes)
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': 'wrong', 'type': 'md5', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 2097152}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"hash": "wrong", "mode": "hash", "type": "md5"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 2097152}}}
4ec855
+{"return": {}}
4ec855
 Job failed: remote host key does not match host_key_check 'wrong'
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': HASH, 'type': 'md5', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 8388608}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"hash": HASH, "mode": "hash", "type": "md5"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 8388608}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
 virtual size: 8.0M (8388608 bytes)
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': 'wrong', 'type': 'sha1', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 2097152}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"hash": "wrong", "mode": "hash", "type": "sha1"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 2097152}}}
4ec855
+{"return": {}}
4ec855
 Job failed: remote host key does not match host_key_check 'wrong'
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': HASH, 'type': 'sha1', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"hash": HASH, "mode": "hash", "type": "sha1"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 4194304}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -66,15 +66,15 @@ virtual size: 4.0M (4194304 bytes)
4ec855
 
4ec855
 === Invalid path and user ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': '/this/is/not/an/existing/path', 'host-key-check': {'mode': 'none'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"mode": "none"}, "path": "/this/is/not/an/existing/path", "server": {"host": "127.0.0.1", "port": "22"}}, "size": 4194304}}}
4ec855
+{"return": {}}
4ec855
 Job failed: failed to open remote file '/this/is/not/an/existing/path': Failed opening remote file (libssh2 error code: -31)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'none'}, 'user': 'invalid user', 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "ssh", "location": {"host-key-check": {"mode": "none"}, "path": "TEST_DIR/PID-t.img", "server": {"host": "127.0.0.1", "port": "22"}, "user": "invalid user"}, "size": 4194304}}}
4ec855
+{"return": {}}
4ec855
 Job failed: failed to authenticate using publickey authentication and the identities held by your ssh-agent
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/208.out b/tests/qemu-iotests/208.out
4ec855
index 3687e9d..9ff2582 100644
4ec855
--- a/tests/qemu-iotests/208.out
4ec855
+++ b/tests/qemu-iotests/208.out
4ec855
@@ -1,9 +1,9 @@
4ec855
 Launching VM...
4ec855
 Starting NBD server...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Adding NBD export...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Creating external snapshot...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
 Stopping NBD server...
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
diff --git a/tests/qemu-iotests/210.out b/tests/qemu-iotests/210.out
4ec855
index 078ba54..923cb05 100644
4ec855
--- a/tests/qemu-iotests/210.out
4ec855
+++ b/tests/qemu-iotests/210.out
4ec855
@@ -1,16 +1,16 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
-
4ec855
-{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'iter-time': 10, 'driver': 'luks', 'file': 'imgfile', 'size': 134217728}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.luks", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
+
4ec855
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-t.luks", "node_name": "imgfile"}}
4ec855
+{"return": {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "imgfile", "iter-time": 10, "key-secret": "keysec0", "size": 134217728}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
4ec855
 file format: IMGFMT
4ec855
@@ -54,15 +54,15 @@ Format specific information:
4ec855
 
4ec855
 === Successful image creation (with non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.luks", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'hash-alg': 'sha1', 'cipher-mode': 'ctr', 'cipher-alg': 'twofish-128', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}, 'iter-time': 10, 'ivgen-alg': 'plain64', 'ivgen-hash-alg': 'md5', 'driver': 'luks', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cipher-alg": "twofish-128", "cipher-mode": "ctr", "driver": "luks", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.luks"}, "hash-alg": "sha1", "iter-time": 10, "ivgen-alg": "plain64", "ivgen-hash-alg": "md5", "key-secret": "keysec0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
4ec855
 file format: IMGFMT
4ec855
@@ -106,18 +106,18 @@ Format specific information:
4ec855
 
4ec855
 === Invalid BlockdevRef ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'luks', 'file': "this doesn't exist", 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "this doesn't exist", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Zero size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'iter-time': 10, 'driver': 'luks', 'file': 'node0', 'size': 0}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "node0", "iter-time": 10, "key-secret": "keysec0", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
4ec855
 file format: IMGFMT
4ec855
@@ -161,34 +161,34 @@ Format specific information:
4ec855
 
4ec855
 === Invalid sizes ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 18446744073709551104L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "node0", "key-secret": "keysec0", "size": 18446744073709551104}}}
4ec855
+{"return": {}}
4ec855
 Job failed: The requested file size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 9223372036854775808L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "node0", "key-secret": "keysec0", "size": 9223372036854775808}}}
4ec855
+{"return": {}}
4ec855
 Job failed: The requested file size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 9223372036854775296}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "luks", "file": "node0", "key-secret": "keysec0", "size": 9223372036854775296}}}
4ec855
+{"return": {}}
4ec855
 Job failed: The requested file size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Resize image with invalid sizes ===
4ec855
 
4ec855
-{'execute': 'block_resize', 'arguments': {'size': 9223372036854775296, 'node_name': 'node1'}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u'The requested file size is too large'}}
4ec855
-{'execute': 'block_resize', 'arguments': {'size': 9223372036854775808L, 'node_name': 'node1'}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter type for 'size', expected: integer"}}
4ec855
-{'execute': 'block_resize', 'arguments': {'size': 18446744073709551104L, 'node_name': 'node1'}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter type for 'size', expected: integer"}}
4ec855
-{'execute': 'block_resize', 'arguments': {'size': -9223372036854775808, 'node_name': 'node1'}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Parameter 'size' expects a >0 size"}}
4ec855
+{"execute": "block_resize", "arguments": {"node_name": "node1", "size": 9223372036854775296}}
4ec855
+{"error": {"class": "GenericError", "desc": "The requested file size is too large"}}
4ec855
+{"execute": "block_resize", "arguments": {"node_name": "node1", "size": 9223372036854775808}}
4ec855
+{"error": {"class": "GenericError", "desc": "Invalid parameter type for 'size', expected: integer"}}
4ec855
+{"execute": "block_resize", "arguments": {"node_name": "node1", "size": 18446744073709551104}}
4ec855
+{"error": {"class": "GenericError", "desc": "Invalid parameter type for 'size', expected: integer"}}
4ec855
+{"execute": "block_resize", "arguments": {"node_name": "node1", "size": -9223372036854775808}}
4ec855
+{"error": {"class": "GenericError", "desc": "Parameter 'size' expects a >0 size"}}
4ec855
 image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
4ec855
 file format: IMGFMT
4ec855
 virtual size: 0 (0 bytes)
4ec855
diff --git a/tests/qemu-iotests/211.out b/tests/qemu-iotests/211.out
4ec855
index 6feaea3..eebb0ea 100644
4ec855
--- a/tests/qemu-iotests/211.out
4ec855
+++ b/tests/qemu-iotests/211.out
4ec855
@@ -1,16 +1,16 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
-
4ec855
-{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'imgfile', 'size': 134217728}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
+
4ec855
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi", "node_name": "imgfile"}}
4ec855
+{"return": {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "imgfile", "size": 134217728}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -21,15 +21,15 @@ cluster_size: 1048576
4ec855
 
4ec855
 === Successful image creation (explicit defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'preallocation': 'off', 'driver': 'vdi', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}, 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi"}, "preallocation": "off", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -40,15 +40,15 @@ cluster_size: 1048576
4ec855
 
4ec855
 === Successful image creation (with non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'preallocation': 'metadata', 'driver': 'vdi', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.vdi'}, 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.vdi"}, "preallocation": "metadata", "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -60,18 +60,18 @@ cluster_size: 1048576
4ec855
 
4ec855
 === Invalid BlockdevRef ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': "this doesn't exist", 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "this doesn't exist", "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Zero size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'node0', 'size': 0}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "node0", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -80,10 +80,10 @@ cluster_size: 1048576
4ec855
 
4ec855
 === Maximum size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'node0', 'size': 562949819203584}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "node0", "size": 562949819203584}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -92,21 +92,21 @@ cluster_size: 1048576
4ec855
 
4ec855
 === Invalid sizes ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'node0', 'size': 18446744073709551104L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "node0", "size": 18446744073709551104}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Unsupported VDI image size (size is 0xfffffffffffffe00, max supported is 0x1fffff8000000)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'node0', 'size': 9223372036854775808L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "node0", "size": 9223372036854775808}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Unsupported VDI image size (size is 0x8000000000000000, max supported is 0x1fffff8000000)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vdi', 'file': 'node0', 'size': 562949819203585}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vdi", "file": "node0", "size": 562949819203585}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Unsupported VDI image size (size is 0x1fffff8000001, max supported is 0x1fffff8000000)
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/212.out b/tests/qemu-iotests/212.out
4ec855
index 9150da7..01da467 100644
4ec855
--- a/tests/qemu-iotests/212.out
4ec855
+++ b/tests/qemu-iotests/212.out
4ec855
@@ -1,16 +1,16 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
-
4ec855
-{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'imgfile', 'size': 134217728}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
+
4ec855
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels", "node_name": "imgfile"}}
4ec855
+{"return": {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "imgfile", "size": 134217728}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -18,15 +18,15 @@ virtual size: 128M (134217728 bytes)
4ec855
 
4ec855
 === Successful image creation (explicit defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 1048576, 'driver': 'parallels', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}, 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 1048576, "driver": "parallels", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels"}, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -34,15 +34,15 @@ virtual size: 64M (67108864 bytes)
4ec855
 
4ec855
 === Successful image creation (with non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 65536, 'driver': 'parallels', 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.parallels'}, 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 65536, "driver": "parallels", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.parallels"}, "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -50,18 +50,18 @@ virtual size: 32M (33554432 bytes)
4ec855
 
4ec855
 === Invalid BlockdevRef ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': "this doesn't exist", 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "this doesn't exist", "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Zero size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 0}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -69,10 +69,10 @@ virtual size: 0 (0 bytes)
4ec855
 
4ec855
 === Maximum size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 4503599627369984}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 4503599627369984}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -80,77 +80,77 @@ virtual size: 4096T (4503599627369984 bytes)
4ec855
 
4ec855
 === Invalid sizes ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 1234}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 1234}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size must be a multiple of 512 bytes
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 18446744073709551104L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 18446744073709551104}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 9223372036854775808L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 9223372036854775808}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 9223372036854775296}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 9223372036854775296}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'parallels', 'file': 'node0', 'size': 4503599627370497}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "parallels", "file": "node0", "size": 4503599627370497}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid cluster size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 1234, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 1234, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a multiple of 512 bytes
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 128, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 128, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size must be a multiple of 512 bytes
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 4294967296, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 4294967296, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 9223372036854775808L, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 9223372036854775808, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 18446744073709551104L, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 18446744073709551104, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cluster size is too large
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 0, 'driver': 'parallels', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 0, "driver": "parallels", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 512, 'driver': 'parallels', 'file': 'node0', 'size': 281474976710656}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"cluster-size": 512, "driver": "parallels", "file": "node0", "size": 281474976710656}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size is too large for this cluster size
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/213.out b/tests/qemu-iotests/213.out
4ec855
index e1dcd47..0c9d65b 100644
4ec855
--- a/tests/qemu-iotests/213.out
4ec855
+++ b/tests/qemu-iotests/213.out
4ec855
@@ -1,16 +1,16 @@
4ec855
 === Successful image creation (defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
-
4ec855
-{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'imgfile', 'size': 134217728}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
+
4ec855
+{"execute": "blockdev-add", "arguments": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx", "node_name": "imgfile"}}
4ec855
+{"return": {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "imgfile", "size": 134217728}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -19,15 +19,15 @@ cluster_size: 8388608
4ec855
 
4ec855
 === Successful image creation (explicit defaults) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'block-size': 8388608, 'driver': 'vhdx', 'subformat': 'dynamic', 'log-size': 1048576, 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}, 'block-state-zero': True, 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 8388608, "block-state-zero": true, "driver": "vhdx", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx"}, "log-size": 1048576, "size": 67108864, "subformat": "dynamic"}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -36,15 +36,15 @@ cluster_size: 8388608
4ec855
 
4ec855
 === Successful image creation (with non-default options) ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'block-size': 268435456, 'driver': 'vhdx', 'subformat': 'fixed', 'log-size': 8388608, 'file': {'driver': 'file', 'filename': 'TEST_DIR/PID-t.vhdx'}, 'block-state-zero': False, 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 268435456, "block-state-zero": false, "driver": "vhdx", "file": {"driver": "file", "filename": "TEST_DIR/PID-t.vhdx"}, "log-size": 8388608, "size": 33554432, "subformat": "fixed"}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -53,18 +53,18 @@ cluster_size: 268435456
4ec855
 
4ec855
 === Invalid BlockdevRef ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': "this doesn't exist", 'size': 33554432}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "this doesn't exist", "size": 33554432}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Zero size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 0}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 0}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -73,10 +73,10 @@ cluster_size: 8388608
4ec855
 
4ec855
 === Maximum size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 70368744177664}}}
4ec855
-{u'return': {}}
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 70368744177664}}}
4ec855
+{"return": {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 image: TEST_IMG
4ec855
 file format: IMGFMT
4ec855
@@ -85,85 +85,85 @@ cluster_size: 67108864
4ec855
 
4ec855
 === Invalid sizes ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 18446744073709551104L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 18446744073709551104}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size too large; max of 64TB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 9223372036854775808L}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 9223372036854775808}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size too large; max of 64TB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 9223372036854775296}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 9223372036854775296}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size too large; max of 64TB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'file': 'node0', 'size': 70368744177665}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "size": 70368744177665}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Image size too large; max of 64TB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid block size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'block-size': 1234567, 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 1234567, "driver": "vhdx", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Block size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'block-size': 128, 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 128, "driver": "vhdx", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Block size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'block-size': 3145728, 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 3145728, "driver": "vhdx", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Block size must be a power of two
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'block-size': 536870912, 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 536870912, "driver": "vhdx", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Block size must not exceed 268435456
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'vhdx', 'block-size': 0, 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"block-size": 0, "driver": "vhdx", "file": "node0", "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Block size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 === Invalid log size ===
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'log-size': 1234567, 'driver': 'vhdx', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "log-size": 1234567, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Log size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'log-size': 128, 'driver': 'vhdx', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "log-size": 128, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Log size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'log-size': 4294967296, 'driver': 'vhdx', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "log-size": 4294967296, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Log size must be smaller than 4 GB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
-{'execute': 'blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'log-size': 0, 'driver': 'vhdx', 'file': 'node0', 'size': 67108864}}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "blockdev-create", "arguments": {"job_id": "job0", "options": {"driver": "vhdx", "file": "node0", "log-size": 0, "size": 67108864}}}
4ec855
+{"return": {}}
4ec855
 Job failed: Log size must be a multiple of 1 MB
4ec855
-{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
4ec855
-{u'return': {}}
4ec855
+{"execute": "job-dismiss", "arguments": {"id": "job0"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/216.out b/tests/qemu-iotests/216.out
4ec855
index 45ea857..a70aa5c 100644
4ec855
--- a/tests/qemu-iotests/216.out
4ec855
+++ b/tests/qemu-iotests/216.out
4ec855
@@ -7,8 +7,8 @@ Done
4ec855
 
4ec855
 --- Doing COR ---
4ec855
 
4ec855
-{u'return': {}}
4ec855
-{u'return': u''}
4ec855
+{"return": {}}
4ec855
+{"return": ""}
4ec855
 
4ec855
 --- Checking COR result ---
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/218.out b/tests/qemu-iotests/218.out
4ec855
index 7dbf78e..825a657 100644
4ec855
--- a/tests/qemu-iotests/218.out
4ec855
+++ b/tests/qemu-iotests/218.out
4ec855
@@ -4,27 +4,27 @@
4ec855
 --- force=false ---
4ec855
 
4ec855
 Cancelling job
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 65536, u'len': 1048576, u'offset': 65536}, u'event': u'BLOCK_JOB_CANCELLED'}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 65536, "speed": 65536, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 --- force=true ---
4ec855
 
4ec855
 Cancelling job
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 65536, u'len': 1048576, u'offset': 65536}, u'event': u'BLOCK_JOB_CANCELLED'}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 65536, "speed": 65536, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 === Cancel mirror job after convergence ===
4ec855
 
4ec855
 --- force=false ---
4ec855
 
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 0, u'len': 1048576, u'offset': 1048576}, u'event': u'BLOCK_JOB_READY'}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 1048576, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 Cancelling job
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 0, u'len': 1048576, u'offset': 1048576}, u'event': u'BLOCK_JOB_COMPLETED'}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 1048576, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 --- force=true ---
4ec855
 
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 0, u'len': 1048576, u'offset': 1048576}, u'event': u'BLOCK_JOB_READY'}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 1048576, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 Cancelling job
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'mirror', u'type': u'mirror', u'speed': 0, u'len': 1048576, u'offset': 1048576}, u'event': u'BLOCK_JOB_CANCELLED'}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "mirror", "len": 1048576, "offset": 1048576, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
diff --git a/tests/qemu-iotests/219.out b/tests/qemu-iotests/219.out
4ec855
index 6dc07bc..8ebd3fe 100644
4ec855
--- a/tests/qemu-iotests/219.out
4ec855
+++ b/tests/qemu-iotests/219.out
4ec855
@@ -2,326 +2,326 @@ Launching VM...
4ec855
 
4ec855
 
4ec855
 Starting block job: drive-mirror (auto-finalize: True; auto-dismiss: True)
4ec855
-{u'return': {}}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 'FILTERED', u'total-progress': 'FILTERED', u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
+{"return": {}}
4ec855
+{"return": [{"current-progress": "FILTERED", "id": "job0", "status": "running", "total-progress": "FILTERED", "type": "mirror"}]}
4ec855
+{"data": {"id": "job0", "status": "created"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 Pause/resume in RUNNING
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 65536, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "running", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "running", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "running", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 327680, "id": "job0", "status": "running", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for READY state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"data": {"id": "job0", "status": "ready"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "ready", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 
4ec855
 Pause/resume in READY
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "standby"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "standby", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "ready"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "ready", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "standby"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "standby", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "ready"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "ready", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "standby"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "standby", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "ready"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "ready", "total-progress": 4194304, "type": "mirror"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "standby"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "standby", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "ready"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "ready", "total-progress": 4194304, "type": "mirror"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for PENDING state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': []}
4ec855
+{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "null"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": []}
4ec855
 
4ec855
 
4ec855
 Starting block job: drive-backup (auto-finalize: True; auto-dismiss: True)
4ec855
-{u'return': {}}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 'FILTERED', u'total-progress': 'FILTERED', u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
+{"return": {}}
4ec855
+{"return": [{"current-progress": "FILTERED", "id": "job0", "status": "running", "total-progress": "FILTERED", "type": "backup"}]}
4ec855
+{"data": {"id": "job0", "status": "created"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 Pause/resume in RUNNING
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 65536, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 327680, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for PENDING state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': []}
4ec855
+{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "null"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": []}
4ec855
 
4ec855
 
4ec855
 Starting block job: drive-backup (auto-finalize: True; auto-dismiss: False)
4ec855
-{u'return': {}}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 'FILTERED', u'total-progress': 'FILTERED', u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
+{"return": {}}
4ec855
+{"return": [{"current-progress": "FILTERED", "id": "job0", "status": "running", "total-progress": "FILTERED", "type": "backup"}]}
4ec855
+{"data": {"id": "job0", "status": "created"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 Pause/resume in RUNNING
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 65536, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 327680, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for PENDING state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'concluded', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': []}
4ec855
+{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "concluded", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "null"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": []}
4ec855
 
4ec855
 
4ec855
 Starting block job: drive-backup (auto-finalize: False; auto-dismiss: True)
4ec855
-{u'return': {}}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 'FILTERED', u'total-progress': 'FILTERED', u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
+{"return": {}}
4ec855
+{"return": [{"current-progress": "FILTERED", "id": "job0", "status": "running", "total-progress": "FILTERED", "type": "backup"}]}
4ec855
+{"data": {"id": "job0", "status": "created"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 Pause/resume in RUNNING
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 65536, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 327680, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for PENDING state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'pending', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': []}
4ec855
+{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "pending", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "null"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": []}
4ec855
 
4ec855
 
4ec855
 Starting block job: drive-backup (auto-finalize: False; auto-dismiss: False)
4ec855
-{u'return': {}}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 'FILTERED', u'total-progress': 'FILTERED', u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
+{"return": {}}
4ec855
+{"return": [{"current-progress": "FILTERED", "id": "job0", "status": "running", "total-progress": "FILTERED", "type": "backup"}]}
4ec855
+{"data": {"id": "job0", "status": "created"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
 
4ec855
 Pause/resume in RUNNING
4ec855
 === Testing block-job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 65536, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing block-job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 131072, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/block-job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 196608, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
 === Testing job-pause/job-resume ===
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 262144, "id": "job0", "status": "paused", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 327680, "id": "job0", "status": "running", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 Waiting for PENDING state...
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'pending', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': [{u'status': u'concluded', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
-{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
4ec855
-{u'return': []}
4ec855
+{"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "pending", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": [{"current-progress": 4194304, "id": "job0", "status": "concluded", "total-progress": 4194304, "type": "backup"}]}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
4ec855
+{"error": {"class": "GenericError", "desc": "Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
4ec855
+{"return": {}}
4ec855
+{"data": {"id": "job0", "status": "null"}, "event": "JOB_STATUS_CHANGE", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": []}
4ec855
diff --git a/tests/qemu-iotests/222.out b/tests/qemu-iotests/222.out
4ec855
index 48f336a..16643dd 100644
4ec855
--- a/tests/qemu-iotests/222.out
4ec855
+++ b/tests/qemu-iotests/222.out
4ec855
@@ -8,13 +8,13 @@ Done
4ec855
 
4ec855
 --- Setting up Fleecing Graph ---
4ec855
 
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 --- Setting up NBD Export ---
4ec855
 
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 --- Sanity Check ---
4ec855
 
4ec855
@@ -29,13 +29,13 @@ read -P0 0x3fe0000 64k
4ec855
 --- Testing COW ---
4ec855
 
4ec855
 write -P0xab 0 64k
4ec855
-{u'return': u''}
4ec855
+{"return": ""}
4ec855
 write -P0xad 0x00f8000 64k
4ec855
-{u'return': u''}
4ec855
+{"return": ""}
4ec855
 write -P0x1d 0x2008000 64k
4ec855
-{u'return': u''}
4ec855
+{"return": ""}
4ec855
 write -P0xea 0x3fe0000 64k
4ec855
-{u'return': u''}
4ec855
+{"return": ""}
4ec855
 
4ec855
 --- Verifying Data ---
4ec855
 
4ec855
@@ -49,10 +49,10 @@ read -P0 0x3fe0000 64k
4ec855
 
4ec855
 --- Cleanup ---
4ec855
 
4ec855
-{u'return': {}}
4ec855
-{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'device': u'drive0', u'type': u'backup', u'speed': 0, u'len': 67108864, u'offset': 393216}, u'event': u'BLOCK_JOB_CANCELLED'}
4ec855
-{u'return': {}}
4ec855
-{u'return': {}}
4ec855
+{"return": {}}
4ec855
+{"data": {"device": "drive0", "len": 67108864, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4ec855
+{"return": {}}
4ec855
+{"return": {}}
4ec855
 
4ec855
 --- Confirming writes ---
4ec855
 
4ec855
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
4ec855
index 3d41ff0..b548e2f 100644
4ec855
--- a/tests/qemu-iotests/iotests.py
4ec855
+++ b/tests/qemu-iotests/iotests.py
4ec855
@@ -252,7 +252,10 @@ def filter_img_info(output, filename):
4ec855
 def log(msg, filters=[]):
4ec855
     for flt in filters:
4ec855
         msg = flt(msg)
4ec855
-    print(msg)
4ec855
+    if type(msg) is dict or type(msg) is list:
4ec855
+        print(json.dumps(msg, sort_keys=True))
4ec855
+    else:
4ec855
+        print(msg)
4ec855
 
4ec855
 class Timeout:
4ec855
     def __init__(self, seconds, errmsg = "Timeout"):
4ec855
@@ -440,10 +443,11 @@ class VM(qtest.QEMUQtestMachine):
4ec855
         return result
4ec855
 
4ec855
     def qmp_log(self, cmd, filters=[filter_testfiles], **kwargs):
4ec855
-        logmsg = "{'execute': '%s', 'arguments': %s}" % (cmd, kwargs)
4ec855
+        logmsg = '{"execute": "%s", "arguments": %s}' % \
4ec855
+            (cmd, json.dumps(kwargs, sort_keys=True))
4ec855
         log(logmsg, filters)
4ec855
         result = self.qmp(cmd, **kwargs)
4ec855
-        log(str(result), filters)
4ec855
+        log(json.dumps(result, sort_keys=True), filters)
4ec855
         return result
4ec855
 
4ec855
     def run_job(self, job, auto_finalize=True, auto_dismiss=False):
4ec855
-- 
4ec855
1.8.3.1
4ec855