#!/usr/bin/python3
#
# Copyright (C) 2022 Red Hat, Inc.
# SPDX-License-Identifier: LGPL-2.1-or-later

from anacondalib import VirtInstallMachineCase
from installer import Installer
from review import Review
from storage import EFI_PARTITION_DEFAULT_SIZE, EFI_PARTITION_DEFAULT_SIZE_MB, Storage
from testlib import nondestructive, test_main  # pylint: disable=import-error


@nondestructive
class TestStorageMountPointsLVM(VirtInstallMachineCase):
    def _testLVM_partition_disk(self):
        m = self.machine
        b = self.browser
        s = Storage(b, m)

        disk = "/dev/vda"
        vgname = "fedoravg"

        s.partition_disk(disk, [(EFI_PARTITION_DEFAULT_SIZE, "efi"), ("1GiB", "ext4"), ("", None)])
        m.execute(f"""
        vgcreate -y -f {vgname} {disk}3
        lvcreate -y -l40%FREE -n root {vgname}
        mkfs.ext4 -F /dev/{vgname}/root
        lvcreate -y -l90%FREE -n home {vgname}
        mkfs.ext4 -F /dev/{vgname}/home
        lvcreate -y -l100%FREE -n swap {vgname}
        mkswap /dev/{vgname}/swap
        """)

    def testLVM(self):
        """
        Description:
            Test 'Mount point mapping' screen with LVM

        Expected results:
            - The mount point mapping screen should show the LVM volumes
            - The review screen should show the correct mountpoints and devices
        """
        b = self.browser
        m = self.machine
        i = Installer(b, m, scenario="mount-point-mapping")
        s = Storage(b, m)
        r = Review(b, m)

        vgname = "fedoravg"
        dev = "vda"
        i.open()
        i.reach(i.steps.INSTALLATION_METHOD)

        s.select_mountpoint([(dev, True)])

        # verify gathered requests
        # root partition is not auto-mapped
        s.check_mountpoint_row(1, "/", "Select a device", True)
        s.check_mountpoint_row(2, "/boot/efi", "Select a device", False)
        s.check_mountpoint_row(3, "/boot", "Select a device", False)

        s.select_mountpoint_row_device(1, f"{vgname}-root")
        s.check_mountpoint_row(1, "/", f"{vgname}-root", True, "ext4")

        s.select_mountpoint_row_device(2, f"{dev}1")
        s.check_mountpoint_row(2, "/boot/efi", f"{dev}1", False, "EFI System Partition")

        s.select_mountpoint_row_device(3, f"{dev}2")
        s.check_mountpoint_row(3, "/boot", f"{dev}2", False, "ext4")

        s.add_mountpoint_row()
        s.select_mountpoint_row_device(4, f"{vgname}-home")
        s.select_mountpoint_row_mountpoint(4, "/home")
        s.check_mountpoint_row(4, "/home", f"{vgname}-home", False, "ext4")

        s.add_mountpoint_row()
        s.select_mountpoint_row_device(5, f"{vgname}-swap")
        s.check_mountpoint_row(5, "swap", f"{vgname}-swap", False, "swap")

        # Toggle reformat option
        s.select_mountpoint_row_reformat(3)
        s.check_mountpoint_row_reformat(3, True)

        i.reach(i.steps.REVIEW)

        # verify review screen
        disk = "vda"
        r.check_disk(disk, "16.1 GB vda (Virtio Block Device)")

        r.check_disk_row(disk, "/boot/efi", "vda1", EFI_PARTITION_DEFAULT_SIZE_MB, False)
        r.check_disk_row(disk, "/boot", "vda2", "1.07 GB", True, "ext4")
        r.check_disk_row(disk, "/", "vda3, LVM", "5.80 GB", True, "ext4")
        r.check_disk_row(disk, "/home", "vda3, LVM", "7.83 GB", False)
        r.check_disk_row(disk, "swap", "vda3, LVM", "872 MB", False)

        i.reach_on_sidebar(i.steps.CUSTOM_MOUNT_POINT)

        # remove the /home row and check that row 3 is now swap
        s.remove_mountpoint_row(4, 5)
        s.check_mountpoint_row_mountpoint(4, "swap")
        s.check_mountpoint_row_device(4, f"{vgname}-swap")

        i.reach(i.steps.REVIEW)

        # verify review screen
        disk = "vda"
        r.check_disk(disk, "16.1 GB vda (Virtio Block Device)")

        r.check_disk_row(disk, "/boot/efi", "vda1", EFI_PARTITION_DEFAULT_SIZE_MB, False)
        r.check_disk_row(disk, "/boot", "vda2", "1.07 GB", True, "ext4")
        r.check_disk_row(disk, "/", "vda3, LVM", "5.80 GB", True, "ext4")
        r.check_disk_row(disk, "swap", "vda3, LVM", "872 MB", False)


if __name__ == '__main__':
    test_main()
