#!/usr/bin/python3## Copyright (C) 2024 Red Hat, Inc.# SPDX-License-Identifier: LGPL-2.1-or-laterfrom anacondalib import VirtInstallMachineCasefrom installer import Installerfrom review import Reviewfrom storage import EFI_PARTITION_DEFAULT_SIZE, EFI_PARTITION_DEFAULT_SIZE_MB, Storagefrom testlib import nondestructive, skipImage, test_main # pylint: disable=import-error@nondestructiveclass TestStorageMountPointsBtrfs (VirtInstallMachineCase):def _testBtrfsSubvolumes_partition_disk(self):b = self.browserm = self.machines = Storage(b, m)disk = "/dev/vda"tmp_mount = "/tmp/btrfs-mount-test"s.partition_disk(disk, [(EFI_PARTITION_DEFAULT_SIZE, "efi"), ("1GiB", "ext4"), ("", "btrfs")])m.execute(f"""mkdir -p {tmp_mount}mount {disk}3 {tmp_mount}btrfs subvolume create {tmp_mount}/rootbtrfs subvolume create {tmp_mount}/homebtrfs subvolume create {tmp_mount}/unusedbtrfs subvolume snapshot {tmp_mount}/root {tmp_mount}/snapshot1umount {tmp_mount}rmdir {tmp_mount}""")@skipImage("btrfs support missing on fedora-eln image", "fedora-eln-boot")def testBtrfsSubvolumes(self):"""Description:Test 'Mount point mapping' screen with btrfs subvolumes and snapshotsExpected results:- The installer should be able to detect / handle btrfs subvolumes and snapshots- The review screen should show the correct mountpoints and devices"""b = self.browserm = self.machinei = Installer(b, m)s = Storage(b, m)r = Review(b, m)disk = "/dev/vda"dev = "vda"i.open()i.reach(i.steps.INSTALLATION_METHOD)s.select_mountpoint([(dev, True)])# btrfs snapshots should not be availables.check_mountpoint_row_device_available(1, "snapshot1", False)# verify gathered requests# root partition is not auto-mappeds.check_mountpoint_row(1, "/", "Select a device", True)s.select_mountpoint_row_device(1, "root")s.check_mountpoint_row_format_type(1, "btrfs")s.check_mountpoint_row(2, "/boot/efi", "Select a device", False)s.select_mountpoint_row_device(2, f"{dev}1")s.check_mountpoint_row_format_type(2, "EFI System Partition")s.check_mountpoint_row(3, "/boot", "Select a device", False)s.select_mountpoint_row_device(3, f"{dev}2")s.check_mountpoint_row_format_type(3, "ext4")s.add_mountpoint_row()s.select_mountpoint_row_device(4, "home")s.check_mountpoint_row_reformat(4, False)s.select_mountpoint_row_mountpoint(4, "/home")s.check_mountpoint_row_format_type(4, "btrfs")# Toggle reformat options.select_mountpoint_row_reformat(3)s.check_mountpoint_row_reformat(3, True)i.reach(i.steps.REVIEW)# verify review screenr.check_disk(dev, "16.1 GB vda (Virtio Block Device)")r.check_disk_row(dev, "/boot/efi", "vda1", EFI_PARTITION_DEFAULT_SIZE_MB, False, "efi")r.check_disk_row(dev, "/boot", "vda2", "1.07 GB", True, "ext4")r.check_disk_row(dev, "/", "vda3", "14.5 GB", True, "btrfs subvolume")r.check_disk_row(dev, "/home", "vda3", "14.5 GB", False)r.check_disk_row_not_present(dev, "unused")i.reach_on_sidebar(i.steps.INSTALLATION_METHOD)# Checks for nested btrfs subvolumetmp_mount = "/tmp/btrfs-mount-test"m.execute(f"""mkdir -p {tmp_mount}mount {disk}3 {tmp_mount}btrfs subvolume create {tmp_mount}/home/Moviesbtrfs subvolume create {tmp_mount}/home/Movies/Good_Moviesbtrfs subvolume create {tmp_mount}/home/Movies/Bad_Moviesumount {tmp_mount}rmdir {tmp_mount}""")s.rescan_disks()s.select_mountpoint([(dev, True)])s.check_mountpoint_row(1, "/", "root", True)s.check_mountpoint_row(2, "/boot/efi", f"{dev}1", False)s.check_mountpoint_row(3, "/boot", f"{dev}2", False)s.check_mountpoint_row(4, "/home", "home", False)s.add_mountpoint_row()s.select_mountpoint_row_device(5, "home/Movies")s.select_mountpoint_row_mountpoint(5, "/home/Movies")s.add_mountpoint_row()s.select_mountpoint_row_device(6, "home/Movies/Good_Movies")s.select_mountpoint_row_mountpoint(6, "/home/Movies/Good_Movies")s.add_mountpoint_row()s.select_mountpoint_row_device(7, "home/Movies/Bad_Movies")s.select_mountpoint_row_mountpoint(7, "/home/Movies/Bad_Movies")# No error when no devices are reformattedfor row in range(4, 7):s.wait_mountpoint_table_column_helper(row, "format", present=False)# When parent is re-formatted all child devices must be reformatteds.select_mountpoint_row_device(5, "home/Movies")s.select_mountpoint_row_reformat(5)s.wait_mountpoint_table_column_helper(5, "format", text="Mismatch")s.select_mountpoint_row_reformat(6)s.select_mountpoint_row_reformat(7)s.wait_mountpoint_table_column_helper(5, "format", present=False)# Check also that the rules apply to children deeper in the device trees.select_mountpoint_row_reformat(4)s.wait_mountpoint_table_column_helper(4, "format", present=False)s.select_mountpoint_row_reformat(7, False)s.wait_mountpoint_table_column_helper(4, "format", text="Mismatch")# When parent is re-formmated all child devices should be# * either also reformatted if selected# * either not selected (not part of the mountpoint assignment table)s.remove_mountpoint_row(6, 7)s.remove_mountpoint_row(6, 6)s.wait_mountpoint_table_column_helper(4, "format", present=False)s.wait_mountpoint_table_column_helper(5, "format", present=False)i.check_next_disabled(False)def _testEncryptedUnlockBTRFSonLUKS_partition_disk(self):b = self.browserm = self.machines = Storage(b, m)disk = "/dev/vda"tmp_mount = "/tmp/btrfs-mount-test"s.partition_disk(disk, [(EFI_PARTITION_DEFAULT_SIZE, "efi"), ("1GiB", "ext4"), ("", "btrfs")])s.create_luks_partition(f"{disk}3", "einszweidrei", "encrypted-vol", "btrfs", close_luks=False)m.execute(f"""mkdir -p {tmp_mount}mount /dev/mapper/encrypted-vol {tmp_mount}btrfs subvolume create {tmp_mount}/rootbtrfs subvolume create {tmp_mount}/homebtrfs subvolume create {tmp_mount}/unusedumount {tmp_mount}rmdir {tmp_mount}""")def testEncryptedUnlockBTRFSonLUKS(self):"""Description:Test that the installer can handle BTRFS on LUKS encrypted devicesExpected results:- The 'Unlock' dialog is available for unlocking the partitions before entering the mount point mapping- The user can unlock the disk using a passphrase- The user can select the unlocked devices in the mount point mappingtable.- The review screen shows the correct mountpoints and devices"""b = self.browserm = self.machinei = Installer(b, m)s = Storage(b, m)r = Review(b, m)dev = "vda"i.open()i.reach(i.steps.INSTALLATION_METHOD)# Unlock the LUKS devices.unlock_all_encrypted()s.unlock_device("einszweidrei", ["vda3"], ["vda3"])s.select_mountpoint([(dev, True)])# Select the mountpointss.select_mountpoint_row_device(1, "root")s.select_mountpoint_row_device(2, f"{dev}1")s.select_mountpoint_row_device(3, f"{dev}2")# Verify the review pagei.reach(i.steps.REVIEW)r.check_disk_row(dev, "/boot/efi", "vda1", EFI_PARTITION_DEFAULT_SIZE_MB, False)r.check_disk_row(dev, "/boot", "vda2", "1.07 GB", False)r.check_disk_row(dev, "/", "vda3", "14.5 GB", True, "btrfs subvolume", True)if __name__ == '__main__':test_main()