#!/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

# 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')
    qemu_io(base_img_path, '-c', 'write -P 1 0M 1M')
    qemu_io(base_img_path, '-c', 'write -P 1 3M 1M')
    qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
             '-F', iotests.imgfmt, mid_img_path)
    qemu_io(mid_img_path, '-c', 'write -P 3 2M 1M')
    qemu_io(mid_img_path, '-c', 'write -P 3 4M 1M')
    qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
             '-F', iotests.imgfmt, top_img_path)
    qemu_io(top_img_path, '-c', 'write -P 2 1M 1M')

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

    qemu_io(top_img_path, '-c', 'read -P 0 0 1M')
    qemu_io(top_img_path, '-c', 'read -P 2 1M 1M')
    qemu_io(top_img_path, '-c', 'read -P 3 2M 1M')
    qemu_io(top_img_path, '-c', 'read -P 0 3M 1M')
    qemu_io(top_img_path, '-c', 'read -P 3 4M 1M')

    log('Done')
