#!/usr/bin/env python3
#
# Tests for dirty bitmaps postcopy migration.
#
# Copyright (c) 2016-2017 Virtuozzo International GmbH. All rights reserved.
#
# 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 os
import iotests
import time
from iotests import qemu_img

disk_a = os.path.join(iotests.test_dir, 'disk_a')
disk_b = os.path.join(iotests.test_dir, 'disk_b')
size = '256G'
fifo = os.path.join(iotests.test_dir, 'mig_fifo')

class TestDirtyBitmapPostcopyMigration(iotests.QMPTestCase):

    def tearDown(self):
        self.vm_a.shutdown()
        self.vm_b.shutdown()
        os.remove(disk_a)
        os.remove(disk_b)
        os.remove(fifo)

    def setUp(self):
        os.mkfifo(fifo)
        qemu_img('create', '-f', iotests.imgfmt, disk_a, size)
        qemu_img('create', '-f', iotests.imgfmt, disk_b, size)
        self.vm_a = iotests.VM(path_suffix='a').add_drive(disk_a)
        self.vm_b = iotests.VM(path_suffix='b').add_drive(disk_b)
        self.vm_b.add_incoming("exec: cat '" + fifo + "'")
        self.vm_a.launch()
        self.vm_b.launch()

    def test_postcopy(self):
        write_size = 0x40000000
        granularity = 512
        chunk = 4096

        result = self.vm_a.qmp('block-dirty-bitmap-add', node='drive0',
                               name='bitmap', granularity=granularity)
        self.assert_qmp(result, 'return', {});

        s = 0
        while s < write_size:
            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
            s += 0x10000
        s = 0x8000
        while s < write_size:
            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
            s += 0x10000

        result = self.vm_a.qmp('x-debug-block-dirty-bitmap-sha256',
                               node='drive0', name='bitmap')
        sha256 = result['return']['sha256']

        result = self.vm_a.qmp('block-dirty-bitmap-clear', node='drive0',
                               name='bitmap')
        self.assert_qmp(result, 'return', {});
        s = 0
        while s < write_size:
            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
            s += 0x10000

        bitmaps_cap = {'capability': 'dirty-bitmaps', 'state': True}
        events_cap = {'capability': 'events', 'state': True}

        result = self.vm_a.qmp('migrate-set-capabilities',
                               capabilities=[bitmaps_cap, events_cap])
        self.assert_qmp(result, 'return', {})

        result = self.vm_b.qmp('migrate-set-capabilities',
                               capabilities=[bitmaps_cap])
        self.assert_qmp(result, 'return', {})

        result = self.vm_a.qmp('migrate', uri='exec:cat>' + fifo)
        self.assert_qmp(result, 'return', {})

        result = self.vm_a.qmp('migrate-start-postcopy')
        self.assert_qmp(result, 'return', {})

        while True:
            event = self.vm_a.event_wait('MIGRATION')
            if event['data']['status'] == 'completed':
                break

        s = 0x8000
        while s < write_size:
            self.vm_b.hmp_qemu_io('drive0', 'write %d %d' % (s, chunk))
            s += 0x10000

        result = self.vm_b.qmp('query-block');
        while len(result['return'][0]['dirty-bitmaps']) > 1:
            time.sleep(2)
            result = self.vm_b.qmp('query-block');

        result = self.vm_b.qmp('x-debug-block-dirty-bitmap-sha256',
                               node='drive0', name='bitmap')

        self.assert_qmp(result, 'return/sha256', sha256);

if __name__ == '__main__':
    iotests.main(supported_fmts=['qcow2'], supported_cache_modes=['none'],
                 supported_protocols=['file'])
