#!/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 Hanna Reitz <hreitz@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('')

    qemu_img('create', '-f', iotests.imgfmt, base_img_path, '64M')
    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
    qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
             '-F', iotests.imgfmt, mid_img_path)
    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
    qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
             '-F', iotests.imgfmt, top_img_path)
    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
    qemu_img('rebase', '-u', '-b', '', '-f', iotests.imgfmt, top_img_path)

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