qemu-iotests: Rewrite 207 for blockdev-create job

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

Most of the test cases stay the same as before (the exception being some
improved 'size' options that allow distinguishing which command created
the image), 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>
This commit is contained in:
Kevin Wolf 2018-05-23 18:19:00 +02:00
parent 4de110f8fd
commit 00af19359e
3 changed files with 232 additions and 271 deletions

View File

@ -1,9 +1,11 @@
#!/bin/bash #!/usr/bin/env python
# #
# Test ssh image creation # Test ssh 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,244 +20,198 @@
# 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 import subprocess
import re
seq=`basename $0` iotests.verify_image_format(supported_fmts=['raw'])
echo "QA output created by $seq" iotests.verify_protocol(supported=['ssh'])
here=`pwd` def filter_hash(msg):
status=1 # failure is the default! return re.sub("'hash': '[0-9a-f]+'", "'hash': HASH", msg)
# get standard environment, filters and checks def blockdev_create(vm, options):
. ./common.rc result = vm.qmp_log('x-blockdev-create', job_id='job0', options=options,
. ./common.filter filters=[iotests.filter_testfiles, filter_hash])
_supported_fmt raw if 'return' in result:
_supported_proto ssh assert result['return'] == {}
_supported_os Linux vm.run_job('job0')
iotests.log("")
function do_run_qemu() with iotests.FilePath('t.img') as disk_path, \
{ iotests.VM() as vm:
echo Testing: "$@"
$QEMU -nographic -qmp stdio -serial none "$@"
echo
}
function run_qemu() remote_path = iotests.remote_filename(disk_path)
{
do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
| _filter_qemu | _filter_imgfmt \
| _filter_actual_image_size
}
echo #
echo "=== Successful image creation (defaults) ===" # Successful image creation (defaults)
echo #
iotests.log("=== Successful image creation (defaults) ===")
iotests.log("")
run_qemu <<EOF vm.launch()
{ "execute": "qmp_capabilities" } blockdev_create(vm, { 'driver': 'ssh',
{ "execute": "x-blockdev-create", 'location': {
"arguments": { 'path': disk_path,
"driver": "ssh", 'server': {
"location": { 'host': '127.0.0.1',
"path": "$TEST_IMG_FILE", 'port': '22'
"server": { }
"host": "127.0.0.1", },
"port": "22" 'size': 4194304 })
} vm.shutdown()
},
"size": 4194304
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info iotests.img_info_log(remote_path, filter_path=disk_path)
echo iotests.log("")
TEST_IMG=$TEST_IMG_FILE _img_info | _filter_img_info iotests.img_info_log(disk_path)
echo #
echo "=== Test host-key-check options ===" # Test host-key-check options
echo #
iotests.log("=== Test host-key-check options ===")
iotests.log("")
run_qemu <<EOF vm.launch()
{ "execute": "qmp_capabilities" } blockdev_create(vm, { 'driver': 'ssh',
{ "execute": "x-blockdev-create", 'location': {
"arguments": { 'path': disk_path,
"driver": "ssh", 'server': {
"location": { 'host': '127.0.0.1',
"path": "$TEST_IMG_FILE", 'port': '22'
"server": { },
"host": "127.0.0.1", 'host-key-check': {
"port": "22" 'mode': 'none'
}, }
"host-key-check": { },
"mode": "none" 'size': 8388608 })
} vm.shutdown()
},
"size": 8388608
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info iotests.img_info_log(remote_path, filter_path=disk_path)
run_qemu <<EOF vm.launch()
{ "execute": "qmp_capabilities" } blockdev_create(vm, { 'driver': 'ssh',
{ "execute": "x-blockdev-create", 'location': {
"arguments": { 'path': disk_path,
"driver": "ssh", 'server': {
"location": { 'host': '127.0.0.1',
"path": "$TEST_IMG_FILE", 'port': '22'
"server": { },
"host": "127.0.0.1", 'host-key-check': {
"port": "22" 'mode': 'known_hosts'
}, }
"host-key-check": { },
"mode": "known_hosts" 'size': 4194304 })
} vm.shutdown()
},
"size": 4194304
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info iotests.img_info_log(remote_path, filter_path=disk_path)
md5_key = subprocess.check_output(
'ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | ' +
'cut -d" " -f3 | base64 -d | md5sum -b | cut -d" " -f1',
shell=True).rstrip()
key=$(ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | vm.launch()
cut -d" " -f3 | base64 -d | md5sum -b | cut -d" " -f1) blockdev_create(vm, { 'driver': 'ssh',
'location': {
'path': disk_path,
'server': {
'host': '127.0.0.1',
'port': '22'
},
'host-key-check': {
'mode': 'hash',
'type': 'md5',
'hash': 'wrong',
}
},
'size': 2097152 })
blockdev_create(vm, { 'driver': 'ssh',
'location': {
'path': disk_path,
'server': {
'host': '127.0.0.1',
'port': '22'
},
'host-key-check': {
'mode': 'hash',
'type': 'md5',
'hash': md5_key,
}
},
'size': 8388608 })
vm.shutdown()
run_qemu <<EOF iotests.img_info_log(remote_path, filter_path=disk_path)
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "ssh",
"location": {
"path": "$TEST_IMG_FILE",
"server": {
"host": "127.0.0.1",
"port": "22"
},
"host-key-check": {
"mode": "hash",
"type": "md5",
"hash": "wrong"
}
},
"size": 8388608
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "ssh",
"location": {
"path": "$TEST_IMG_FILE",
"server": {
"host": "127.0.0.1",
"port": "22"
},
"host-key-check": {
"mode": "hash",
"type": "md5",
"hash": "$key"
}
},
"size": 8388608
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info sha1_key = subprocess.check_output(
'ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | ' +
'cut -d" " -f3 | base64 -d | sha1sum -b | cut -d" " -f1',
shell=True).rstrip()
vm.launch()
blockdev_create(vm, { 'driver': 'ssh',
'location': {
'path': disk_path,
'server': {
'host': '127.0.0.1',
'port': '22'
},
'host-key-check': {
'mode': 'hash',
'type': 'sha1',
'hash': 'wrong',
}
},
'size': 2097152 })
blockdev_create(vm, { 'driver': 'ssh',
'location': {
'path': disk_path,
'server': {
'host': '127.0.0.1',
'port': '22'
},
'host-key-check': {
'mode': 'hash',
'type': 'sha1',
'hash': sha1_key,
}
},
'size': 4194304 })
vm.shutdown()
key=$(ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" | iotests.img_info_log(remote_path, filter_path=disk_path)
cut -d" " -f3 | base64 -d | sha1sum -b | cut -d" " -f1)
run_qemu <<EOF #
{ "execute": "qmp_capabilities" } # Invalid path and user
{ "execute": "x-blockdev-create", #
"arguments": { iotests.log("=== Invalid path and user ===")
"driver": "ssh", iotests.log("")
"location": {
"path": "$TEST_IMG_FILE",
"server": {
"host": "127.0.0.1",
"port": "22"
},
"host-key-check": {
"mode": "hash",
"type": "sha1",
"hash": "wrong"
}
},
"size": 4194304
}
}
{ "execute": "x-blockdev-create",
"arguments": {
"driver": "ssh",
"location": {
"path": "$TEST_IMG_FILE",
"server": {
"host": "127.0.0.1",
"port": "22"
},
"host-key-check": {
"mode": "hash",
"type": "sha1",
"hash": "$key"
}
},
"size": 4194304
}
}
{ "execute": "quit" }
EOF
_img_info | _filter_img_info vm.launch()
blockdev_create(vm, { 'driver': 'ssh',
echo 'location': {
echo "=== Invalid path and user ===" 'path': '/this/is/not/an/existing/path',
echo 'server': {
'host': '127.0.0.1',
run_qemu <<EOF 'port': '22'
{ "execute": "qmp_capabilities" } },
{ "execute": "x-blockdev-create", 'host-key-check': {
"arguments": { 'mode': 'none'
"driver": "ssh", }
"location": { },
"path": "/this/is/not/an/existing/path", 'size': 4194304 })
"server": { blockdev_create(vm, { 'driver': 'ssh',
"host": "127.0.0.1", 'location': {
"port": "22" 'path': disk_path,
} 'user': 'invalid user',
}, 'server': {
"size": 4194304 'host': '127.0.0.1',
} 'port': '22'
} },
{ "execute": "x-blockdev-create", 'host-key-check': {
"arguments": { 'mode': 'none'
"driver": "ssh", }
"location": { },
"path": "$TEST_IMG_FILE", 'size': 4194304 })
"user": "invalid user", vm.shutdown()
"server": {
"host": "127.0.0.1",
"port": "22"
}
},
"size": 4194304
}
}
{ "execute": "quit" }
EOF
# success, all done
echo "*** done"
rm -f $seq.full
status=0

View File

@ -1,75 +1,80 @@
QA output created by 207
=== Successful image creation (defaults) === === Successful image creation (defaults) ===
Testing: {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
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": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_DIR/t.IMGFMT"}} image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_IMG"}}
file format: IMGFMT file format: IMGFMT
virtual size: 4.0M (4194304 bytes) virtual size: 4.0M (4194304 bytes)
image: TEST_DIR/t.IMGFMT
image: TEST_IMG
file format: IMGFMT file format: IMGFMT
virtual size: 4.0M (4194304 bytes) virtual size: 4.0M (4194304 bytes)
=== Test host-key-check options === === Test host-key-check options ===
Testing: {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'none'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 8388608}}}
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": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_DIR/t.IMGFMT"}} image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_IMG"}}
file format: IMGFMT file format: IMGFMT
virtual size: 8.0M (8388608 bytes) virtual size: 8.0M (8388608 bytes)
Testing:
QMP_VERSION
{"return": {}}
{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_DIR/t.IMGFMT"}} {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'known_hosts'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
{u'return': {}}
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_IMG"}}
file format: IMGFMT file format: IMGFMT
virtual size: 4.0M (4194304 bytes) virtual size: 4.0M (4194304 bytes)
Testing:
QMP_VERSION
{"return": {}}
{"error": {"class": "GenericError", "desc": "remote host key does not match host_key_check 'wrong'"}}
{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_DIR/t.IMGFMT"}} {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': 'wrong', 'type': 'md5', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 2097152}}}
{u'return': {}}
Job failed: remote host key does not match host_key_check 'wrong'
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': HASH, 'type': 'md5', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 8388608}}}
{u'return': {}}
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_IMG"}}
file format: IMGFMT file format: IMGFMT
virtual size: 8.0M (8388608 bytes) virtual size: 8.0M (8388608 bytes)
Testing:
QMP_VERSION
{"return": {}}
{"error": {"class": "GenericError", "desc": "remote host key does not match host_key_check 'wrong'"}}
{"return": {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_DIR/t.IMGFMT"}} {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': 'wrong', 'type': 'sha1', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 2097152}}}
{u'return': {}}
Job failed: remote host key does not match host_key_check 'wrong'
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
{'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'hash': HASH, 'type': 'sha1', 'mode': 'hash'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
{u'return': {}}
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "server.port": "22", "driver": "ssh", "path": "TEST_IMG"}}
file format: IMGFMT file format: IMGFMT
virtual size: 4.0M (4194304 bytes) virtual size: 4.0M (4194304 bytes)
=== Invalid path and user === === Invalid path and user ===
Testing: {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': '/this/is/not/an/existing/path', 'host-key-check': {'mode': 'none'}, 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
QMP_VERSION {u'return': {}}
{"return": {}} Job failed: failed to open remote file '/this/is/not/an/existing/path': Failed opening remote file (libssh2 error code: -31)
{"error": {"class": "GenericError", "desc": "failed to open remote file '/this/is/not/an/existing/path': Failed opening remote file (libssh2 error code: -31)"}} {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{"error": {"class": "GenericError", "desc": "failed to authenticate using publickey authentication and the identities held by your ssh-agent"}} {u'return': {}}
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}} {'execute': 'x-blockdev-create', 'arguments': {'job_id': 'job0', 'options': {'driver': 'ssh', 'location': {'path': 'TEST_DIR/PID-t.img', 'host-key-check': {'mode': 'none'}, 'user': 'invalid user', 'server': {'host': '127.0.0.1', 'port': '22'}}, 'size': 4194304}}}
{u'return': {}}
Job failed: failed to authenticate using publickey authentication and the identities held by your ssh-agent
{'execute': 'job-dismiss', 'arguments': {'id': 'job0'}}
{u'return': {}}
*** done

View File

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