diff --git a/kiwi/bootloader/config/systemd_boot.py b/kiwi/bootloader/config/systemd_boot.py index 5869c62abb2..940993eb711 100644 --- a/kiwi/bootloader/config/systemd_boot.py +++ b/kiwi/bootloader/config/systemd_boot.py @@ -119,46 +119,45 @@ def _create_embedded_fat_efi_image(self, path: str): ) with LoopDevice(path) as loop_provider: loop_provider.create(overwrite=False) - disk = Disk('gpt', loop_provider) - disk.map_partitions() - disk.partitioner.partition_id = 1 - disk._add_to_map('efi') - Command.run( - ['mkdosfs', '-n', 'BOOT', disk.partition_map['efi']] - ) - Path.create(f'{self.root_dir}/boot/efi') - efi_mount = MountManager( - device=disk.partition_map['efi'], - mountpoint=f'{self.root_dir}/boot/efi' - ) - device_mount = MountManager( - device='/dev', - mountpoint=f'{self.root_dir}/dev' - ) - proc_mount = MountManager( - device='/proc', - mountpoint=f'{self.root_dir}/proc' - ) - sys_mount = MountManager( - device='/sys', - mountpoint=f'{self.root_dir}/sys' - ) - efi_mount.mount() - device_mount.bind_mount() - proc_mount.bind_mount() - sys_mount.bind_mount() - try: - self._run_bootctl(self.root_dir) - self.set_loader_entry(self.root_dir, self.target.live) - finally: - efi_mount.umount() - device_mount.umount() - proc_mount.umount() - sys_mount.umount() - Command.run( - ['dd', f'if={disk.partition_map["efi"]}', f'of={path}.img'] - ) - del disk + with Disk('gpt', loop_provider) as disk: + disk.map_partitions() + disk.partitioner.partition_id = 1 + disk._add_to_map('efi') + Command.run( + ['mkdosfs', '-n', 'BOOT', disk.partition_map['efi']] + ) + Path.create(f'{self.root_dir}/boot/efi') + efi_mount = MountManager( + device=disk.partition_map['efi'], + mountpoint=f'{self.root_dir}/boot/efi' + ) + device_mount = MountManager( + device='/dev', + mountpoint=f'{self.root_dir}/dev' + ) + proc_mount = MountManager( + device='/proc', + mountpoint=f'{self.root_dir}/proc' + ) + sys_mount = MountManager( + device='/sys', + mountpoint=f'{self.root_dir}/sys' + ) + efi_mount.mount() + device_mount.bind_mount() + proc_mount.bind_mount() + sys_mount.bind_mount() + try: + self._run_bootctl(self.root_dir) + self.set_loader_entry(self.root_dir, self.target.live) + finally: + efi_mount.umount() + device_mount.umount() + proc_mount.umount() + sys_mount.umount() + Command.run( + ['dd', f'if={disk.partition_map["efi"]}', f'of={path}.img'] + ) Command.run( ['mv', f'{path}.img', path] diff --git a/kiwi/builder/disk.py b/kiwi/builder/disk.py index 8886a027a10..df2a96d1d8f 100644 --- a/kiwi/builder/disk.py +++ b/kiwi/builder/disk.py @@ -336,40 +336,39 @@ def create_disk(self) -> Result: loop_provider.create() # create the disk partitioner, still unmapped - disk = self._disk_instance(loop_provider) - - # create disk partitions and instance device map - device_map = self._build_and_map_disk_partitions( - disk, disksize_mbytes - ) - - # update device and disk id map in case of no root write partition - if self.root_filesystem_is_overlay and \ - self.root_filesystem_has_write_partition is False: - device_map['root'] = device_map['readonly'] - disk.public_partition_id_map['kiwi_RootPart'] = \ - disk.public_partition_id_map['kiwi_ROPart'] - - # create raid on current root device if requested - if self.mdraid: - raid_root = self._raid_instance(device_map) - device_map = self._map_raid(device_map, disk, raid_root) - - # create integrity on current root device if requested - if self.integrity: - integrity_root = self._integrity_instance(device_map) - device_map = self._map_integrity(device_map, integrity_root) - - # create luks on current root device if requested - if self.luks is not None: - luks_root = self._luks_instance(device_map) - device_map = self._map_luks(device_map, luks_root) - - # create system layout for root system - self._create_system_instance(device_map) + with self._disk_instance(loop_provider) as disk: + # create disk partitions and instance device map + device_map = self._build_and_map_disk_partitions( + disk, disksize_mbytes + ) - # sync system data, configure system, setup loader and initrd - self._process_build(device_map, disk) + # update device and disk id map if no root write partition + if self.root_filesystem_is_overlay and \ + self.root_filesystem_has_write_partition is False: + device_map['root'] = device_map['readonly'] + disk.public_partition_id_map['kiwi_RootPart'] = \ + disk.public_partition_id_map['kiwi_ROPart'] + + # create raid on current root device if requested + if self.mdraid: + raid_root = self._raid_instance(device_map) + device_map = self._map_raid(device_map, disk, raid_root) + + # create integrity on current root device if requested + if self.integrity: + integrity_root = self._integrity_instance(device_map) + device_map = self._map_integrity(device_map, integrity_root) + + # create luks on current root device if requested + if self.luks is not None: + luks_root = self._luks_instance(device_map) + device_map = self._map_luks(device_map, luks_root) + + # create system layout for root system + self._create_system_instance(device_map) + + # sync system data, configure system, setup loader and initrd + self._process_build(device_map, disk) # store image bundle_format in result if self.bundle_format: diff --git a/kiwi/storage/disk.py b/kiwi/storage/disk.py index 2b6a07c9325..4fee3de1f90 100644 --- a/kiwi/storage/disk.py +++ b/kiwi/storage/disk.py @@ -99,6 +99,9 @@ def __init__( self.table_type = table_type + def __enter__(self): + return self + def get_device(self) -> Dict[str, MappedDevice]: """ Names of partition devices @@ -510,7 +513,7 @@ def _add_to_map(self, name): self.partition_map[name] = device_node self.partition_id_map[name] = partition_number - def __del__(self): + def __exit__(self, exc_type, exc_value, traceback): if self.storage_provider.is_loop() and self.is_mapped: log.info('Cleaning up %s instance', type(self).__name__) try: @@ -524,8 +527,9 @@ def __del__(self): Command.run( ['partx', '--delete', self.storage_provider.get_device()] ) - except Exception: - log.warning( - 'cleanup of partition device maps failed, %s still busy', - self.storage_provider.get_device() + except Exception as issue: + log.error( + 'cleanup of partition maps on {} failed with: {}'.format( + self.storage_provider.get_device(), issue + ) ) diff --git a/test/unit/bootloader/config/systemd_boot_test.py b/test/unit/bootloader/config/systemd_boot_test.py index 4fa2294a95a..465efcf9df0 100644 --- a/test/unit/bootloader/config/systemd_boot_test.py +++ b/test/unit/bootloader/config/systemd_boot_test.py @@ -194,7 +194,7 @@ def test_create_embedded_fat_efi_image( ): target = Mock() self.bootloader.target = target - mock_Disk.return_value.partition_map = { + mock_Disk.return_value.__enter__.return_value.partition_map = { 'efi': 'efi_device' } self.bootloader._create_embedded_fat_efi_image('ESP') diff --git a/test/unit/builder/disk_test.py b/test/unit/builder/disk_test.py index 20d139188ec..0fa4867b32e 100644 --- a/test/unit/builder/disk_test.py +++ b/test/unit/builder/disk_test.py @@ -79,26 +79,6 @@ def side_effect(filename): kiwi.builder.disk.BlockID = Mock( return_value=self.block_operation ) - self.disk = Mock() - provider = Mock() - provider.get_device = Mock( - return_value='/dev/some-loop' - ) - self.disk.storage_provider = provider - self.partitioner = Mock() - self.partitioner.get_id = Mock( - return_value=1 - ) - self.disk.partitioner = self.partitioner - self.disk.get_uuid = Mock( - return_value='0815' - ) - self.disk.get_public_partition_id_map = Mock( - return_value=self.id_map_sorted - ) - self.disk.get_device = Mock( - return_value=self.device_map - ) kernel_info = Mock() kernel_info.version = '1.2.3' kernel_info.name = 'vmlinuz-1.2.3-default' @@ -112,9 +92,6 @@ def side_effect(filename): kiwi.builder.disk.Kernel = Mock( return_value=self.kernel ) - kiwi.builder.disk.Disk = Mock( - return_value=self.disk - ) self.disk_setup = Mock() self.disk_setup.get_disksize_mbytes.return_value = 1024 self.disk_setup.boot_partition_size.return_value = 0 @@ -287,6 +264,7 @@ def test_create_install_mediai_custom_boot( ) @patch('kiwi.builder.disk.create_boot_loader_config') + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.LoopDevice') @patch('kiwi.builder.disk.FileSystem.new') @patch('random.randrange') @@ -297,7 +275,7 @@ def test_create_install_mediai_custom_boot( def test_create_disk_standard_root_with_kiwi_initrd( self, mock_path, mock_ImageSystem, mock_grub_dir, mock_command, mock_rand, mock_fs, mock_LoopDevice, - mock_create_boot_loader_config + mock_Disk, mock_create_boot_loader_config ): bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( @@ -307,6 +285,8 @@ def test_create_disk_standard_root_with_kiwi_initrd( bootloader_config loop_provider = Mock() mock_LoopDevice.return_value.__enter__.return_value = loop_provider + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk mock_path.return_value = True mock_rand.return_value = 15 filesystem = Mock() @@ -328,26 +308,26 @@ def test_create_disk_standard_root_with_kiwi_initrd( root_clone=0, boot_clone=0 ) loop_provider.create.assert_called_once_with() - self.disk.wipe.assert_called_once_with() - self.disk.create_efi_csm_partition.assert_called_once_with( + disk.wipe.assert_called_once_with() + disk.create_efi_csm_partition.assert_called_once_with( self.firmware.get_legacy_bios_partition_size() ) - self.disk.create_efi_partition.assert_called_once_with( + disk.create_efi_partition.assert_called_once_with( self.firmware.get_efi_partition_size() ) - self.disk.create_boot_partition.assert_called_once_with( + disk.create_boot_partition.assert_called_once_with( self.disk_setup.boot_partition_size(), 0 ) - self.disk.create_swap_partition.assert_called_once_with( + disk.create_swap_partition.assert_called_once_with( '128' ) - self.disk.create_prep_partition.assert_called_once_with( + disk.create_prep_partition.assert_called_once_with( self.firmware.get_prep_partition_size() ) - self.disk.create_root_partition.assert_called_once_with( + disk.create_root_partition.assert_called_once_with( 'all_free', 0 ) - self.disk.map_partitions.assert_called_once_with() + disk.map_partitions.assert_called_once_with() bootloader_config.setup_disk_boot_images.assert_called_once_with( '0815' ) @@ -430,6 +410,7 @@ def test_create_disk_standard_root_with_kiwi_initrd( 'target_dir' ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.VolumeManager.new') @patch('kiwi.builder.disk.FileSystem.new') @@ -445,8 +426,10 @@ def test_create_lvm_disk_standard_root_with_clone( self, mock_CloneDevice, mock_Temporary_new_file, mock_ImageSystem, mock_SystemSetup, mock_os_path_getsize, mock_path, mock_grub_dir, mock_command, mock_fs, mock_volume_manager, - mock_create_boot_loader_config + mock_create_boot_loader_config, mock_Disk ): + mock_Disk.return_value.__enter__.return_value = \ + self._get_disk_instance() bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -504,6 +487,7 @@ def test_create_lvm_disk_standard_root_with_clone( volume_manager.\ umount_volumes.call_args_list[0].assert_called_once_with() + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @@ -517,8 +501,11 @@ def test_create_lvm_disk_standard_root_with_clone( def test_create_disk_standard_root_with_clone( self, mock_CloneDevice, mock_Temporary_new_file, mock_ImageSystem, mock_SystemSetup, mock_os_path_getsize, mock_path, - mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config, + mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -564,13 +551,13 @@ def test_create_disk_standard_root_with_clone( with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk() - self.disk.create_boot_partition.assert_called_once_with( + disk.create_boot_partition.assert_called_once_with( self.disk_setup.boot_partition_size(), 1 ) - self.disk.create_root_partition.assert_called_once_with( + disk.create_root_partition.assert_called_once_with( 'clone:all_free:458', 1 ) - self.disk.create_custom_partitions.assert_called_once_with( + disk.create_custom_partitions.assert_called_once_with( self.disk_builder.custom_partitions ) assert mock_CloneDevice.return_value.clone.call_args_list == [ @@ -583,14 +570,14 @@ def test_create_disk_standard_root_with_clone( # the root readonly partition and not from the root (rw) # partition. self.disk_builder.root_filesystem_is_overlay = True - self.disk.create_root_partition.reset_mock() + disk.create_root_partition.reset_mock() with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk() - self.disk.create_root_readonly_partition.assert_called_once_with( + disk.create_root_readonly_partition.assert_called_once_with( 10, 1 ) - self.disk.create_root_partition.assert_called_once_with( + disk.create_root_partition.assert_called_once_with( 'all_free', 0 ) @@ -598,7 +585,7 @@ def test_create_disk_standard_root_with_clone( self.disk_builder.root_filesystem_verity_blocks = 10 self.disk_builder.root_filesystem_is_overlay = False mock_CloneDevice.reset_mock() - self.disk.create_root_partition.reset_mock() + disk.create_root_partition.reset_mock() with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk() @@ -609,6 +596,7 @@ def test_create_disk_standard_root_with_clone( call([self.device_map['rootclone1']]) ] + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @@ -621,8 +609,11 @@ def test_create_disk_standard_root_with_clone( def test_create_disk_standard_root_with_dm_integrity( self, mock_Temporary_new_file, mock_ImageSystem, mock_SystemSetup, mock_os_path_getsize, mock_path, - mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config, + mock_Disk ): + mock_Disk.return_value.__enter__.return_value = \ + self._get_disk_instance() bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -667,6 +658,7 @@ def test_create_disk_standard_root_with_dm_integrity( call(label='SWAP') ] + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.LoopDevice') @patch('kiwi.builder.disk.FileSystem.new') @@ -683,8 +675,11 @@ def test_create_disk_standard_root_with_dracut_initrd( self, mock_Temporary_new_file, mock_VeritySetup, mock_ImageSystem, mock_SystemSetup, mock_os_path_getsize, mock_path, mock_grub_dir, mock_command, mock_rand, mock_fs, - mock_LoopDevice, mock_create_boot_loader_config + mock_LoopDevice, mock_create_boot_loader_config, + mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -725,23 +720,23 @@ def test_create_disk_standard_root_with_dracut_initrd( assert loop_provider.create.call_args_list == [ call(), call() ] - self.disk.wipe.assert_called_once_with() - self.disk.create_efi_csm_partition.assert_called_once_with( + disk.wipe.assert_called_once_with() + disk.create_efi_csm_partition.assert_called_once_with( self.firmware.get_legacy_bios_partition_size() ) - self.disk.create_efi_partition.assert_called_once_with( + disk.create_efi_partition.assert_called_once_with( self.firmware.get_efi_partition_size() ) - self.disk.create_boot_partition.assert_called_once_with( + disk.create_boot_partition.assert_called_once_with( self.disk_setup.boot_partition_size(), 0 ) - self.disk.create_prep_partition.assert_called_once_with( + disk.create_prep_partition.assert_called_once_with( self.firmware.get_prep_partition_size() ) - self.disk.create_root_partition.assert_called_once_with( + disk.create_root_partition.assert_called_once_with( 'all_free', 0 ) - self.disk.map_partitions.assert_called_once_with() + disk.map_partitions.assert_called_once_with() bootloader_config.setup_disk_boot_images.assert_called_once_with( '0815' ) @@ -838,6 +833,7 @@ def test_create_disk_standard_root_with_dracut_initrd( '/dev/root-device' ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('random.randrange') @@ -852,8 +848,10 @@ def test_create_disk_standard_root_with_fixed_rootfs_size( self, mock_Temporary_new_file, mock_ImageSystem, mock_SystemSetup, mock_os_path_getsize, mock_path, mock_grub_dir, mock_command, mock_rand, mock_fs, - mock_create_boot_loader_config + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk self.disk_builder.root_filesystem_embed_verity_metadata = False self.disk_builder.root_filesystem_is_overlay = False self.disk_builder.volume_manager_name = None @@ -874,10 +872,11 @@ def test_create_disk_standard_root_with_fixed_rootfs_size( with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk() - self.disk.create_root_partition.assert_called_once_with( + disk.create_root_partition.assert_called_once_with( 'clone:1024:1024', 1 ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.LoopDevice') @patch('kiwi.builder.disk.DeviceProvider') @@ -894,8 +893,11 @@ def test_create_disk_standard_root_is_overlay( self, mock_BlockID, mock_rand, mock_temp, mock_getsize, mock_exists, mock_grub_dir, mock_command, mock_squashfs, mock_fs, mock_DeviceProvider, - mock_LoopDevice, mock_create_boot_loader_config + mock_LoopDevice, mock_create_boot_loader_config, + mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -924,8 +926,8 @@ def test_create_disk_standard_root_is_overlay( mock_temp.return_value = tempfile mock_exists.return_value = True self.disk_builder.initrd_system = 'dracut' - self.disk.public_partition_id_map = self.id_map - self.disk.public_partition_id_map['kiwi_ROPart'] = 1 + disk.public_partition_id_map = self.id_map + disk.public_partition_id_map['kiwi_ROPart'] = 1 m_open = mock_open() with patch('builtins.open', m_open, create=True): self.disk_builder.create_disk() @@ -956,7 +958,7 @@ def test_create_disk_standard_root_is_overlay( self.integrity_root.create_integrity_metadata.assert_called_once_with() self.integrity_root.sign_integrity_metadata.assert_called_once_with() self.integrity_root.write_integrity_metadata.assert_called_once_with() - self.disk.create_root_readonly_partition.assert_called_once_with( + disk.create_root_readonly_partition.assert_called_once_with( 11, 0 ) assert mock_command.call_args_list[2] == call( @@ -984,11 +986,12 @@ def test_create_disk_standard_root_is_overlay( config={'modules': ['kiwi-overlay']} ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.LoopDevice') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') def test_create_disk_standard_root_no_hypervisor_found( - self, mock_command, mock_fs, mock_LoopDevice + self, mock_command, mock_fs, mock_LoopDevice, mock_Disk ): loop_provider = Mock() mock_LoopDevice.return_value.__enter__.return_value = loop_provider @@ -1000,11 +1003,13 @@ def test_create_disk_standard_root_no_hypervisor_found( with raises(KiwiDiskBootImageError): self.disk_builder.create_disk() + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') def test_create_disk_standard_root_xen_server_boot( - self, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_command, mock_fs, mock_create_boot_loader_config, + mock_Disk ): bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( @@ -1027,13 +1032,17 @@ def test_create_disk_standard_root_xen_server_boot( 'root_dir', '/boot/xen.gz' ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_standard_root_s390_boot( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + mock_Disk.return_value.__enter__.return_value = \ + self._get_disk_instance() self.disk_builder.arch = 's390x' bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( @@ -1054,13 +1063,17 @@ def test_create_disk_standard_root_s390_boot( bootloader_config.write.assert_called_once_with() + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_standard_root_secure_boot( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + mock_Disk.return_value.__enter__.return_value = \ + self._get_disk_instance() bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1080,13 +1093,17 @@ def test_create_disk_standard_root_secure_boot( '0815' ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_mdraid_root( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1097,12 +1114,12 @@ def test_create_disk_mdraid_root( mock_fs.return_value.__enter__.return_value = filesystem self.disk_builder.volume_manager_name = None self.disk_builder.mdraid = 'mirroring' - self.disk.public_partition_id_map = self.id_map + disk.public_partition_id_map = self.id_map with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_root_raid_partition.assert_called_once_with( + disk.create_root_raid_partition.assert_called_once_with( 'all_free', 0 ) self.raid_root.create_degraded_raid.assert_called_once_with( @@ -1111,18 +1128,22 @@ def test_create_disk_mdraid_root( self.raid_root.create_raid_config.assert_called_once_with( 'boot_dir/etc/mdadm.conf' ) - assert self.disk.public_partition_id_map == { + assert disk.public_partition_id_map == { 'kiwi_RaidPart': 1, 'kiwi_RootPart': 1, 'kiwi_BootPart': 1, 'kiwi_RaidDev': '/dev/md0' } + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_luks_root( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1137,8 +1158,8 @@ def test_create_disk_luks_root( self.disk_builder.root_filesystem_is_overlay = True self.disk_builder.root_filesystem_has_write_partition = False self.disk_builder.boot_is_crypto = True - self.disk.public_partition_id_map = self.id_map - self.disk.public_partition_id_map['kiwi_ROPart'] = 1 + disk.public_partition_id_map = self.id_map + disk.public_partition_id_map['kiwi_ROPart'] = 1 with patch('builtins.open'): self.disk_builder.create_disk() @@ -1162,6 +1183,7 @@ def test_create_disk_luks_root( config_file='root_dir/etc/dracut.conf.d/99-luks-boot.conf' ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @@ -1169,8 +1191,10 @@ def test_create_disk_luks_root( @patch('kiwi.builder.disk.BootLoaderInstall.new') def test_create_disk_luks_root_with_disk_password( self, mock_BootLoaderInstall, mock_grub_dir, mock_command, mock_fs, - mock_create_boot_loader_config + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.use_disk_password = True bootloader_config.get_boot_cmdline = Mock( @@ -1187,8 +1211,8 @@ def test_create_disk_luks_root_with_disk_password( self.disk_builder.root_filesystem_is_overlay = True self.disk_builder.root_filesystem_has_write_partition = True self.disk_builder.boot_is_crypto = True - self.disk.public_partition_id_map = self.id_map - self.disk.public_partition_id_map['kiwi_ROPart'] = 1 + disk.public_partition_id_map = self.id_map + disk.public_partition_id_map['kiwi_ROPart'] = 1 bootloader = mock_BootLoaderInstall.return_value with patch('builtins.open'): @@ -1214,6 +1238,7 @@ def test_create_disk_luks_root_with_disk_password( ) bootloader.set_disk_password.assert_called_once_with('passphrase') + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @@ -1222,8 +1247,10 @@ def test_create_disk_luks_root_with_disk_password( @patch('kiwi.builder.disk.BlockID') def test_create_disk_uses_custom_partitions( self, mock_BlockID, mock_exists, mock_grub_dir, mock_command, mock_fs, - mock_create_boot_loader_config + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1282,8 +1309,8 @@ def get_filesystem(): with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.persistency_type = 'by-uuid' - self.disk.create_custom_partitions.assert_called_once_with( + disk.persistency_type = 'by-uuid' + disk.create_custom_partitions.assert_called_once_with( self.disk_builder.custom_partitions ) assert [ @@ -1310,6 +1337,7 @@ def get_filesystem(): call('LABEL=blkid_result /var ext3 defaults 0 0') ] in self.disk_builder.fstab.add_entry.call_args_list + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.VolumeManager.new') @@ -1319,8 +1347,11 @@ def get_filesystem(): @patch('os.path.exists') def test_create_disk_btrfs_managed_root( self, mock_exists, mock_ImageSystem, mock_grub_dir, mock_command, - mock_volume_manager, mock_fs, mock_create_boot_loader_config + mock_volume_manager, mock_fs, mock_create_boot_loader_config, + mock_Disk ): + mock_Disk.return_value.__enter__.return_value = \ + self._get_disk_instance() bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1353,6 +1384,7 @@ def test_create_disk_btrfs_managed_root( call('UUID=blkid_result / blkid_result_fs ro,defaults,subvol=@ 0 0') ] in self.disk_builder.fstab.add_entry.call_args_list + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.VolumeManager.new') @@ -1362,8 +1394,11 @@ def test_create_disk_btrfs_managed_root( @patch('os.path.exists') def test_create_disk_volume_managed_root( self, mock_exists, mock_ImageSystem, mock_grub_dir, mock_command, - mock_volume_manager, mock_fs, mock_create_boot_loader_config + mock_volume_manager, mock_fs, mock_create_boot_loader_config, + mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1389,7 +1424,7 @@ def test_create_disk_volume_managed_root( with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_root_lvm_partition.assert_called_once_with( + disk.create_root_lvm_partition.assert_called_once_with( 'all_free', 0 ) volume_manager.setup.assert_called_once_with('systemVG') @@ -1415,13 +1450,17 @@ def test_create_disk_volume_managed_root( self.disk_builder.fstab ) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_hybrid_gpt_requested( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1437,15 +1476,19 @@ def test_create_disk_hybrid_gpt_requested( with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_hybrid_mbr.assert_called_once_with() + disk.create_hybrid_mbr.assert_called_once_with() + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_force_mbr_requested( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1461,15 +1504,19 @@ def test_create_disk_force_mbr_requested( with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_mbr.assert_called_once_with() + disk.create_mbr.assert_called_once_with() + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_custom_start_sector_requested( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1488,7 +1535,7 @@ def test_create_disk_custom_start_sector_requested( with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.set_start_sector.assert_called_once_with(4096) + disk.set_start_sector.assert_called_once_with(4096) def test_create(self): result = Mock() @@ -1509,13 +1556,17 @@ def test_create(self): append_unpartitioned.assert_called_once_with() create_disk_format.assert_called_once_with(result) + @patch('kiwi.builder.disk.Disk') @patch('kiwi.builder.disk.create_boot_loader_config') @patch('kiwi.builder.disk.FileSystem.new') @patch('kiwi.builder.disk.Command.run') @patch('kiwi.builder.disk.Defaults.get_grub_boot_directory_name') def test_create_disk_spare_part_requested( - self, mock_grub_dir, mock_command, mock_fs, mock_create_boot_loader_config + self, mock_grub_dir, mock_command, mock_fs, + mock_create_boot_loader_config, mock_Disk ): + disk = self._get_disk_instance() + mock_Disk.return_value.__enter__.return_value = disk bootloader_config = Mock() bootloader_config.get_boot_cmdline = Mock( return_value='boot_cmdline' @@ -1534,7 +1585,7 @@ def test_create_disk_spare_part_requested( with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_spare_partition.assert_called_once_with('42') + disk.create_spare_partition.assert_called_once_with('42') assert mock_fs.call_args_list[0] == call( self.disk_builder.spare_part_fs, self.device_map['spare'], @@ -1556,15 +1607,15 @@ def test_create_disk_spare_part_requested( call('UUID=blkid_result swap blkid_result_fs defaults 0 0'), ] in self.disk_builder.fstab.add_entry.call_args_list - self.disk.create_root_partition.reset_mock() - self.disk.create_spare_partition.reset_mock() + disk.create_root_partition.reset_mock() + disk.create_spare_partition.reset_mock() self.disk_builder.spare_part_is_last = True self.disk_builder.disk_resize_requested = False with patch('builtins.open'): self.disk_builder.create_disk() - self.disk.create_spare_partition.assert_called_once_with( + disk.create_spare_partition.assert_called_once_with( 'all_free' ) @@ -1604,3 +1655,26 @@ def test_create_disk_format(self, mock_DiskFormat, mock_command, mock_fs): self.disk_builder.create_disk_format(result_instance) disk_subformat.create_image_format.assert_called_once_with() + + def _get_disk_instance(self) -> Mock: + disk = Mock() + provider = Mock() + partitioner = Mock() + disk.get_uuid = Mock( + return_value='0815' + ) + disk.get_public_partition_id_map = Mock( + return_value=self.id_map_sorted + ) + disk.get_device = Mock( + return_value=self.device_map + ) + provider.get_device = Mock( + return_value='/dev/some-loop' + ) + partitioner.get_id = Mock( + return_value=1 + ) + disk.storage_provider = provider + disk.partitioner = partitioner + return disk diff --git a/test/unit/storage/disk_test.py b/test/unit/storage/disk_test.py index 0a1fb12c222..d0e71524bdb 100644 --- a/test/unit/storage/disk_test.py +++ b/test/unit/storage/disk_test.py @@ -306,50 +306,46 @@ def test_map_partitions_other(self, mock_command): @patch('kiwi.storage.disk.Command.run') def test_destructor_partx_loop_cleanup_failed(self, mock_command): - self.disk.is_mapped = True - self.disk.partition_map = {'root': '/dev/loop0p1'} mock_command.side_effect = Exception - self.disk.__del__() + with Disk('gpt', self.storage_provider) as disk: + disk.is_mapped = True + disk.partition_map = {'root': '/dev/loop0p1'} with self._caplog.at_level(logging.WARNING): mock_command.assert_called_once_with( ['partx', '--delete', '/dev/loop0'] ) - self.disk.is_mapped = False @patch('kiwi.storage.disk.Command.run') def test_destructor_dm_loop_cleanup_failed(self, mock_command): - self.disk.partition_mapper = 'kpartx' - self.disk.is_mapped = True - self.disk.partition_map = {'root': '/dev/mapper/loop0p1'} mock_command.side_effect = Exception - self.disk.__del__() + with Disk('gpt', self.storage_provider) as disk: + disk.partition_mapper = 'kpartx' + disk.is_mapped = True + disk.partition_map = {'root': '/dev/mapper/loop0p1'} with self._caplog.at_level(logging.WARNING): mock_command.assert_called_once_with( ['dmsetup', 'remove', '/dev/mapper/loop0p1'] ) - self.disk.is_mapped = False @patch('kiwi.storage.disk.Command.run') def test_destructor_partx(self, mock_command): - self.disk.is_mapped = True - self.disk.partition_map = {'root': '/dev/loop0p1'} - self.disk.__del__() + with Disk('gpt', self.storage_provider) as disk: + disk.is_mapped = True + disk.partition_map = {'root': '/dev/loop0p1'} assert mock_command.call_args_list == [ call(['partx', '--delete', '/dev/loop0']) ] - self.disk.is_mapped = False @patch('kiwi.storage.disk.Command.run') def test_destructor_kpartx(self, mock_command): - self.disk.partition_mapper = 'kpartx' - self.disk.is_mapped = True - self.disk.partition_map = {'root': '/dev/mapper/loop0p1'} - self.disk.__del__() + with Disk('gpt', self.storage_provider) as disk: + disk.partition_mapper = 'kpartx' + disk.is_mapped = True + disk.partition_map = {'root': '/dev/mapper/loop0p1'} assert mock_command.call_args_list == [ call(['dmsetup', 'remove', '/dev/mapper/loop0p1']), call(['kpartx', '-d', '/dev/loop0']) ] - self.disk.is_mapped = False def test_get_public_partition_id_map(self): assert self.disk.get_public_partition_id_map() == {}