Blame SOURCES/kvm-qemu-iotests-Rewrite-206-for-blockdev-create-job.patch

357786
From 9b3ed457aa8c255cb8a5975f5aacd149d0b0397a Mon Sep 17 00:00:00 2001
357786
From: Kevin Wolf <kwolf@redhat.com>
357786
Date: Tue, 26 Jun 2018 09:48:46 +0200
357786
Subject: [PATCH 77/89] qemu-iotests: Rewrite 206 for blockdev-create job
357786
357786
RH-Author: Kevin Wolf <kwolf@redhat.com>
357786
Message-id: <20180626094856.6924-64-kwolf@redhat.com>
357786
Patchwork-id: 81077
357786
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 63/73] qemu-iotests: Rewrite 206 for blockdev-create job
357786
Bugzilla: 1513543
357786
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
357786
RH-Acked-by: Max Reitz <mreitz@redhat.com>
357786
RH-Acked-by: Fam Zheng <famz@redhat.com>
357786
357786
This rewrites the test case 206 to work with the new x-blockdev-create
357786
job rather than the old synchronous version of the command.
357786
357786
All of the test cases stay the same as before, but in order to be able
357786
to implement proper job handling, the test case is rewritten in Python.
357786
357786
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
357786
Reviewed-by: Max Reitz <mreitz@redhat.com>
357786
(cherry picked from commit 4de110f8fd2811171013254fd7ed2384f1de87b4)
357786
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
357786
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
---
357786
 tests/qemu-iotests/206     | 680 ++++++++++++++++++---------------------------
357786
 tests/qemu-iotests/206.out | 253 ++++++++++-------
357786
 tests/qemu-iotests/group   |   2 +-
357786
 3 files changed, 414 insertions(+), 521 deletions(-)
357786
357786
diff --git a/tests/qemu-iotests/206 b/tests/qemu-iotests/206
357786
index 0a18b2b..b8cf2e7 100755
357786
--- a/tests/qemu-iotests/206
357786
+++ b/tests/qemu-iotests/206
357786
@@ -1,9 +1,11 @@
357786
-#!/bin/bash
357786
+#!/usr/bin/env python
357786
 #
357786
 # Test qcow2 and file image creation
357786
 #
357786
 # Copyright (C) 2018 Red Hat, Inc.
357786
 #
357786
+# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
357786
+#
357786
 # This program is free software; you can redistribute it and/or modify
357786
 # it under the terms of the GNU General Public License as published by
357786
 # the Free Software Foundation; either version 2 of the License, or
357786
@@ -18,419 +20,263 @@
357786
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
357786
 #
357786
 
357786
-# creator
357786
-owner=kwolf@redhat.com
357786
-
357786
-seq=`basename $0`
357786
-echo "QA output created by $seq"
357786
-
357786
-here=`pwd`
357786
-status=1	# failure is the default!
357786
-
357786
-# get standard environment, filters and checks
357786
-. ./common.rc
357786
-. ./common.filter
357786
-
357786
-_supported_fmt qcow2
357786
-_supported_proto file
357786
-_supported_os Linux
357786
-
357786
-function do_run_qemu()
357786
-{
357786
-    echo Testing: "$@"
357786
-    $QEMU -nographic -qmp stdio -serial none "$@"
357786
-    echo
357786
-}
357786
-
357786
-function run_qemu()
357786
-{
357786
-    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
357786
-                          | _filter_qemu | _filter_imgfmt \
357786
-                          | _filter_actual_image_size
357786
-}
357786
-
357786
-echo
357786
-echo "=== Successful image creation (defaults) ==="
357786
-echo
357786
-
357786
-size=$((128 * 1024 * 1024))
357786
-
357786
-run_qemu <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "file",
357786
-      "filename": "$TEST_IMG",
357786
-      "size": 0
357786
-  }
357786
-}
357786
-{ "execute": "blockdev-add",
357786
-  "arguments": {
357786
-      "driver": "file",
357786
-      "node-name": "imgfile",
357786
-      "filename": "$TEST_IMG"
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "imgfile",
357786
-      "size": $size
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-_img_info --format-specific
357786
-
357786
-echo
357786
-echo "=== Successful image creation (inline blockdev-add, explicit defaults) ==="
357786
-echo
357786
-
357786
-# Choose a different size to show that we got a new image
357786
-size=$((64 * 1024 * 1024))
357786
-
357786
-run_qemu <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "file",
357786
-      "filename": "$TEST_IMG",
357786
-      "size": 0,
357786
-      "preallocation": "off",
357786
-      "nocow": false
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": {
357786
-          "driver": "file",
357786
-          "filename": "$TEST_IMG"
357786
-      },
357786
-      "size": $size,
357786
-      "version": "v3",
357786
-      "cluster-size": 65536,
357786
-      "preallocation": "off",
357786
-      "lazy-refcounts": false,
357786
-      "refcount-bits": 16
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-_img_info --format-specific
357786
-
357786
-echo
357786
-echo "=== Successful image creation (v3 non-default options) ==="
357786
-echo
357786
-
357786
-# Choose a different size to show that we got a new image
357786
-size=$((32 * 1024 * 1024))
357786
-
357786
-run_qemu <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "file",
357786
-      "filename": "$TEST_IMG",
357786
-      "size": 0,
357786
-      "preallocation": "falloc",
357786
-      "nocow": true
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": {
357786
-          "driver": "file",
357786
-          "filename": "$TEST_IMG"
357786
-      },
357786
-      "size": $size,
357786
-      "version": "v3",
357786
-      "cluster-size": 2097152,
357786
-      "preallocation": "metadata",
357786
-      "lazy-refcounts": true,
357786
-      "refcount-bits": 1
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-_img_info --format-specific
357786
-
357786
-echo
357786
-echo "=== Successful image creation (v2 non-default options) ==="
357786
-echo
357786
-
357786
-mv $TEST_IMG $TEST_IMG.base
357786
-
357786
-run_qemu <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "file",
357786
-      "filename": "$TEST_IMG",
357786
-      "size": 0
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": {
357786
-          "driver": "file",
357786
-          "filename": "$TEST_IMG"
357786
-      },
357786
-      "size": $size,
357786
-      "backing-file": "$TEST_IMG.base",
357786
-      "backing-fmt": "qcow2",
357786
-      "version": "v2",
357786
-      "cluster-size": 512
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-_img_info --format-specific
357786
-
357786
-echo
357786
-echo "=== Successful image creation (encrypted) ==="
357786
-echo
357786
-
357786
-run_qemu -object secret,id=keysec0,data="foo" <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": {
357786
-          "driver": "file",
357786
-          "filename": "$TEST_IMG"
357786
-      },
357786
-      "size": $size,
357786
-      "encrypt": {
357786
-          "format": "luks",
357786
-          "key-secret": "keysec0",
357786
-          "cipher-alg": "twofish-128",
357786
-          "cipher-mode": "ctr",
357786
-          "ivgen-alg": "plain64",
357786
-          "ivgen-hash-alg": "md5",
357786
-          "hash-alg": "sha1",
357786
-          "iter-time": 10
357786
-      }
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-_img_info --format-specific | _filter_img_info --format-specific
357786
-
357786
-echo
357786
-echo "=== Invalid BlockdevRef ==="
357786
-echo
357786
-
357786
-run_qemu <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "this doesn't exist",
357786
-      "size": $size
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-
357786
-echo
357786
-echo "=== Invalid sizes ==="
357786
-echo
357786
-
357786
-# TODO Negative image sizes aren't handled correctly, but this is a problem
357786
-# with QAPI's implementation of the 'size' type and affects other commands as
357786
-# well. Once this is fixed, we may want to add a test case here.
357786
-
357786
-# 1. Misaligned image size
357786
-# 2. 2^64 - 512
357786
-# 3. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
357786
-# 4. 2^63 - 512 (generally valid, but qcow2 can't handle images this size)
357786
-
357786
-run_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 1234
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 18446744073709551104
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 9223372036854775808
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 9223372036854775296
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-echo
357786
-echo "=== Invalid version ==="
357786
-echo
357786
-
357786
-run_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "version": "v1"
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "version": "v2",
357786
-      "lazy-refcounts": true
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "version": "v2",
357786
-      "refcount-bits": 8
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-echo
357786
-echo "=== Invalid backing file options ==="
357786
-echo
357786
-
357786
-run_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "backing-file": "/dev/null",
357786
-      "preallocation": "full"
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "backing-fmt": "$IMGFMT"
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-echo
357786
-echo "=== Invalid cluster size ==="
357786
-echo
357786
-
357786
-run_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "cluster-size": 1234
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "cluster-size": 128
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "cluster-size": 4194304
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "cluster-size": 0
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 281474976710656,
357786
-      "cluster-size": 512
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-echo
357786
-echo "=== Invalid refcount width ==="
357786
-echo
357786
-
357786
-run_qemu -blockdev driver=file,filename="$TEST_IMG",node-name=node0 <
357786
-{ "execute": "qmp_capabilities" }
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "refcount-bits": 128
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "refcount-bits": 0
357786
-  }
357786
-}
357786
-{ "execute": "x-blockdev-create",
357786
-  "arguments": {
357786
-      "driver": "$IMGFMT",
357786
-      "file": "node0",
357786
-      "size": 67108864,
357786
-      "refcount-bits": 7
357786
-  }
357786
-}
357786
-{ "execute": "quit" }
357786
-EOF
357786
-
357786
-# success, all done
357786
-echo "*** done"
357786
-rm -f $seq.full
357786
-status=0
357786
+import iotests
357786
+from iotests import imgfmt
357786
+
357786
+iotests.verify_image_format(supported_fmts=['qcow2'])
357786
+
357786
+def blockdev_create(vm, options):
357786
+    result = vm.qmp_log('x-blockdev-create', job_id='job0', options=options)
357786
+
357786
+    if 'return' in result:
357786
+        assert result['return'] == {}
357786
+        vm.run_job('job0')
357786
+    iotests.log("")
357786
+
357786
+with iotests.FilePath('t.qcow2') as disk_path, \
357786
+     iotests.FilePath('t.qcow2.base') as backing_path, \
357786
+     iotests.VM() as vm:
357786
+
357786
+    vm.add_object('secret,id=keysec0,data=foo')
357786
+
357786
+    #
357786
+    # Successful image creation (defaults)
357786
+    #
357786
+    iotests.log("=== Successful image creation (defaults) ===")
357786
+    iotests.log("")
357786
+
357786
+    size = 128 * 1024 * 1024
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': 'file',
357786
+                          'filename': disk_path,
357786
+                          'size': 0 })
357786
+
357786
+    vm.qmp_log('blockdev-add', driver='file', filename=disk_path,
357786
+               node_name='imgfile')
357786
+
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'imgfile',
357786
+                          'size': size })
357786
+    vm.shutdown()
357786
+
357786
+    iotests.img_info_log(disk_path)
357786
+
357786
+    #
357786
+    # Successful image creation (inline blockdev-add, explicit defaults)
357786
+    #
357786
+    iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===")
357786
+    iotests.log("")
357786
+
357786
+    # Choose a different size to show that we got a new image
357786
+    size = 64 * 1024 * 1024
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': 'file',
357786
+                          'filename': disk_path,
357786
+                          'size': 0,
357786
+                          'preallocation': 'off',
357786
+                          'nocow': False })
357786
+
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': {
357786
+                              'driver': 'file',
357786
+                              'filename': disk_path,
357786
+                          },
357786
+                          'size': size,
357786
+                          'version': 'v3',
357786
+                          'cluster-size': 65536,
357786
+                          'preallocation': 'off',
357786
+                          'lazy-refcounts': False,
357786
+                          'refcount-bits': 16 })
357786
+    vm.shutdown()
357786
+
357786
+    iotests.img_info_log(disk_path)
357786
+
357786
+    #
357786
+    # Successful image creation (v3 non-default options)
357786
+    #
357786
+    iotests.log("=== Successful image creation (v3 non-default options) ===")
357786
+    iotests.log("")
357786
+
357786
+    # Choose a different size to show that we got a new image
357786
+    size = 32 * 1024 * 1024
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': 'file',
357786
+                          'filename': disk_path,
357786
+                          'size': 0,
357786
+                          'preallocation': 'falloc',
357786
+                          'nocow': True })
357786
+
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': {
357786
+                              'driver': 'file',
357786
+                              'filename': disk_path,
357786
+                          },
357786
+                          'size': size,
357786
+                          'version': 'v3',
357786
+                          'cluster-size': 2097152,
357786
+                          'preallocation': 'metadata',
357786
+                          'lazy-refcounts': True,
357786
+                          'refcount-bits': 1 })
357786
+    vm.shutdown()
357786
+
357786
+    iotests.img_info_log(disk_path)
357786
+
357786
+    #
357786
+    # Successful image creation (v2 non-default options)
357786
+    #
357786
+    iotests.log("=== Successful image creation (v2 non-default options) ===")
357786
+    iotests.log("")
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': 'file',
357786
+                          'filename': disk_path,
357786
+                          'size': 0 })
357786
+
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': {
357786
+                              'driver': 'file',
357786
+                              'filename': disk_path,
357786
+                          },
357786
+                          'size': size,
357786
+                          'backing-file': backing_path,
357786
+                          'backing-fmt': 'qcow2',
357786
+                          'version': 'v2',
357786
+                          'cluster-size': 512 })
357786
+    vm.shutdown()
357786
+
357786
+    iotests.img_info_log(disk_path)
357786
+
357786
+    #
357786
+    # Successful image creation (encrypted)
357786
+    #
357786
+    iotests.log("=== Successful image creation (encrypted) ===")
357786
+    iotests.log("")
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': {
357786
+                              'driver': 'file',
357786
+                              'filename': disk_path,
357786
+                          },
357786
+                          'size': size,
357786
+                          'encrypt': {
357786
+                              'format': 'luks',
357786
+                              'key-secret': 'keysec0',
357786
+                              'cipher-alg': 'twofish-128',
357786
+                              'cipher-mode': 'ctr',
357786
+                              'ivgen-alg': 'plain64',
357786
+                              'ivgen-hash-alg': 'md5',
357786
+                              'hash-alg': 'sha1',
357786
+                              'iter-time': 10,
357786
+                          }})
357786
+    vm.shutdown()
357786
+
357786
+    iotests.img_info_log(disk_path)
357786
+
357786
+    #
357786
+    # Invalid BlockdevRef
357786
+    #
357786
+    iotests.log("=== Invalid BlockdevRef ===")
357786
+    iotests.log("")
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': "this doesn't exist",
357786
+                          'size': size })
357786
+    vm.shutdown()
357786
+
357786
+    #
357786
+    # Invalid sizes
357786
+    #
357786
+    iotests.log("=== Invalid sizes ===")
357786
+
357786
+    # TODO Negative image sizes aren't handled correctly, but this is a problem
357786
+    # with QAPI's implementation of the 'size' type and affects other commands
357786
+    # as well. Once this is fixed, we may want to add a test case here.
357786
+    #
357786
+    # 1. Misaligned image size
357786
+    # 2. 2^64 - 512
357786
+    # 3. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
357786
+    # 4. 2^63 - 512 (generally valid, but qcow2 can't handle images this size)
357786
+
357786
+    vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))
357786
+
357786
+    vm.launch()
357786
+    for size in [ 1234, 18446744073709551104, 9223372036854775808,
357786
+                  9223372036854775296 ]:
357786
+        blockdev_create(vm, { 'driver': imgfmt,
357786
+                              'file': 'node0',
357786
+                              'size': size })
357786
+    vm.shutdown()
357786
+
357786
+    #
357786
+    # Invalid version
357786
+    #
357786
+    iotests.log("=== Invalid version ===")
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 67108864,
357786
+                          'version': 'v1' })
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 67108864,
357786
+                          'version': 'v2',
357786
+                          'lazy-refcounts': True })
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 67108864,
357786
+                          'version': 'v2',
357786
+                          'refcount-bits': 8 })
357786
+    vm.shutdown()
357786
+
357786
+    #
357786
+    # Invalid backing file options
357786
+    #
357786
+    iotests.log("=== Invalid backing file options ===")
357786
+
357786
+    vm.launch()
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 67108864,
357786
+                          'backing-file': '/dev/null',
357786
+                          'preallocation': 'full' })
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 67108864,
357786
+                          'backing-fmt': imgfmt })
357786
+    vm.shutdown()
357786
+
357786
+    #
357786
+    # Invalid cluster size
357786
+    #
357786
+    iotests.log("=== Invalid cluster size ===")
357786
+
357786
+    vm.launch()
357786
+    for csize in [ 1234, 128, 4194304, 0 ]:
357786
+        blockdev_create(vm, { 'driver': imgfmt,
357786
+                              'file': 'node0',
357786
+                              'size': 67108864,
357786
+                              'cluster-size': csize })
357786
+    blockdev_create(vm, { 'driver': imgfmt,
357786
+                          'file': 'node0',
357786
+                          'size': 281474976710656,
357786
+                          'cluster-size': 512 })
357786
+    vm.shutdown()
357786
+
357786
+    #
357786
+    # Invalid refcount width
357786
+    #
357786
+    iotests.log("=== Invalid refcount width ===")
357786
+
357786
+    vm.launch()
357786
+    for refcount_bits in [ 128, 0, 7 ]:
357786
+        blockdev_create(vm, { 'driver': imgfmt,
357786
+                              'file': 'node0',
357786
+                              'size': 67108864,
357786
+                              'refcount-bits': refcount_bits })
357786
+    vm.shutdown()
357786
diff --git a/tests/qemu-iotests/206.out b/tests/qemu-iotests/206.out
357786
index 042342a..34451a3 100644
357786
--- a/tests/qemu-iotests/206.out
357786
+++ b/tests/qemu-iotests/206.out
357786
@@ -1,17 +1,18 @@
357786
-QA output created by 206
357786
-
357786
 === Successful image creation (defaults) ===
357786
 
357786
-Testing:
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}
357786
+{u'return': {}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'imgfile', 'size': 134217728}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-image: TEST_DIR/t.IMGFMT
357786
+image: TEST_IMG
357786
 file format: IMGFMT
357786
 virtual size: 128M (134217728 bytes)
357786
 cluster_size: 65536
357786
@@ -23,15 +24,17 @@ Format specific information:
357786
 
357786
 === Successful image creation (inline blockdev-add, explicit defaults) ===
357786
 
357786
-Testing:
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'nocow': False, 'preallocation': 'off', 'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-image: TEST_DIR/t.IMGFMT
357786
+{'execute': 'x-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}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+image: TEST_IMG
357786
 file format: IMGFMT
357786
 virtual size: 64M (67108864 bytes)
357786
 cluster_size: 65536
357786
@@ -43,15 +46,17 @@ Format specific information:
357786
 
357786
 === Successful image creation (v3 non-default options) ===
357786
 
357786
-Testing:
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'nocow': True, 'preallocation': 'falloc', 'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-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}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-image: TEST_DIR/t.IMGFMT
357786
+image: TEST_IMG
357786
 file format: IMGFMT
357786
 virtual size: 32M (33554432 bytes)
357786
 cluster_size: 2097152
357786
@@ -63,19 +68,21 @@ Format specific information:
357786
 
357786
 === Successful image creation (v2 non-default options) ===
357786
 
357786
-Testing:
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.qcow2'}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-image: TEST_DIR/t.IMGFMT
357786
+{'execute': 'x-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}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+image: TEST_IMG
357786
 file format: IMGFMT
357786
 virtual size: 32M (33554432 bytes)
357786
 cluster_size: 512
357786
-backing file: TEST_DIR/t.IMGFMT.base
357786
+backing file: TEST_IMG.base
357786
 backing file format: IMGFMT
357786
 Format specific information:
357786
     compat: 0.10
357786
@@ -83,16 +90,16 @@ Format specific information:
357786
 
357786
 === Successful image creation (encrypted) ===
357786
 
357786
-Testing: -object secret,id=keysec0,data=foo
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-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}}}
357786
+{u'return': {}}
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-image: TEST_DIR/t.IMGFMT
357786
+image: TEST_IMG
357786
 file format: IMGFMT
357786
 virtual size: 32M (33554432 bytes)
357786
+encrypted: yes
357786
+cluster_size: 65536
357786
 Format specific information:
357786
     compat: 1.1
357786
     lazy refcounts: false
357786
@@ -101,13 +108,13 @@ Format specific information:
357786
         ivgen alg: plain64
357786
         hash alg: sha1
357786
         cipher alg: twofish-128
357786
-        uuid: 00000000-0000-0000-0000-000000000000
357786
+        uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
357786
         format: luks
357786
         cipher mode: ctr
357786
         slots:
357786
             [0]:
357786
                 active: true
357786
-                iters: 1024
357786
+                iters: XXX
357786
                 key offset: 4096
357786
                 stripes: 4000
357786
             [1]:
357786
@@ -132,78 +139,118 @@ Format specific information:
357786
                 active: false
357786
                 key offset: 462848
357786
         payload offset: 528384
357786
-        master key iters: 1024
357786
+        master key iters: XXX
357786
     corrupt: false
357786
 
357786
 === Invalid BlockdevRef ===
357786
 
357786
-Testing:
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Cannot find device=this doesn't exist nor node_name=this doesn't exist"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
-
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': "this doesn't exist", 'size': 33554432}}}
357786
+{u'return': {}}
357786
+Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
 === Invalid sizes ===
357786
-
357786
-Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Image size must be a multiple of 512 bytes"}}
357786
-{"error": {"class": "GenericError", "desc": "Could not resize image: Image size cannot be negative"}}
357786
-{"error": {"class": "GenericError", "desc": "Could not resize image: Image size cannot be negative"}}
357786
-{"error": {"class": "GenericError", "desc": "Could not resize image: Failed to grow the L1 table: File too large"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
-
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 1234}}}
357786
+{u'return': {}}
357786
+Job failed: Image size must be a multiple of 512 bytes
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 18446744073709551104L}}}
357786
+{u'return': {}}
357786
+Job failed: Could not resize image: Image size cannot be negative
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 9223372036854775808L}}}
357786
+{u'return': {}}
357786
+Job failed: Could not resize image: Image size cannot be negative
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'qcow2', 'file': 'node0', 'size': 9223372036854775296}}}
357786
+{u'return': {}}
357786
+Job failed: Could not resize image: Failed to grow the L1 table: File too large
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
 === Invalid version ===
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'version': 'v1', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter 'v1'"}}
357786
 
357786
-Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Invalid parameter 'v1'"}}
357786
-{"error": {"class": "GenericError", "desc": "Lazy refcounts only supported with compatibility level 1.1 and above (use version=v3 or greater)"}}
357786
-{"error": {"class": "GenericError", "desc": "Different refcount widths than 16 bits require compatibility level 1.1 or above (use version=v3 or greater)"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'lazy-refcounts': True, 'version': 'v2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Lazy refcounts only supported with compatibility level 1.1 and above (use version=v3 or greater)
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 8, 'version': 'v2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Different refcount widths than 16 bits require compatibility level 1.1 or above (use version=v3 or greater)
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
 === Invalid backing file options ===
357786
-
357786
-Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Backing file and preallocation cannot be used at the same time"}}
357786
-{"error": {"class": "GenericError", "desc": "Backing format cannot be used without backing file"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
-
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'preallocation': 'full', 'driver': 'qcow2', 'backing-file': '/dev/null', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Backing file and preallocation cannot be used at the same time
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'backing-fmt': 'qcow2', 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Backing format cannot be used without backing file
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
 === Invalid cluster size ===
357786
-
357786
-Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Cluster size must be a power of two between 512 and 2048k"}}
357786
-{"error": {"class": "GenericError", "desc": "Cluster size must be a power of two between 512 and 2048k"}}
357786
-{"error": {"class": "GenericError", "desc": "Cluster size must be a power of two between 512 and 2048k"}}
357786
-{"error": {"class": "GenericError", "desc": "Cluster size must be a power of two between 512 and 2048k"}}
357786
-{"error": {"class": "GenericError", "desc": "Could not resize image: Failed to grow the L1 table: File too large"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
-
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 1234, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Cluster size must be a power of two between 512 and 2048k
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 128, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Cluster size must be a power of two between 512 and 2048k
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 4194304, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Cluster size must be a power of two between 512 and 2048k
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 0, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Cluster size must be a power of two between 512 and 2048k
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'cluster-size': 512, 'driver': 'qcow2', 'file': 'node0', 'size': 281474976710656}}}
357786
+{u'return': {}}
357786
+Job failed: Could not resize image: Failed to grow the L1 table: File too large
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
 === Invalid refcount width ===
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 128, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Refcount width must be a power of two and may not exceed 64 bits
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 0, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Refcount width must be a power of two and may not exceed 64 bits
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
+
357786
+{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'refcount-bits': 7, 'driver': 'qcow2', 'file': 'node0', 'size': 67108864}}}
357786
+{u'return': {}}
357786
+Job failed: Refcount width must be a power of two and may not exceed 64 bits
357786
+{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
357786
+{u'return': {}}
357786
 
357786
-Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0
357786
-QMP_VERSION
357786
-{"return": {}}
357786
-{"error": {"class": "GenericError", "desc": "Refcount width must be a power of two and may not exceed 64 bits"}}
357786
-{"error": {"class": "GenericError", "desc": "Refcount width must be a power of two and may not exceed 64 bits"}}
357786
-{"error": {"class": "GenericError", "desc": "Refcount width must be a power of two and may not exceed 64 bits"}}
357786
-{"return": {}}
357786
-{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
357786
-
357786
-*** done
357786
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
357786
index 37ec5f1..3d6ae02 100644
357786
--- a/tests/qemu-iotests/group
357786
+++ b/tests/qemu-iotests/group
357786
@@ -204,9 +204,9 @@
357786
 203 rw auto
357786
 204 rw auto quick
357786
 205 rw auto quick
357786
+206 rw auto
357786
 # TODO The following commented out tests need to be reworked to work
357786
 # with the x-blockdev-create job
357786
-#206 rw auto
357786
 #207 rw auto
357786
 208 rw auto quick
357786
 209 rw auto quick
357786
-- 
357786
1.8.3.1
357786