yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

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

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