summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPeter Maydell2019-01-31 20:26:09 +0100
committerPeter Maydell2019-01-31 20:26:09 +0100
commitcfe6c547690b06fbce54a6d0f7b05dd7f18e36ea (patch)
tree103fb713da1c3ba222cb025f7b47899fb339596f /tests
parentMerge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-reques... (diff)
parentiotests: Allow 147 to be run concurrently (diff)
downloadqemu-cfe6c547690b06fbce54a6d0f7b05dd7f18e36ea.tar.gz
qemu-cfe6c547690b06fbce54a6d0f7b05dd7f18e36ea.tar.xz
qemu-cfe6c547690b06fbce54a6d0f7b05dd7f18e36ea.zip
Merge remote-tracking branch 'remotes/xanclic/tags/pull-block-2019-01-31' into staging
Block patches: - New debugging QMP command to explore block graphs - Converted DPRINTF()s to trace events - Fixed qemu-io's use of getopt() for systems with optreset - Minor NVMe emulation fixes - An iotest fix # gpg: Signature made Thu 31 Jan 2019 00:51:46 GMT # gpg: using RSA key F407DB0061D5CF40 # gpg: Good signature from "Max Reitz <mreitz@redhat.com>" [full] # Primary key fingerprint: 91BE B60A 30DB 3E88 57D1 1829 F407 DB00 61D5 CF40 * remotes/xanclic/tags/pull-block-2019-01-31: iotests: Allow 147 to be run concurrently iotests: Bind qemu-nbd to localhost in 147 iotests.py: Add qemu_nbd_pipe() nvme: use pci_dev directly in nvme_realize nvme: ensure the num_queues is not zero nvme: use TYPE_NVME instead of constant string qemu-io: Add generic function for reinitializing optind. block/sheepdog: Convert from DPRINTF() macro to trace events block/file-posix: Convert from DPRINTF() macro to trace events block/curl: Convert from DPRINTF() macro to trace events block/ssh: Convert from DPRINTF() macro to trace events scripts: add render_block_graph function for QEMUMachine qapi: add x-debug-query-block-graph Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
-rwxr-xr-xtests/qemu-iotests/14798
-rw-r--r--tests/qemu-iotests/iotests.py14
2 files changed, 82 insertions, 30 deletions
diff --git a/tests/qemu-iotests/147 b/tests/qemu-iotests/147
index 05b374b7d3..82513279b0 100755
--- a/tests/qemu-iotests/147
+++ b/tests/qemu-iotests/147
@@ -19,13 +19,17 @@
#
import os
+import random
import socket
import stat
import time
import iotests
-from iotests import cachemode, imgfmt, qemu_img, qemu_nbd
+from iotests import cachemode, imgfmt, qemu_img, qemu_nbd, qemu_nbd_pipe
-NBD_PORT = 10811
+NBD_PORT_START = 32768
+NBD_PORT_END = NBD_PORT_START + 1024
+NBD_IPV6_PORT_START = NBD_PORT_END
+NBD_IPV6_PORT_END = NBD_IPV6_PORT_START + 1024
test_img = os.path.join(iotests.test_dir, 'test.img')
unix_socket = os.path.join(iotests.test_dir, 'nbd.socket')
@@ -88,17 +92,29 @@ class QemuNBD(NBDBlockdevAddBase):
except OSError:
pass
+ def _try_server_up(self, *args):
+ status, msg = qemu_nbd_pipe('-f', imgfmt, test_img, *args)
+ if status == 0:
+ return True
+ if 'Address already in use' in msg:
+ return False
+ self.fail(msg)
+
def _server_up(self, *args):
- self.assertEqual(qemu_nbd('-f', imgfmt, test_img, *args), 0)
+ self.assertTrue(self._try_server_up(*args))
def test_inet(self):
- self._server_up('-p', str(NBD_PORT))
+ while True:
+ nbd_port = random.randrange(NBD_PORT_START, NBD_PORT_END)
+ if self._try_server_up('-b', 'localhost', '-p', str(nbd_port)):
+ break
+
address = { 'type': 'inet',
'data': {
'host': 'localhost',
- 'port': str(NBD_PORT)
+ 'port': str(nbd_port)
} }
- self.client_test('nbd://localhost:%i' % NBD_PORT,
+ self.client_test('nbd://localhost:%i' % nbd_port,
flatten_sock_addr(address))
def test_unix(self):
@@ -130,8 +146,13 @@ class BuiltinNBD(NBDBlockdevAddBase):
except OSError:
pass
- def _server_up(self, address, export_name=None, export_name2=None):
+ # Returns False on EADDRINUSE; fails an assertion on other errors.
+ # Returns True on success.
+ def _try_server_up(self, address, export_name=None, export_name2=None):
result = self.server.qmp('nbd-server-start', addr=address)
+ if 'error' in result and \
+ 'Address already in use' in result['error']['desc']:
+ return False
self.assert_qmp(result, 'return', {})
if export_name is None:
@@ -146,20 +167,28 @@ class BuiltinNBD(NBDBlockdevAddBase):
name=export_name2)
self.assert_qmp(result, 'return', {})
+ return True
+
+ def _server_up(self, address, export_name=None, export_name2=None):
+ self.assertTrue(self._try_server_up(address, export_name, export_name2))
def _server_down(self):
result = self.server.qmp('nbd-server-stop')
self.assert_qmp(result, 'return', {})
def do_test_inet(self, export_name=None):
- address = { 'type': 'inet',
- 'data': {
- 'host': 'localhost',
- 'port': str(NBD_PORT)
- } }
- self._server_up(address, export_name)
+ while True:
+ nbd_port = random.randrange(NBD_PORT_START, NBD_PORT_END)
+ address = { 'type': 'inet',
+ 'data': {
+ 'host': 'localhost',
+ 'port': str(nbd_port)
+ } }
+ if self._try_server_up(address, export_name):
+ break
+
export_name = export_name or 'nbd-export'
- self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, export_name),
+ self.client_test('nbd://localhost:%i/%s' % (nbd_port, export_name),
flatten_sock_addr(address), export_name)
self._server_down()
@@ -173,15 +202,19 @@ class BuiltinNBD(NBDBlockdevAddBase):
self.do_test_inet('shadow')
def test_inet_two_exports(self):
- address = { 'type': 'inet',
- 'data': {
- 'host': 'localhost',
- 'port': str(NBD_PORT)
- } }
- self._server_up(address, 'exp1', 'exp2')
- self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, 'exp1'),
+ while True:
+ nbd_port = random.randrange(NBD_PORT_START, NBD_PORT_END)
+ address = { 'type': 'inet',
+ 'data': {
+ 'host': 'localhost',
+ 'port': str(nbd_port)
+ } }
+ if self._try_server_up(address, 'exp1', 'exp2'):
+ break
+
+ self.client_test('nbd://localhost:%i/%s' % (nbd_port, 'exp1'),
flatten_sock_addr(address), 'exp1', 'node1', False)
- self.client_test('nbd://localhost:%i/%s' % (NBD_PORT, 'exp2'),
+ self.client_test('nbd://localhost:%i/%s' % (nbd_port, 'exp2'),
flatten_sock_addr(address), 'exp2', 'node2', False)
result = self.vm.qmp('blockdev-del', node_name='node1')
self.assert_qmp(result, 'return', {})
@@ -197,20 +230,25 @@ class BuiltinNBD(NBDBlockdevAddBase):
except socket.gaierror:
# IPv6 not available, skip
return
- address = { 'type': 'inet',
- 'data': {
- 'host': '::1',
- 'port': str(NBD_PORT),
- 'ipv4': False,
- 'ipv6': True
- } }
+
+ while True:
+ nbd_port = random.randrange(NBD_IPV6_PORT_START, NBD_IPV6_PORT_END)
+ address = { 'type': 'inet',
+ 'data': {
+ 'host': '::1',
+ 'port': str(nbd_port),
+ 'ipv4': False,
+ 'ipv6': True
+ } }
+ if self._try_server_up(address):
+ break
+
filename = { 'driver': 'raw',
'file': {
'driver': 'nbd',
'export': 'nbd-export',
'server': flatten_sock_addr(address)
} }
- self._server_up(address)
self.client_test(filename, flatten_sock_addr(address), 'nbd-export')
self._server_down()
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index cbedfaf1df..009c614ef7 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -201,6 +201,20 @@ def qemu_nbd(*args):
'''Run qemu-nbd in daemon mode and return the parent's exit code'''
return subprocess.call(qemu_nbd_args + ['--fork'] + list(args))
+def qemu_nbd_pipe(*args):
+ '''Run qemu-nbd in daemon mode and return both the parent's exit code
+ and its output'''
+ subp = subprocess.Popen(qemu_nbd_args + ['--fork'] + list(args),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True)
+ exitcode = subp.wait()
+ if exitcode < 0:
+ sys.stderr.write('qemu-nbd received signal %i: %s\n' %
+ (-exitcode,
+ ' '.join(qemu_nbd_args + ['--fork'] + list(args))))
+ return exitcode, subp.communicate()[0]
+
def compare_images(img1, img2, fmt1=imgfmt, fmt2=imgfmt):
'''Return True if two image files are identical'''
return qemu_img('compare', '-f', fmt1,