#!/usr/bin/env python3
# group: quick
#
# Tests converting qcow2 compressed to NBD
#
# Copyright (c) 2020 Nir Soffer <nirsof@gmail.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/>.
#
# owner=nirsof@gmail.com

import io
import tarfile

import iotests

from iotests import (
    file_path,
    qemu_img,
    qemu_img_check,
    qemu_img_create,
    qemu_img_log,
    qemu_img_measure,
    qemu_io,
    qemu_nbd_popen,
    img_info_log,
)

iotests.script_initialize(supported_fmts=["qcow2"])

# Create source disk. Using qcow2 to enable strict comparing later, and
# avoid issues with random filesystem on CI environment.
src_disk = file_path("disk.qcow2")
qemu_img_create("-f", iotests.imgfmt, src_disk, "1g")
qemu_io("-f", iotests.imgfmt, "-c", "write 1m 64k", src_disk)

# The use case is writing qcow2 image directly into an ova file, which
# is a tar file with specific layout. This is tricky since we don't know the
# size of the image before compressing, so we have to do:
# 1. Add an ovf file.
# 2. Find the offset of the next member data.
# 3. Make room for image data, allocating for the worst case.
# 4. Write compressed image data into the tar.
# 5. Add a tar entry with the actual image size.
# 6. Shrink the tar to the actual size, aligned to 512 bytes.

tar_file = file_path("test.ova")

with tarfile.open(tar_file, "w") as tar:

    # 1. Add an ovf file.

    ovf_data = b"<xml/>"
    ovf = tarfile.TarInfo("vm.ovf")
    ovf.size = len(ovf_data)
    tar.addfile(ovf, io.BytesIO(ovf_data))

    # 2. Find the offset of the next member data.

    offset = tar.fileobj.tell() + 512

    # 3. Make room for image data, allocating for the worst case.

    measure = qemu_img_measure("-O", "qcow2", src_disk)
    tar.fileobj.truncate(offset + measure["required"])

    # 4. Write compressed image data into the tar.

    nbd_sock = file_path("nbd-sock", base_dir=iotests.sock_dir)
    nbd_uri = "nbd+unix:///exp?socket=" + nbd_sock

    # Use raw format to allow creating qcow2 directly into tar file.
    with qemu_nbd_popen(
            "--socket", nbd_sock,
            "--export-name", "exp",
            "--format", "raw",
            "--offset", str(offset),
            tar_file):

        iotests.log("=== Target image info ===")
        # Not img_info_log as it enforces imgfmt, but now we print info on raw
        qemu_img_log("info", nbd_uri)

        qemu_img(
            "convert",
            "-f", iotests.imgfmt,
            "-O", "qcow2",
            "-c",
            src_disk,
            nbd_uri)

        iotests.log("=== Converted image info ===")
        img_info_log(nbd_uri)

        iotests.log("=== Converted image check ===")
        qemu_img_log("check", nbd_uri)

        iotests.log("=== Comparing to source disk ===")
        qemu_img_log("compare", src_disk, nbd_uri)

        actual_size = qemu_img_check(nbd_uri)["image-end-offset"]

    # 5. Add a tar entry with the actual image size.

    disk = tarfile.TarInfo("disk")
    disk.size = actual_size
    tar.addfile(disk)

    # 6. Shrink the tar to the actual size, aligned to 512 bytes.

    tar_size = offset + (disk.size + 511) & ~511
    tar.fileobj.seek(tar_size)
    tar.fileobj.truncate(tar_size)

with tarfile.open(tar_file) as tar:
    members = [{"name": m.name, "size": m.size, "offset": m.offset_data}
               for m in tar]
    iotests.log("=== OVA file contents ===")
    iotests.log(members)
