Commit 00af1935 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

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: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
parent 4de110f8
Loading
Loading
Loading
Loading
+198 −242
Original line number Diff line number Diff line
#!/bin/bash
#!/usr/bin/env python
#
# Test ssh image creation
#
# 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
# it under the terms of the GNU General Public License as published by
# 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/>.
#

# creator
owner=kwolf@redhat.com
import iotests
import subprocess
import re

seq=`basename $0`
echo "QA output created by $seq"
iotests.verify_image_format(supported_fmts=['raw'])
iotests.verify_protocol(supported=['ssh'])

here=`pwd`
status=1	# failure is the default!
def filter_hash(msg):
    return re.sub("'hash': '[0-9a-f]+'", "'hash': HASH", msg)

# get standard environment, filters and checks
. ./common.rc
. ./common.filter
def blockdev_create(vm, options):
    result = vm.qmp_log('x-blockdev-create', job_id='job0', options=options,
                        filters=[iotests.filter_testfiles, filter_hash])

_supported_fmt raw
_supported_proto ssh
_supported_os Linux
    if 'return' in result:
        assert result['return'] == {}
        vm.run_job('job0')
    iotests.log("")

function do_run_qemu()
{
    echo Testing: "$@"
    $QEMU -nographic -qmp stdio -serial none "$@"
    echo
}
with iotests.FilePath('t.img') as disk_path, \
     iotests.VM() as vm:

function run_qemu()
{
    do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \
                          | _filter_qemu | _filter_imgfmt \
                          | _filter_actual_image_size
}
    remote_path = iotests.remote_filename(disk_path)

echo
echo "=== Successful image creation (defaults) ==="
echo
    #
    # Successful image creation (defaults)
    #
    iotests.log("=== Successful image creation (defaults) ===")
    iotests.log("")

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
    vm.launch()
    blockdev_create(vm, { 'driver': 'ssh',
                          'location': {
                              'path': disk_path,
                              'server': {
                                  'host': '127.0.0.1',
                                  'port': '22'
                              }
                          },
      "size": 4194304
  }
}
{ "execute": "quit" }
EOF

_img_info | _filter_img_info
echo
TEST_IMG=$TEST_IMG_FILE _img_info | _filter_img_info
                          'size': 4194304 })
    vm.shutdown()

echo
echo "=== Test host-key-check options ==="
echo
    iotests.img_info_log(remote_path, filter_path=disk_path)
    iotests.log("")
    iotests.img_info_log(disk_path)

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
    #
    # Test host-key-check options
    #
    iotests.log("=== Test host-key-check options ===")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': 'ssh',
                          'location': {
                              'path': disk_path,
                              'server': {
                                  'host': '127.0.0.1',
                                  'port': '22'
                              },
          "host-key-check": {
              "mode": "none"
                              'host-key-check': {
                                  'mode': 'none'
                              }
                          },
      "size": 8388608
  }
}
{ "execute": "quit" }
EOF

_img_info | _filter_img_info

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
                          'size': 8388608 })
    vm.shutdown()

    iotests.img_info_log(remote_path, filter_path=disk_path)

    vm.launch()
    blockdev_create(vm, { 'driver': 'ssh',
                          'location': {
                              'path': disk_path,
                              'server': {
                                  'host': '127.0.0.1',
                                  'port': '22'
                              },
          "host-key-check": {
              "mode": "known_hosts"
                              'host-key-check': {
                                  'mode': 'known_hosts'
                              }
                          },
      "size": 4194304
  }
}
{ "execute": "quit" }
EOF

_img_info | _filter_img_info


key=$(ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" |
      cut -d" " -f3 | base64 -d | md5sum -b | cut -d" " -f1)

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
                          'size': 4194304 })
    vm.shutdown()

    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()

    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": "md5",
              "hash": "wrong"
                              '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"
                          '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": "$key"
                              'host-key-check': {
                                  'mode': 'hash',
                                  'type': 'md5',
                                  'hash': md5_key,
                              }
                          },
      "size": 8388608
  }
}
{ "execute": "quit" }
EOF

_img_info | _filter_img_info


key=$(ssh-keyscan -t rsa 127.0.0.1 2>/dev/null | grep -v "\\^#" |
      cut -d" " -f3 | base64 -d | sha1sum -b | cut -d" " -f1)

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
                          'size': 8388608 })
    vm.shutdown()

    iotests.img_info_log(remote_path, filter_path=disk_path)

    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"
                              '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"
                          '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": "$key"
                              'host-key-check': {
                                  'mode': 'hash',
                                  'type': 'sha1',
                                  'hash': sha1_key,
                              }
                          },
      "size": 4194304
  }
}
{ "execute": "quit" }
EOF
                          'size': 4194304 })
    vm.shutdown()

_img_info | _filter_img_info
    iotests.img_info_log(remote_path, filter_path=disk_path)

echo
echo "=== Invalid path and user ==="
echo

run_qemu <<EOF
{ "execute": "qmp_capabilities" }
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "/this/is/not/an/existing/path",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
          }
    #
    # Invalid path and user
    #
    iotests.log("=== Invalid path and user ===")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': 'ssh',
                          'location': {
                              'path': '/this/is/not/an/existing/path',
                              'server': {
                                  'host': '127.0.0.1',
                                  'port': '22'
                              },
      "size": 4194304
  }
}
{ "execute": "x-blockdev-create",
  "arguments": {
      "driver": "ssh",
      "location": {
          "path": "$TEST_IMG_FILE",
          "user": "invalid user",
          "server": {
              "host": "127.0.0.1",
              "port": "22"
                              'host-key-check': {
                                  'mode': 'none'
                              }
                          },
      "size": 4194304
  }
                          'size': 4194304 })
    blockdev_create(vm, { 'driver': 'ssh',
                          'location': {
                              'path': disk_path,
                              'user': 'invalid user',
                              'server': {
                                  'host': '127.0.0.1',
                                  'port': '22'
                              },
                              'host-key-check': {
                                  'mode': 'none'
                              }
{ "execute": "quit" }
EOF

# success, all done
echo "*** done"
rm -f $seq.full
status=0
                          },
                          'size': 4194304 })
    vm.shutdown()
+56 −51
Original line number Diff line number Diff line
QA output created by 207

=== Successful image creation (defaults) ===

Testing:
QMP_VERSION
{"return": {}}
{"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', '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_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
virtual size: 4.0M (4194304 bytes)

image: TEST_DIR/t.IMGFMT

image: TEST_IMG
file format: IMGFMT
virtual size: 4.0M (4194304 bytes)

=== Test host-key-check options ===

Testing:
QMP_VERSION
{"return": {}}
{"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'}, '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_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
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
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
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
virtual size: 4.0M (4194304 bytes)

=== Invalid path and user ===

Testing:
QMP_VERSION
{"return": {}}
{"error": {"class": "GenericError", "desc": "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 authenticate using publickey authentication and the identities held by your ssh-agent"}}
{"return": {}}
{"timestamp": {"seconds":  TIMESTAMP, "microseconds":  TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
{'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}}}
{u'return': {}}
Job failed: 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'}}
{u'return': {}}

{'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
+3 −3
Original line number Diff line number Diff line
@@ -205,11 +205,11 @@
204 rw auto quick
205 rw auto quick
206 rw auto
# TODO The following commented out tests need to be reworked to work
# with the x-blockdev-create job
#207 rw auto
207 rw auto
208 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
#211 rw auto quick
#212 rw auto quick