#!/usr/bin/env python
#
# Test vmdk and file image creation
#
# Copyright (C) 2018 Red Hat, Inc.
#
# Creator/Owner: Kevin Wolf <kwolf@redhat.com>
#
# 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 math
import iotests
from iotests import imgfmt

iotests.verify_image_format(supported_fmts=['vmdk'])

def blockdev_create(vm, options):
    result = vm.qmp_log('blockdev-create', job_id='job0', options=options)

    if 'return' in result:
        assert result['return'] == {}
        vm.run_job('job0')
    iotests.log("")

with iotests.FilePath('t.vmdk') as disk_path, \
     iotests.FilePath('t.vmdk.1') as extent1_path, \
     iotests.FilePath('t.vmdk.2') as extent2_path, \
     iotests.FilePath('t.vmdk.3') as extent3_path, \
     iotests.VM() as vm:

    #
    # Successful image creation (defaults)
    #
    iotests.log("=== Successful image creation (defaults) ===")
    iotests.log("")

    size = 5 * 1024 * 1024 * 1024

    vm.launch()
    blockdev_create(vm, { 'driver': 'file',
                          'filename': disk_path,
                          'size': 0 })

    vm.qmp_log('blockdev-add', driver='file', filename=disk_path,
               node_name='imgfile')

    blockdev_create(vm, { 'driver': imgfmt,
                          'file': 'imgfile',
                          'size': size })
    vm.shutdown()

    iotests.img_info_log(disk_path)

    #
    # Successful image creation (inline blockdev-add, explicit defaults)
    #
    iotests.log("=== Successful image creation (inline blockdev-add, explicit defaults) ===")
    iotests.log("")

    # Choose a different size to show that we got a new image
    size = 64 * 1024 * 1024

    vm.launch()
    blockdev_create(vm, { 'driver': 'file',
                          'filename': disk_path,
                          'size': 0 })

    blockdev_create(vm, { 'driver': imgfmt,
                          'file': {
                              'driver': 'file',
                              'filename': disk_path,
                          },
                          'size': size,
                          'extents': [],
                          'subformat': 'monolithicSparse',
                          'adapter-type': 'ide',
                          'hwversion': '4',
                          'zeroed-grain': False })
    vm.shutdown()

    iotests.img_info_log(disk_path)

    #
    # Successful image creation (non-default options)
    #
    iotests.log("=== Successful image creation (with non-default options) ===")
    iotests.log("")

    # Choose a different size to show that we got a new image
    size = 32 * 1024 * 1024

    vm.launch()
    blockdev_create(vm, { 'driver': 'file',
                          'filename': disk_path,
                          'size': 0 })

    blockdev_create(vm, { 'driver': imgfmt,
                          'file': {
                              'driver': 'file',
                              'filename': disk_path,
                          },
                          'size': size,
                          'extents': [],
                          'subformat': 'monolithicSparse',
                          'adapter-type': 'buslogic',
                          'zeroed-grain': True })
    vm.shutdown()

    iotests.img_info_log(disk_path)

    #
    # Invalid BlockdevRef
    #
    iotests.log("=== Invalid BlockdevRef ===")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': imgfmt,
                          'file': "this doesn't exist",
                          'size': size })
    vm.shutdown()

    #
    # Adapter types
    #

    iotests.log("=== Adapter types ===")
    iotests.log("")

    vm.add_blockdev('driver=file,filename=%s,node-name=node0' % (disk_path))

    # Valid
    iotests.log("== Valid adapter types ==")
    iotests.log("")

    vm.launch()
    for adapter_type in [ 'ide', 'buslogic', 'lsilogic', 'legacyESX' ]:
        blockdev_create(vm, { 'driver': imgfmt,
                              'file': 'node0',
                              'size': size,
                              'adapter-type': adapter_type })
    vm.shutdown()

    # Invalid
    iotests.log("== Invalid adapter types ==")
    iotests.log("")

    vm.launch()
    for adapter_type in [ 'foo', 'IDE', 'legacyesx', 1 ]:
        blockdev_create(vm, { 'driver': imgfmt,
                              'file': 'node0',
                              'size': size,
                              'adapter-type': adapter_type })
    vm.shutdown()

    #
    # Other subformats
    #
    iotests.log("=== Other subformats ===")
    iotests.log("")

    for path in [ extent1_path, extent2_path, extent3_path ]:
        msg = iotests.qemu_img_pipe('create', '-f', imgfmt, path, '0')
        iotests.log(msg, [iotests.filter_testfiles])

    vm.add_blockdev('driver=file,filename=%s,node-name=ext1' % (extent1_path))
    vm.add_blockdev('driver=file,filename=%s,node-name=ext2' % (extent2_path))
    vm.add_blockdev('driver=file,filename=%s,node-name=ext3' % (extent3_path))

    # Missing extent
    iotests.log("== Missing extent ==")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': imgfmt,
                          'file': 'node0',
                          'size': size,
                          'subformat': 'monolithicFlat' })
    vm.shutdown()

    # Correct extent
    iotests.log("== Correct extent ==")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': imgfmt,
                          'file': 'node0',
                          'size': size,
                          'subformat': 'monolithicFlat',
                          'extents': ['ext1'] })
    vm.shutdown()

    # Extra extent
    iotests.log("== Extra extent ==")
    iotests.log("")

    vm.launch()
    blockdev_create(vm, { 'driver': imgfmt,
                          'file': 'node0',
                          'size': 512,
                          'subformat': 'monolithicFlat',
                          'extents': ['ext1', 'ext2', 'ext3'] })
    vm.shutdown()

    # Split formats
    iotests.log("== Split formats ==")
    iotests.log("")

    for size in [ 512, 1073741824, 2147483648, 5368709120 ]:
        for subfmt in [ 'twoGbMaxExtentFlat', 'twoGbMaxExtentSparse' ]:
            iotests.log("= %s %d =" % (subfmt, size))
            iotests.log("")

            num_extents = math.ceil(size / 2.0**31)
            extents = [ "ext%d" % (i) for i in range(1, num_extents + 1) ]

            vm.launch()
            blockdev_create(vm, { 'driver': imgfmt,
                                  'file': 'node0',
                                  'size': size,
                                  'subformat': subfmt,
                                  'extents': extents })
            vm.shutdown()

            iotests.img_info_log(disk_path)
