[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 05/20] iotests: add iotest 256 for testing blockdev-b
From: |
Max Reitz |
Subject: |
[Qemu-block] [PULL 05/20] iotests: add iotest 256 for testing blockdev-backup across iothread contexts |
Date: |
Fri, 14 Jun 2019 15:40:06 +0200 |
From: John Snow <address@hidden>
Signed-off-by: John Snow <address@hidden>
Message-id: address@hidden
Reviewed-by: Max Reitz <address@hidden>
[mreitz: Moved from 250 to 256]
Signed-off-by: Max Reitz <address@hidden>
---
tests/qemu-iotests/256 | 122 +++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/256.out | 119 ++++++++++++++++++++++++++++++++++++
tests/qemu-iotests/group | 1 +
3 files changed, 242 insertions(+)
create mode 100755 tests/qemu-iotests/256
create mode 100644 tests/qemu-iotests/256.out
diff --git a/tests/qemu-iotests/256 b/tests/qemu-iotests/256
new file mode 100755
index 0000000000..c594a43205
--- /dev/null
+++ b/tests/qemu-iotests/256
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+#
+# Test incremental/backup across iothread contexts
+#
+# Copyright (c) 2019 John Snow for Red Hat, Inc.
+#
+# 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
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# owner=address@hidden
+
+import os
+import iotests
+from iotests import log
+
+iotests.verify_image_format(supported_fmts=['qcow2'])
+size = 64 * 1024 * 1024
+
+with iotests.FilePath('img0') as img0_path, \
+ iotests.FilePath('img1') as img1_path, \
+ iotests.FilePath('img0-full') as img0_full_path, \
+ iotests.FilePath('img1-full') as img1_full_path, \
+ iotests.FilePath('img0-incr') as img0_incr_path, \
+ iotests.FilePath('img1-incr') as img1_incr_path, \
+ iotests.VM() as vm:
+
+ def create_target(filepath, name, size):
+ basename = os.path.basename(filepath)
+ nodename = "file_{}".format(basename)
+ log(vm.command('blockdev-create', job_id='job1',
+ options={
+ 'driver': 'file',
+ 'filename': filepath,
+ 'size': 0,
+ }))
+ vm.run_job('job1')
+ log(vm.command('blockdev-add', driver='file',
+ node_name=nodename, filename=filepath))
+ log(vm.command('blockdev-create', job_id='job2',
+ options={
+ 'driver': iotests.imgfmt,
+ 'file': nodename,
+ 'size': size,
+ }))
+ vm.run_job('job2')
+ log(vm.command('blockdev-add', driver=iotests.imgfmt,
+ node_name=name,
+ file=nodename))
+
+ log('--- Preparing images & VM ---\n')
+ vm.add_object('iothread,id=iothread0')
+ vm.add_object('iothread,id=iothread1')
+ vm.add_device('virtio-scsi-pci,id=scsi0,iothread=iothread0')
+ vm.add_device('virtio-scsi-pci,id=scsi1,iothread=iothread1')
+ iotests.qemu_img_create('-f', iotests.imgfmt, img0_path, str(size))
+ iotests.qemu_img_create('-f', iotests.imgfmt, img1_path, str(size))
+ vm.add_drive(img0_path, interface='none')
+ vm.add_device('scsi-hd,id=device0,drive=drive0,bus=scsi0.0')
+ vm.add_drive(img1_path, interface='none')
+ vm.add_device('scsi-hd,id=device1,drive=drive1,bus=scsi1.0')
+
+ log('--- Starting VM ---\n')
+ vm.launch()
+
+ log('--- Create Targets & Full Backups ---\n')
+ create_target(img0_full_path, 'img0-full', size)
+ create_target(img1_full_path, 'img1-full', size)
+ ret = vm.qmp_log('transaction', indent=2, actions=[
+ { 'type': 'block-dirty-bitmap-add',
+ 'data': { 'node': 'drive0', 'name': 'bitmap0' }},
+ { 'type': 'block-dirty-bitmap-add',
+ 'data': { 'node': 'drive1', 'name': 'bitmap1' }},
+ { 'type': 'blockdev-backup',
+ 'data': { 'device': 'drive0',
+ 'target': 'img0-full',
+ 'sync': 'full',
+ 'job-id': 'j0' }},
+ { 'type': 'blockdev-backup',
+ 'data': { 'device': 'drive1',
+ 'target': 'img1-full',
+ 'sync': 'full',
+ 'job-id': 'j1' }}
+ ])
+ if "error" in ret:
+ raise Exception(ret['error']['desc'])
+ vm.run_job('j0', auto_dismiss=True)
+ vm.run_job('j1', auto_dismiss=True)
+
+ log('\n--- Create Targets & Incremental Backups ---\n')
+ create_target(img0_incr_path, 'img0-incr', size)
+ create_target(img1_incr_path, 'img1-incr', size)
+ ret = vm.qmp_log('transaction', indent=2, actions=[
+ { 'type': 'blockdev-backup',
+ 'data': { 'device': 'drive0',
+ 'target': 'img0-incr',
+ 'sync': 'incremental',
+ 'bitmap': 'bitmap0',
+ 'job-id': 'j2' }},
+ { 'type': 'blockdev-backup',
+ 'data': { 'device': 'drive1',
+ 'target': 'img1-incr',
+ 'sync': 'incremental',
+ 'bitmap': 'bitmap1',
+ 'job-id': 'j3' }}
+ ])
+ if "error" in ret:
+ raise Exception(ret['error']['desc'])
+ vm.run_job('j2', auto_dismiss=True)
+ vm.run_job('j3', auto_dismiss=True)
+
+ log('\n--- Done ---')
+ vm.shutdown()
diff --git a/tests/qemu-iotests/256.out b/tests/qemu-iotests/256.out
new file mode 100644
index 0000000000..eec38614ec
--- /dev/null
+++ b/tests/qemu-iotests/256.out
@@ -0,0 +1,119 @@
+--- Preparing images & VM ---
+
+--- Starting VM ---
+
+--- Create Targets & Full Backups ---
+
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job1"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job2"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job1"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job2"}}
+{"return": {}}
+{}
+{
+ "execute": "transaction",
+ "arguments": {
+ "actions": [
+ {
+ "data": {
+ "name": "bitmap0",
+ "node": "drive0"
+ },
+ "type": "block-dirty-bitmap-add"
+ },
+ {
+ "data": {
+ "name": "bitmap1",
+ "node": "drive1"
+ },
+ "type": "block-dirty-bitmap-add"
+ },
+ {
+ "data": {
+ "device": "drive0",
+ "job-id": "j0",
+ "sync": "full",
+ "target": "img0-full"
+ },
+ "type": "blockdev-backup"
+ },
+ {
+ "data": {
+ "device": "drive1",
+ "job-id": "j1",
+ "sync": "full",
+ "target": "img1-full"
+ },
+ "type": "blockdev-backup"
+ }
+ ]
+ }
+}
+{
+ "return": {}
+}
+{"data": {"device": "j0", "len": 67108864, "offset": 67108864, "speed": 0,
"type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp":
{"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"device": "j1", "len": 67108864, "offset": 67108864, "speed": 0,
"type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp":
{"microseconds": "USECS", "seconds": "SECS"}}
+
+--- Create Targets & Incremental Backups ---
+
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job1"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job2"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job1"}}
+{"return": {}}
+{}
+{}
+{"execute": "job-dismiss", "arguments": {"id": "job2"}}
+{"return": {}}
+{}
+{
+ "execute": "transaction",
+ "arguments": {
+ "actions": [
+ {
+ "data": {
+ "bitmap": "bitmap0",
+ "device": "drive0",
+ "job-id": "j2",
+ "sync": "incremental",
+ "target": "img0-incr"
+ },
+ "type": "blockdev-backup"
+ },
+ {
+ "data": {
+ "bitmap": "bitmap1",
+ "device": "drive1",
+ "job-id": "j3",
+ "sync": "incremental",
+ "target": "img1-incr"
+ },
+ "type": "blockdev-backup"
+ }
+ ]
+ }
+}
+{
+ "return": {}
+}
+{"data": {"device": "j2", "len": 67108864, "offset": 67108864, "speed": 0,
"type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp":
{"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"device": "j3", "len": 67108864, "offset": 67108864, "speed": 0,
"type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp":
{"microseconds": "USECS", "seconds": "SECS"}}
+
+--- Done ---
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
index f3b6d601b2..0842167b7b 100644
--- a/tests/qemu-iotests/group
+++ b/tests/qemu-iotests/group
@@ -267,3 +267,4 @@
253 rw auto quick
254 rw auto backing quick
255 rw auto quick
+256 rw auto quick
--
2.21.0
- [Qemu-block] [PULL 00/20] Block patches, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 01/20] blockdev-backup: don't check aio_context too early, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 04/20] iotests.py: rewrite run_job to be pickier, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 02/20] iotests.py: do not use infinite waits, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 06/20] event_match: always match on None value, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 08/20] iotests: Fix intermittent failure in 219, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 07/20] iotests: Filter 175's allocation information, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 03/20] QEMUMachine: add events_wait method, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 05/20] iotests: add iotest 256 for testing blockdev-backup across iothread contexts,
Max Reitz <=
- [Qemu-block] [PULL 09/20] hw/block/fdc: floppy command FIFO memory initialization, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 10/20] iotests: restrict 254 to support only qcow2, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 12/20] qapi/block-core: Overlays are not snapshots, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 11/20] qemu-img: Fix options leakage in img_rebase(), Max Reitz, 2019/06/14
- [Qemu-block] [PULL 14/20] qemu-img: Move quiet into ImgConvertState, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 13/20] blockdev: Overlays are not snapshots, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 15/20] qemu-img: Add salvaging mode to convert, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 16/20] blkdebug: Add @iotype error option, Max Reitz, 2019/06/14
- [Qemu-block] [PULL 18/20] blkdebug: Inject errors on .bdrv_co_block_status(), Max Reitz, 2019/06/14
- [Qemu-block] [PULL 17/20] blkdebug: Add "none" event, Max Reitz, 2019/06/14