qemu-iotests: Rewrite 210 for blockdev-create job

This rewrites the test case 210 to work with the new x-blockdev-create
job rather than the old synchronous version of the command.

All of the test cases stay the same as before, but in order to be able
to implement proper job handling, the test case is rewritten in Python.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
This commit is contained in:
Kevin Wolf 2018-05-23 18:19:00 +02:00
parent 00af19359e
commit 5ba141dc6f
4 changed files with 286 additions and 262 deletions

View File

@ -1,9 +1,11 @@
#!/bin/bash #!/usr/bin/env python
# #
# Test luks and file image creation # Test luks and file image creation
# #
# Copyright (C) 2018 Red Hat, Inc. # Copyright (C) 2018 Red Hat, Inc.
# #
# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
#
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
@ -18,230 +20,165 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# creator import iotests
owner=kwolf@redhat.com from iotests import imgfmt
seq=`basename $0` iotests.verify_image_format(supported_fmts=['luks'])
echo "QA output created by $seq" iotests.verify_protocol(supported=['file'])
here=`pwd` def blockdev_create(vm, options):
status=1 # failure is the default! result = vm.qmp_log('x-blockdev-create', job_id='job0', options=options)
# get standard environment, filters and checks if 'return' in result:
. ./common.rc assert result['return'] == {}
. ./common.filter vm.run_job('job0')
iotests.log("")
_supported_fmt luks with iotests.FilePath('t.luks') as disk_path, \
_supported_proto file iotests.VM() as vm:
_supported_os Linux
function do_run_qemu() vm.add_object('secret,id=keysec0,data=foo')
{
echo Testing: "$@"
$QEMU -nographic -qmp stdio -serial none "$@"
echo
}
function run_qemu() #
{ # Successful image creation (defaults)
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \ #
| _filter_qemu | _filter_imgfmt \ iotests.log("=== Successful image creation (defaults) ===")
| _filter_actual_image_size iotests.log("")
}
echo size = 128 * 1024 * 1024
echo "=== Successful image creation (defaults) ==="
echo
size=$((128 * 1024 * 1024)) vm.launch()
blockdev_create(vm, { 'driver': 'file',
'filename': disk_path,
'size': 0 })
run_qemu -object secret,id=keysec0,data="foo" <<EOF vm.qmp_log('blockdev-add', driver='file', filename=disk_path,
{ "execute": "qmp_capabilities" } node_name='imgfile')
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "file",
"filename": "$TEST_IMG_FILE",
"size": 0
}
}
{ "execute": "blockdev-add",
"arguments": {
"driver": "file",
"node-name": "imgfile",
"filename": "$TEST_IMG_FILE"
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "$IMGFMT",
"file": "imgfile",
"key-secret": "keysec0",
"size": $size,
"iter-time": 10
}
}
{ "execute": "quit" }
EOF
_img_info --format-specific | _filter_img_info --format-specific blockdev_create(vm, { 'driver': imgfmt,
'file': 'imgfile',
'key-secret': 'keysec0',
'size': size,
'iter-time': 10 })
vm.shutdown()
echo # TODO Proper support for images to be used with imgopts and/or protocols
echo "=== Successful image creation (with non-default options) ===" iotests.img_info_log(
echo 'driver=luks,file.driver=file,file.filename=%s,key-secret=keysec0' % (disk_path),
filter_path=disk_path,
extra_args=['--object', 'secret,id=keysec0,data=foo'],
imgopts=True)
# Choose a different size to show that we got a new image #
size=$((64 * 1024 * 1024)) # Successful image creation (with non-default options)
#
iotests.log("=== Successful image creation (with non-default options) ===")
iotests.log("")
run_qemu -object secret,id=keysec0,data="foo" <<EOF size = 64 * 1024 * 1024
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "file",
"filename": "$TEST_IMG_FILE",
"size": 0
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "$IMGFMT",
"file": {
"driver": "file",
"filename": "$TEST_IMG_FILE"
},
"size": $size,
"key-secret": "keysec0",
"cipher-alg": "twofish-128",
"cipher-mode": "ctr",
"ivgen-alg": "plain64",
"ivgen-hash-alg": "md5",
"hash-alg": "sha1",
"iter-time": 10
}
}
{ "execute": "quit" }
EOF
_img_info --format-specific | _filter_img_info --format-specific vm.launch()
blockdev_create(vm, { 'driver': 'file',
'filename': disk_path,
'size': 0 })
blockdev_create(vm, { 'driver': imgfmt,
'file': {
'driver': 'file',
'filename': disk_path,
},
'size': size,
'key-secret': 'keysec0',
'cipher-alg': 'twofish-128',
'cipher-mode': 'ctr',
'ivgen-alg': 'plain64',
'ivgen-hash-alg': 'md5',
'hash-alg': 'sha1',
'iter-time': 10 })
vm.shutdown()
echo # TODO Proper support for images to be used with imgopts and/or protocols
echo "=== Invalid BlockdevRef ===" iotests.img_info_log(
echo 'driver=luks,file.driver=file,file.filename=%s,key-secret=keysec0' % (disk_path),
filter_path=disk_path,
extra_args=['--object', 'secret,id=keysec0,data=foo'],
imgopts=True)
run_qemu <<EOF #
{ "execute": "qmp_capabilities" } # Invalid BlockdevRef
{ "execute": "x-blockdev-create", #
"arguments": { iotests.log("=== Invalid BlockdevRef ===")
"driver": "$IMGFMT", iotests.log("")
"file": "this doesn't exist",
"size": $size
}
}
{ "execute": "quit" }
EOF
echo size = 64 * 1024 * 1024
echo "=== Zero size ==="
echo
run_qemu -blockdev driver=file,filename="$TEST_IMG_FILE",node-name=node0 \ vm.launch()
-object secret,id=keysec0,data="foo" <<EOF blockdev_create(vm, { 'driver': imgfmt,
{ "execute": "qmp_capabilities" } 'file': "this doesn't exist",
{ "execute": "x-blockdev-create", 'size': size })
"arguments": { vm.shutdown()
"driver": "$IMGFMT",
"file": "node0",
"key-secret": "keysec0",
"size": 0,
"iter-time": 10
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info #
# Zero size
#
iotests.log("=== Zero size ===")
iotests.log("")
vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))
vm.launch()
blockdev_create(vm, { 'driver': imgfmt,
'file': 'node0',
'key-secret': 'keysec0',
'size': 0,
'iter-time': 10 })
vm.shutdown()
echo # TODO Proper support for images to be used with imgopts and/or protocols
echo "=== Invalid sizes ===" iotests.img_info_log(
echo 'driver=luks,file.driver=file,file.filename=%s,key-secret=keysec0' % (disk_path),
filter_path=disk_path,
extra_args=['--object', 'secret,id=keysec0,data=foo'],
imgopts=True)
# TODO Negative image sizes aren't handled correctly, but this is a problem #
# with QAPI's implementation of the 'size' type and affects other commands as # Invalid sizes
# well. Once this is fixed, we may want to add a test case here. #
# 1. 2^64 - 512 # TODO Negative image sizes aren't handled correctly, but this is a problem
# 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this) # with QAPI's implementation of the 'size' type and affects other commands as
# 3. 2^63 - 512 (generally valid, but with the crypto header the file will # well. Once this is fixed, we may want to add a test case here.
# exceed 63 bits)
run_qemu -blockdev driver=file,filename="$TEST_IMG_FILE",node-name=node0 \ # 1. 2^64 - 512
-object secret,id=keysec0,data="foo" <<EOF # 2. 2^63 = 8 EB (qemu-img enforces image sizes less than this)
{ "execute": "qmp_capabilities" } # 3. 2^63 - 512 (generally valid, but with the crypto header the file will
{ "execute": "x-blockdev-create", # exceed 63 bits)
"arguments": { iotests.log("=== Invalid sizes ===")
"driver": "$IMGFMT", iotests.log("")
"file": "node0",
"key-secret": "keysec0",
"size": 18446744073709551104
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "$IMGFMT",
"file": "node0",
"key-secret": "keysec0",
"size": 9223372036854775808
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "$IMGFMT",
"file": "node0",
"key-secret": "keysec0",
"size": 9223372036854775296
}
}
{ "execute": "quit" }
EOF
echo vm.launch()
echo "=== Resize image with invalid sizes ===" for size in [ 18446744073709551104, 9223372036854775808, 9223372036854775296 ]:
echo blockdev_create(vm, { 'driver': imgfmt,
'file': 'node0',
'key-secret': 'keysec0',
'size': size })
vm.shutdown()
run_qemu -blockdev driver=file,filename="$TEST_IMG_FILE",node-name=node0 \ #
-blockdev driver=luks,file=node0,key-secret=keysec0,node-name=node1 \ # Resize image with invalid sizes
-object secret,id=keysec0,data="foo" <<EOF #
{ "execute": "qmp_capabilities" } iotests.log("=== Resize image with invalid sizes ===")
{ "execute": "block_resize", iotests.log("")
"arguments": {
"node-name": "node1",
"size": 9223372036854775296
}
}
{ "execute": "block_resize",
"arguments": {
"node-name": "node1",
"size": 9223372036854775808
}
}
{ "execute": "block_resize",
"arguments": {
"node-name": "node1",
"size": 18446744073709551104
}
}
{ "execute": "block_resize",
"arguments": {
"node-name": "node1",
"size": -9223372036854775808
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info vm.add_blockdev('driver=luks,file=node0,key-secret=keysec0,node-name=node1')
vm.launch()
vm.qmp_log('block_resize', node_name='node1', size=9223372036854775296)
vm.qmp_log('block_resize', node_name='node1', size=9223372036854775808)
vm.qmp_log('block_resize', node_name='node1', size=18446744073709551104)
vm.qmp_log('block_resize', node_name='node1', size=-9223372036854775808)
vm.shutdown()
# success, all done # TODO Proper support for images to be used with imgopts and/or protocols
echo "*** done" iotests.img_info_log(
rm -f $seq.full 'driver=luks,file.driver=file,file.filename=%s,key-secret=keysec0' % (disk_path),
status=0 filter_path=disk_path,
extra_args=['--object', 'secret,id=keysec0,data=foo'],
imgopts=True)

View File

@ -1,29 +1,31 @@
QA output created by 210
=== Successful image creation (defaults) === === Successful image creation (defaults) ===
Testing: -object secret,id=keysec0,data=foo {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}}
QMP_VERSION {u'return': {}}
{"return": {}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"return": {}} {u'return': {}}
{"return": {}}
{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "key-secret": "keysec0"} {'execute': 'blockdev-add', 'arguments': {'node_name': 'imgfile', 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}
{u'return': {}}
{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'iter-time': 10, 'driver': 'luks', 'file': 'imgfile', 'size': 134217728}}}
{u'return': {}}
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
file format: IMGFMT file format: IMGFMT
virtual size: 128M (134217728 bytes) virtual size: 128M (134217728 bytes)
encrypted: yes
Format specific information: Format specific information:
ivgen alg: plain64 ivgen alg: plain64
hash alg: sha256 hash alg: sha256
cipher alg: aes-256 cipher alg: aes-256
uuid: 00000000-0000-0000-0000-000000000000 uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
cipher mode: xts cipher mode: xts
slots: slots:
[0]: [0]:
active: true active: true
iters: 1024 iters: XXX
key offset: 4096 key offset: 4096
stripes: 4000 stripes: 4000
[1]: [1]:
@ -48,31 +50,34 @@ Format specific information:
active: false active: false
key offset: 1810432 key offset: 1810432
payload offset: 2068480 payload offset: 2068480
master key iters: 1024 master key iters: XXX
=== Successful image creation (with non-default options) === === Successful image creation (with non-default options) ===
Testing: -object secret,id=keysec0,data=foo {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'size': 0, 'driver': 'file', 'filename': 'TEST_DIR/PID-t.luks'}}}
QMP_VERSION {u'return': {}}
{"return": {}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"return": {}} {u'return': {}}
{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "key-secret": "keysec0"} {'execute': 'x-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}}}
{u'return': {}}
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
file format: IMGFMT file format: IMGFMT
virtual size: 64M (67108864 bytes) virtual size: 64M (67108864 bytes)
encrypted: yes
Format specific information: Format specific information:
ivgen alg: plain64 ivgen alg: plain64
hash alg: sha1 hash alg: sha1
cipher alg: twofish-128 cipher alg: twofish-128
uuid: 00000000-0000-0000-0000-000000000000 uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
cipher mode: ctr cipher mode: ctr
slots: slots:
[0]: [0]:
active: true active: true
iters: 1024 iters: XXX
key offset: 4096 key offset: 4096
stripes: 4000 stripes: 4000
[1]: [1]:
@ -97,56 +102,130 @@ Format specific information:
active: false active: false
key offset: 462848 key offset: 462848
payload offset: 528384 payload offset: 528384
master key iters: 1024 master key iters: XXX
=== Invalid BlockdevRef === === Invalid BlockdevRef ===
Testing: {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'luks', 'file': "this doesn't exist", 'size': 67108864}}}
QMP_VERSION {u'return': {}}
{"return": {}} Job failed: Cannot find device=this doesn't exist nor node_name=this doesn't exist
{"error": {"class": "GenericError", "desc": "Cannot find device=this doesn't exist nor node_name=this doesn't exist"}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"return": {}} {u'return': {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
=== Zero size === === Zero size ===
Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0 -object secret,id=keysec0,data=foo {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'iter-time': 10, 'driver': 'luks', 'file': 'node0', 'size': 0}}}
QMP_VERSION {u'return': {}}
{"return": {}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"return": {}} {u'return': {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "key-secret": "keysec0"} image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
file format: IMGFMT file format: IMGFMT
virtual size: 0 (0 bytes) virtual size: 0 (0 bytes)
encrypted: yes
Format specific information:
ivgen alg: plain64
hash alg: sha256
cipher alg: aes-256
uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
cipher mode: xts
slots:
[0]:
active: true
iters: XXX
key offset: 4096
stripes: 4000
[1]:
active: false
key offset: 262144
[2]:
active: false
key offset: 520192
[3]:
active: false
key offset: 778240
[4]:
active: false
key offset: 1036288
[5]:
active: false
key offset: 1294336
[6]:
active: false
key offset: 1552384
[7]:
active: false
key offset: 1810432
payload offset: 2068480
master key iters: XXX
=== Invalid sizes === === Invalid sizes ===
Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0 -object secret,id=keysec0,data=foo {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 18446744073709551104L}}}
QMP_VERSION {u'return': {}}
{"return": {}} Job failed: The requested file size is too large
{"error": {"class": "GenericError", "desc": "The requested file size is too large"}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"error": {"class": "GenericError", "desc": "The requested file size is too large"}} {u'return': {}}
{"error": {"class": "GenericError", "desc": "The requested file size is too large"}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 9223372036854775808L}}}
{u'return': {}}
Job failed: The requested file size is too large
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'key-secret': 'keysec0', 'driver': 'luks', 'file': 'node0', 'size': 9223372036854775296}}}
{u'return': {}}
Job failed: The requested file size is too large
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
=== Resize image with invalid sizes === === Resize image with invalid sizes ===
Testing: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0 -blockdev driver=IMGFMT,file=node0,key-secret=keysec0,node-name=node1 -object secret,id=keysec0,data=foo {'execute': 'block_resize', 'arguments': {'size': 9223372036854775296, 'node_name': 'node1'}}
QMP_VERSION {u'error': {u'class': u'GenericError', u'desc': u'The requested file size is too large'}}
{"return": {}} {'execute': 'block_resize', 'arguments': {'size': 9223372036854775808L, 'node_name': 'node1'}}
{"error": {"class": "GenericError", "desc": "The requested file size is too large"}} {u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter type for 'size', expected: integer"}}
{"error": {"class": "GenericError", "desc": "Invalid parameter type for 'size', expected: integer"}} {'execute': 'block_resize', 'arguments': {'size': 18446744073709551104L, 'node_name': 'node1'}}
{"error": {"class": "GenericError", "desc": "Invalid parameter type for 'size', expected: integer"}} {u'error': {u'class': u'GenericError', u'desc': u"Invalid parameter type for 'size', expected: integer"}}
{"error": {"class": "GenericError", "desc": "Parameter 'size' expects a >0 size"}} {'execute': 'block_resize', 'arguments': {'size': -9223372036854775808, 'node_name': 'node1'}}
{"return": {}} {u'error': {u'class': u'GenericError', u'desc': u"Parameter 'size' expects a >0 size"}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_IMG"}, "key-secret": "keysec0"}
image: json:{"driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "key-secret": "keysec0"}
file format: IMGFMT file format: IMGFMT
virtual size: 0 (0 bytes) virtual size: 0 (0 bytes)
*** done encrypted: yes
Format specific information:
ivgen alg: plain64
hash alg: sha256
cipher alg: aes-256
uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
cipher mode: xts
slots:
[0]:
active: true
iters: XXX
key offset: 4096
stripes: 4000
[1]:
active: false
key offset: 262144
[2]:
active: false
key offset: 520192
[3]:
active: false
key offset: 778240
[4]:
active: false
key offset: 1036288
[5]:
active: false
key offset: 1294336
[6]:
active: false
key offset: 1552384
[7]:
active: false
key offset: 1810432
payload offset: 2068480
master key iters: XXX

View File

@ -208,9 +208,9 @@
207 rw auto 207 rw auto
208 rw auto quick 208 rw auto quick
209 rw auto quick 209 rw auto quick
210 rw auto
# TODO The following commented out tests need to be reworked to work # TODO The following commented out tests need to be reworked to work
# with the x-blockdev-create job # with the x-blockdev-create job
#210 rw auto
#211 rw auto quick #211 rw auto quick
#212 rw auto quick #212 rw auto quick
#213 rw auto quick #213 rw auto quick

View File

@ -109,8 +109,16 @@ def qemu_img_pipe(*args):
sys.stderr.write('qemu-img received signal %i: %s\n' % (-exitcode, ' '.join(qemu_img_args + list(args)))) sys.stderr.write('qemu-img received signal %i: %s\n' % (-exitcode, ' '.join(qemu_img_args + list(args))))
return subp.communicate()[0] return subp.communicate()[0]
def img_info_log(filename, filter_path=None): def img_info_log(filename, filter_path=None, imgopts=False, extra_args=[]):
output = qemu_img_pipe('info', '-f', imgfmt, filename) args = [ 'info' ]
if imgopts:
args.append('--image-opts')
else:
args += [ '-f', imgfmt ]
args += extra_args
args.append(filename)
output = qemu_img_pipe(*args)
if not filter_path: if not filter_path:
filter_path = filename filter_path = filename
log(filter_img_info(output, filter_path)) log(filter_img_info(output, filter_path))