#!/usr/bin/env python3
#
# Test for backup-top filter permission activation failure
#
# Copyright (c) 2019 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

# The test is unrelated to formats, restrict it to qcow2 to avoid extra runs
iotests.script_initialize(
    supported_fmts=['qcow2'],
)

size = 1024 * 1024

""" Test description

When performing a backup, all writes on the source subtree must go through the
backup-top filter so it can copy all data to the target before it is changed.
backup-top filter is appended above source node, to achieve this thing, so all
parents of source node are handled. A configuration with side parents of source
sub-tree with write permission is unsupported (we'd have append several
backup-top filter like nodes to handle such parents). The test create an
example of such configuration and checks that a backup is then not allowed
(blockdev-backup command should fail).

The configuration:

    ┌────────┐  target  ┌─────────────┐
    │ target │ ◀─────── │ backup_top  │
    └────────┘          └─────────────┘
                            │
                            │ backing
                            ▼
                        ┌─────────────┐
                        │   source    │
                        └─────────────┘
                            │
                            │ file
                            ▼
                        ┌─────────────┐  write perm   ┌───────┐
                        │    base     │ ◀──────────── │ other │
                        └─────────────┘               └───────┘

On activation (see .active field of backup-top state in block/backup-top.c),
backup-top is going to unshare write permission on its source child. Write
unsharing will be propagated to the "source->base" link and will conflict with
other node write permission. So permission update will fail and backup job will
not be started.

Note, that the only thing which prevents backup of running on such
configuration is default permission propagation scheme. It may be altered by
different block drivers, so backup will run in invalid configuration. But
something is better than nothing. Also, before the previous commit (commit
preceding this test creation), starting backup on such configuration led to
crash, so current "something" is a lot better, and this test actual goal is
to check that crash is fixed :)
"""

vm = iotests.VM()
vm.launch()

vm.qmp_log('blockdev-add', **{
    'node-name': 'target',
    'driver': 'null-co',
    'size': size,
})

vm.qmp_log('blockdev-add', **{
    'node-name': 'source',
    'driver': 'blkdebug',
    'image': {'node-name': 'base', 'driver': 'null-co', 'size': size}
})

vm.qmp_log('blockdev-add', **{
    'node-name': 'other',
    'driver': 'blkdebug',
    'image': 'base',
    'take-child-perms': ['write']
})

vm.qmp_log('blockdev-backup', sync='full', device='source', target='target')

vm.shutdown()
