Browse Source
The test case #310 is similar to #216 by Max Reitz. The difference is that the test #310 involves a bottom node to the COR filter driver. Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> [vsementsov: detach backing to test reads from top, limit to qcow2] Message-Id: <20201216061703.70908-7-vsementsov@virtuozzo.com> [mreitz: Add "# group:" line] Signed-off-by: Max Reitz <mreitz@redhat.com>pull/109/head
committed by
Max Reitz
3 changed files with 133 additions and 0 deletions
@ -0,0 +1,117 @@ |
|||
#!/usr/bin/env python3 |
|||
# group: rw quick |
|||
# |
|||
# Copy-on-read tests using a COR filter with a bottom node |
|||
# |
|||
# Copyright (C) 2018 Red Hat, Inc. |
|||
# Copyright (c) 2020 Virtuozzo International GmbH |
|||
# |
|||
# 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/>. |
|||
# |
|||
|
|||
import iotests |
|||
from iotests import log, qemu_img, qemu_io_silent |
|||
|
|||
# Need backing file support |
|||
iotests.script_initialize(supported_fmts=['qcow2'], |
|||
supported_platforms=['linux']) |
|||
|
|||
log('') |
|||
log('=== Copy-on-read across nodes ===') |
|||
log('') |
|||
|
|||
# This test is similar to the 216 one by Max Reitz <mreitz@redhat.com> |
|||
# The difference is that this test case involves a bottom node to the |
|||
# COR filter driver. |
|||
|
|||
with iotests.FilePath('base.img') as base_img_path, \ |
|||
iotests.FilePath('mid.img') as mid_img_path, \ |
|||
iotests.FilePath('top.img') as top_img_path, \ |
|||
iotests.VM() as vm: |
|||
|
|||
log('--- Setting up images ---') |
|||
log('') |
|||
|
|||
assert qemu_img('create', '-f', iotests.imgfmt, base_img_path, '64M') == 0 |
|||
assert qemu_io_silent(base_img_path, '-c', 'write -P 1 0M 1M') == 0 |
|||
assert qemu_io_silent(base_img_path, '-c', 'write -P 1 3M 1M') == 0 |
|||
assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path, |
|||
'-F', iotests.imgfmt, mid_img_path) == 0 |
|||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 2M 1M') == 0 |
|||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 4M 1M') == 0 |
|||
assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path, |
|||
'-F', iotests.imgfmt, top_img_path) == 0 |
|||
assert qemu_io_silent(top_img_path, '-c', 'write -P 2 1M 1M') == 0 |
|||
|
|||
# 0 1 2 3 4 |
|||
# top 2 |
|||
# mid 3 3 |
|||
# base 1 1 |
|||
|
|||
log('Done') |
|||
|
|||
log('') |
|||
log('--- Doing COR ---') |
|||
log('') |
|||
|
|||
vm.launch() |
|||
|
|||
log(vm.qmp('blockdev-add', |
|||
node_name='node0', |
|||
driver='copy-on-read', |
|||
bottom='node2', |
|||
file={ |
|||
'driver': iotests.imgfmt, |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': top_img_path |
|||
}, |
|||
'backing': { |
|||
'node-name': 'node2', |
|||
'driver': iotests.imgfmt, |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': mid_img_path |
|||
}, |
|||
'backing': { |
|||
'driver': iotests.imgfmt, |
|||
'file': { |
|||
'driver': 'file', |
|||
'filename': base_img_path |
|||
} |
|||
}, |
|||
} |
|||
})) |
|||
|
|||
# Trigger COR |
|||
log(vm.qmp('human-monitor-command', |
|||
command_line='qemu-io node0 "read 0 5M"')) |
|||
|
|||
vm.shutdown() |
|||
|
|||
log('') |
|||
log('--- Checking COR result ---') |
|||
log('') |
|||
|
|||
# Detach backing to check that we can read the data from the top level now |
|||
assert qemu_img('rebase', '-u', '-b', '', '-f', iotests.imgfmt, |
|||
top_img_path) == 0 |
|||
|
|||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 0 1M') == 0 |
|||
assert qemu_io_silent(top_img_path, '-c', 'read -P 2 1M 1M') == 0 |
|||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 2M 1M') == 0 |
|||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 3M 1M') == 0 |
|||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 4M 1M') == 0 |
|||
|
|||
log('Done') |
|||
@ -0,0 +1,15 @@ |
|||
|
|||
=== Copy-on-read across nodes === |
|||
|
|||
--- Setting up images --- |
|||
|
|||
Done |
|||
|
|||
--- Doing COR --- |
|||
|
|||
{"return": {}} |
|||
{"return": ""} |
|||
|
|||
--- Checking COR result --- |
|||
|
|||
Done |
|||
Loading…
Reference in new issue