#!/usr/bin/env python3
#
# Test persistent bitmap resizing.
#
# 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=jsnow@redhat.com

import iotests
from iotests import log

iotests.verify_image_format(supported_fmts=['qcow2'])
size = 64 * 1024 * 1024 * 1024
gran_small = 32 * 1024
gran_large = 128 * 1024

def query_bitmaps(vm):
    res = vm.qmp("query-block")
    return { "bitmaps": { device['device']: device.get('dirty-bitmaps', []) for
                          device in res['return'] } }

with iotests.FilePath('img') as img_path, \
     iotests.VM() as vm:

    log('--- Preparing image & VM ---\n')
    iotests.qemu_img_create('-f', iotests.imgfmt, img_path, str(size))
    vm.add_drive(img_path)


    log('--- 1st Boot (Establish Baseline Image) ---\n')
    vm.launch()

    log('\n--- Adding bitmaps Small, Medium, Large, and Transient ---\n')
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="Small", granularity=gran_small, persistent=True)
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="Medium", persistent=True)
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="Large", granularity=gran_large, persistent=True)
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="Transient", persistent=False)

    log('--- Forcing flush of bitmaps to disk ---\n')
    log(query_bitmaps(vm), indent=2)
    vm.shutdown()


    log('--- 2nd Boot (Grow Image) ---\n')
    vm.launch()
    log(query_bitmaps(vm), indent=2)

    log('--- Adding new bitmap, growing image, and adding 2nd new bitmap ---')
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="New", persistent=True)
    vm.qmp_log("human-monitor-command",
               command_line="block_resize drive0 70G")
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="Newtwo", persistent=True)
    log(query_bitmaps(vm), indent=2)

    log('--- Forcing flush of bitmaps to disk ---\n')
    vm.shutdown()


    log('--- 3rd Boot (Shrink Image) ---\n')
    vm.launch()
    log(query_bitmaps(vm), indent=2)

    log('--- Adding "NewB" bitmap, removing "New" bitmap ---')
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="NewB", persistent=True)
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0",
               name="New")

    log('--- Truncating image ---\n')
    vm.qmp_log("human-monitor-command",
               command_line="block_resize drive0 50G")

    log('--- Adding "NewC" bitmap, removing "NewTwo" bitmap ---')
    vm.qmp_log("block-dirty-bitmap-add", node="drive0",
               name="NewC", persistent=True)
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="Newtwo")

    log('--- Forcing flush of bitmaps to disk ---\n')
    vm.shutdown()


    log('--- 4th Boot (Verification and Cleanup) ---\n')
    vm.launch()
    log(query_bitmaps(vm), indent=2)

    log('--- Removing all Bitmaps ---\n')
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="Small")
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="Medium")
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="Large")
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="NewB")
    vm.qmp_log("block-dirty-bitmap-remove", node="drive0", name="NewC")
    log(query_bitmaps(vm), indent=2)

    log('\n--- Done ---')
    vm.shutdown()
