Blame SOURCES/kvm-qemu-iotests-Test-job-with-block-jobs.patch

1bdc94
From 5649220e08e99f848e013f1e0b432d6d2fc706fc Mon Sep 17 00:00:00 2001
1bdc94
From: Kevin Wolf <kwolf@redhat.com>
1bdc94
Date: Tue, 26 Jun 2018 09:48:36 +0200
1bdc94
Subject: [PATCH 67/89] qemu-iotests: Test job-* with block jobs
1bdc94
1bdc94
RH-Author: Kevin Wolf <kwolf@redhat.com>
1bdc94
Message-id: <20180626094856.6924-54-kwolf@redhat.com>
1bdc94
Patchwork-id: 81101
1bdc94
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 53/73] qemu-iotests: Test job-* with block jobs
1bdc94
Bugzilla: 1513543
1bdc94
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
1bdc94
RH-Acked-by: Max Reitz <mreitz@redhat.com>
1bdc94
RH-Acked-by: Fam Zheng <famz@redhat.com>
1bdc94
1bdc94
This adds a test case that tests the new job-* QMP commands with
1bdc94
mirror and backup block jobs.
1bdc94
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
(cherry picked from commit bdebdc712b06ba82e103d617c335830682cde242)
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 tests/qemu-iotests/219     | 209 +++++++++++++++++++++++++++++
1bdc94
 tests/qemu-iotests/219.out | 327 +++++++++++++++++++++++++++++++++++++++++++++
1bdc94
 tests/qemu-iotests/group   |   1 +
1bdc94
 3 files changed, 537 insertions(+)
1bdc94
 create mode 100755 tests/qemu-iotests/219
1bdc94
 create mode 100644 tests/qemu-iotests/219.out
1bdc94
1bdc94
diff --git a/tests/qemu-iotests/219 b/tests/qemu-iotests/219
1bdc94
new file mode 100755
1bdc94
index 0000000..898a26e
1bdc94
--- /dev/null
1bdc94
+++ b/tests/qemu-iotests/219
1bdc94
@@ -0,0 +1,209 @@
1bdc94
+#!/usr/bin/env python
1bdc94
+#
1bdc94
+# Copyright (C) 2018 Red Hat, Inc.
1bdc94
+#
1bdc94
+# This program is free software; you can redistribute it and/or modify
1bdc94
+# it under the terms of the GNU General Public License as published by
1bdc94
+# the Free Software Foundation; either version 2 of the License, or
1bdc94
+# (at your option) any later version.
1bdc94
+#
1bdc94
+# This program is distributed in the hope that it will be useful,
1bdc94
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1bdc94
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1bdc94
+# GNU General Public License for more details.
1bdc94
+#
1bdc94
+# You should have received a copy of the GNU General Public License
1bdc94
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
1bdc94
+#
1bdc94
+# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
1bdc94
+#
1bdc94
+# Check using the job-* QMP commands with block jobs
1bdc94
+
1bdc94
+import iotests
1bdc94
+
1bdc94
+iotests.verify_image_format(supported_fmts=['qcow2'])
1bdc94
+
1bdc94
+def pause_wait(vm, job_id):
1bdc94
+    with iotests.Timeout(3, "Timeout waiting for job to pause"):
1bdc94
+        while True:
1bdc94
+            result = vm.qmp('query-jobs')
1bdc94
+            for job in result['return']:
1bdc94
+                if job['id'] == job_id and job['status'] in ['paused', 'standby']:
1bdc94
+                    return job
1bdc94
+
1bdc94
+# Test that block-job-pause/resume and job-pause/resume can be mixed
1bdc94
+def test_pause_resume(vm):
1bdc94
+    for pause_cmd, pause_arg in [('block-job-pause', 'device'),
1bdc94
+                                 ('job-pause', 'id')]:
1bdc94
+        for resume_cmd, resume_arg in [('block-job-resume', 'device'),
1bdc94
+                                       ('job-resume', 'id')]:
1bdc94
+            iotests.log('=== Testing %s/%s ===' % (pause_cmd, resume_cmd))
1bdc94
+
1bdc94
+            iotests.log(vm.qmp(pause_cmd, **{pause_arg: 'job0'}))
1bdc94
+            pause_wait(vm, 'job0')
1bdc94
+            iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+            iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+            iotests.log(vm.qmp(resume_cmd, **{resume_arg: 'job0'}))
1bdc94
+            iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+            iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+def test_job_lifecycle(vm, job, job_args, has_ready=False):
1bdc94
+    iotests.log('')
1bdc94
+    iotests.log('')
1bdc94
+    iotests.log('Starting block job: %s (auto-finalize: %s; auto-dismiss: %s)' %
1bdc94
+                (job,
1bdc94
+                 job_args.get('auto-finalize', True),
1bdc94
+                 job_args.get('auto-dismiss', True)))
1bdc94
+    iotests.log(vm.qmp(job, job_id='job0', **job_args))
1bdc94
+
1bdc94
+    # Depending on the storage, the first request may or may not have completed
1bdc94
+    # yet, so filter out the progress. Later query-job calls don't need the
1bdc94
+    # filtering because the progress is made deterministic by the block job
1bdc94
+    # speed
1bdc94
+    result = vm.qmp('query-jobs')
1bdc94
+    for j in result['return']:
1bdc94
+        del j['current-progress']
1bdc94
+    iotests.log(result)
1bdc94
+
1bdc94
+    # undefined -> created -> running
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+
1bdc94
+    # RUNNING state:
1bdc94
+    # pause/resume should work, complete/finalize/dismiss should error out
1bdc94
+    iotests.log('')
1bdc94
+    iotests.log('Pause/resume in RUNNING')
1bdc94
+    test_pause_resume(vm)
1bdc94
+
1bdc94
+    iotests.log(vm.qmp('job-complete', id='job0'))
1bdc94
+    iotests.log(vm.qmp('job-finalize', id='job0'))
1bdc94
+    iotests.log(vm.qmp('job-dismiss', id='job0'))
1bdc94
+
1bdc94
+    iotests.log(vm.qmp('block-job-complete', device='job0'))
1bdc94
+    iotests.log(vm.qmp('block-job-finalize', id='job0'))
1bdc94
+    iotests.log(vm.qmp('block-job-dismiss', id='job0'))
1bdc94
+
1bdc94
+    # Let the job complete (or transition to READY if it supports that)
1bdc94
+    iotests.log(vm.qmp('block-job-set-speed', device='job0', speed=0))
1bdc94
+    if has_ready:
1bdc94
+        iotests.log('')
1bdc94
+        iotests.log('Waiting for READY state...')
1bdc94
+        vm.event_wait('BLOCK_JOB_READY')
1bdc94
+        iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+        iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+        # READY state:
1bdc94
+        # pause/resume/complete should work, finalize/dismiss should error out
1bdc94
+        iotests.log('')
1bdc94
+        iotests.log('Pause/resume in READY')
1bdc94
+        test_pause_resume(vm)
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('job-finalize', id='job0'))
1bdc94
+        iotests.log(vm.qmp('job-dismiss', id='job0'))
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('block-job-finalize', id='job0'))
1bdc94
+        iotests.log(vm.qmp('block-job-dismiss', id='job0'))
1bdc94
+
1bdc94
+        # Transition to WAITING
1bdc94
+        iotests.log(vm.qmp('job-complete', id='job0'))
1bdc94
+
1bdc94
+    # Move to WAITING and PENDING state
1bdc94
+    iotests.log('')
1bdc94
+    iotests.log('Waiting for PENDING state...')
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+
1bdc94
+    if not job_args.get('auto-finalize', True):
1bdc94
+        # PENDING state:
1bdc94
+        # finalize should work, pause/complete/dismiss should error out
1bdc94
+        iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('job-pause', id='job0'))
1bdc94
+        iotests.log(vm.qmp('job-complete', id='job0'))
1bdc94
+        iotests.log(vm.qmp('job-dismiss', id='job0'))
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('block-job-pause', device='job0'))
1bdc94
+        iotests.log(vm.qmp('block-job-complete', device='job0'))
1bdc94
+        iotests.log(vm.qmp('block-job-dismiss', id='job0'))
1bdc94
+
1bdc94
+        # Transition to CONCLUDED
1bdc94
+        iotests.log(vm.qmp('job-finalize', id='job0'))
1bdc94
+
1bdc94
+
1bdc94
+    # Move to CONCLUDED state
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+
1bdc94
+    if not job_args.get('auto-dismiss', True):
1bdc94
+        # CONCLUDED state:
1bdc94
+        # dismiss should work, pause/complete/finalize should error out
1bdc94
+        iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('job-pause', id='job0'))
1bdc94
+        iotests.log(vm.qmp('job-complete', id='job0'))
1bdc94
+        iotests.log(vm.qmp('job-finalize', id='job0'))
1bdc94
+
1bdc94
+        iotests.log(vm.qmp('block-job-pause', device='job0'))
1bdc94
+        iotests.log(vm.qmp('block-job-complete', device='job0'))
1bdc94
+        iotests.log(vm.qmp('block-job-finalize', id='job0'))
1bdc94
+
1bdc94
+        # Transition to NULL
1bdc94
+        iotests.log(vm.qmp('job-dismiss', id='job0'))
1bdc94
+
1bdc94
+    # Move to NULL state
1bdc94
+    iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE')))
1bdc94
+    iotests.log(vm.qmp('query-jobs'))
1bdc94
+
1bdc94
+
1bdc94
+with iotests.FilePath('disk.img') as disk_path, \
1bdc94
+     iotests.FilePath('copy.img') as copy_path, \
1bdc94
+     iotests.VM() as vm:
1bdc94
+
1bdc94
+    img_size = '4M'
1bdc94
+    iotests.qemu_img_create('-f', iotests.imgfmt, disk_path, img_size)
1bdc94
+    iotests.qemu_io('-c', 'write 0 %s' % (img_size),
1bdc94
+                    '-f', iotests.imgfmt, disk_path)
1bdc94
+
1bdc94
+    iotests.log('Launching VM...')
1bdc94
+    vm.add_blockdev(vm.qmp_to_opts({
1bdc94
+        'driver': iotests.imgfmt,
1bdc94
+        'node-name': 'drive0-node',
1bdc94
+        'file': {
1bdc94
+            'driver': 'file',
1bdc94
+            'filename': disk_path,
1bdc94
+        },
1bdc94
+    }))
1bdc94
+    vm.launch()
1bdc94
+
1bdc94
+    # In order to keep things deterministic (especially progress in query-job,
1bdc94
+    # but related to this also automatic state transitions like job
1bdc94
+    # completion), but still get pause points often enough to avoid making this
1bdc94
+    # test very slow, it's important to have the right ratio between speed and
1bdc94
+    # buf_size.
1bdc94
+    #
1bdc94
+    # For backup, buf_size is hard-coded to the source image cluster size (64k),
1bdc94
+    # so we'll pick the same for mirror. The slice time, i.e. the granularity
1bdc94
+    # of the rate limiting is 100ms. With a speed of 256k per second, we can
1bdc94
+    # get four pause points per second. This gives us 250ms per iteration,
1bdc94
+    # which should be enough to stay deterministic.
1bdc94
+
1bdc94
+    test_job_lifecycle(vm, 'drive-mirror', has_ready=True, job_args={
1bdc94
+        'device': 'drive0-node',
1bdc94
+        'target': copy_path,
1bdc94
+        'sync': 'full',
1bdc94
+        'speed': 262144,
1bdc94
+        'buf_size': 65536,
1bdc94
+    })
1bdc94
+
1bdc94
+    for auto_finalize in [True, False]:
1bdc94
+        for auto_dismiss in [True, False]:
1bdc94
+            test_job_lifecycle(vm, 'drive-backup', job_args={
1bdc94
+                'device': 'drive0-node',
1bdc94
+                'target': copy_path,
1bdc94
+                'sync': 'full',
1bdc94
+                'speed': 262144,
1bdc94
+                'auto-finalize': auto_finalize,
1bdc94
+                'auto-dismiss': auto_dismiss,
1bdc94
+            })
1bdc94
+
1bdc94
+    vm.shutdown()
1bdc94
diff --git a/tests/qemu-iotests/219.out b/tests/qemu-iotests/219.out
1bdc94
new file mode 100644
1bdc94
index 0000000..346801b
1bdc94
--- /dev/null
1bdc94
+++ b/tests/qemu-iotests/219.out
1bdc94
@@ -0,0 +1,327 @@
1bdc94
+Launching VM...
1bdc94
+
1bdc94
+
1bdc94
+Starting block job: drive-mirror (auto-finalize: True; auto-dismiss: True)
1bdc94
+{u'return': {}}
1bdc94
+{u'return': [{u'status': u'running', u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+
1bdc94
+Pause/resume in RUNNING
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for READY state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+
1bdc94
+Pause/resume in READY
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'standby', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'standby', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'ready', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'ready', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'mirror'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'ready' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for PENDING state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': []}
1bdc94
+
1bdc94
+
1bdc94
+Starting block job: drive-backup (auto-finalize: True; auto-dismiss: True)
1bdc94
+{u'return': {}}
1bdc94
+{u'return': [{u'status': u'running', u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+
1bdc94
+Pause/resume in RUNNING
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for PENDING state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': []}
1bdc94
+
1bdc94
+
1bdc94
+Starting block job: drive-backup (auto-finalize: True; auto-dismiss: False)
1bdc94
+{u'return': {}}
1bdc94
+{u'return': [{u'status': u'running', u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+
1bdc94
+Pause/resume in RUNNING
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for PENDING state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'concluded', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': []}
1bdc94
+
1bdc94
+
1bdc94
+Starting block job: drive-backup (auto-finalize: False; auto-dismiss: True)
1bdc94
+{u'return': {}}
1bdc94
+{u'return': [{u'status': u'running', u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+
1bdc94
+Pause/resume in RUNNING
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for PENDING state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'pending', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': []}
1bdc94
+
1bdc94
+
1bdc94
+Starting block job: drive-backup (auto-finalize: False; auto-dismiss: False)
1bdc94
+{u'return': {}}
1bdc94
+{u'return': [{u'status': u'running', u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'created', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+
1bdc94
+Pause/resume in RUNNING
1bdc94
+=== Testing block-job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 65536, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing block-job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 131072, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/block-job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 196608, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+=== Testing job-pause/job-resume ===
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'paused', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'paused', u'current-progress': 262144, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'running', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'running', u'current-progress': 327680, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'running' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+
1bdc94
+Waiting for PENDING state...
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'waiting', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'pending', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'pending', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'pending' cannot accept command verb 'dismiss'"}}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'concluded', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': [{u'status': u'concluded', u'current-progress': 4194304, u'total-progress': 4194304, u'id': u'job0', u'type': u'backup'}]}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'pause'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'complete'"}}
1bdc94
+{u'error': {u'class': u'GenericError', u'desc': u"Job 'job0' in state 'concluded' cannot accept command verb 'finalize'"}}
1bdc94
+{u'return': {}}
1bdc94
+{u'timestamp': {u'seconds': 'SECS', u'microseconds': 'USECS'}, u'data': {u'status': u'null', u'id': u'job0'}, u'event': u'JOB_STATUS_CHANGE'}
1bdc94
+{u'return': []}
1bdc94
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
1bdc94
index cd7bc29..5c55adc 100644
1bdc94
--- a/tests/qemu-iotests/group
1bdc94
+++ b/tests/qemu-iotests/group
1bdc94
@@ -217,3 +217,4 @@
1bdc94
 216 rw auto quick
1bdc94
 217 rw auto quick
1bdc94
 218 rw auto quick
1bdc94
+219 rw auto
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94