kiwi-el8/test/unit/builder_disk_test.py
Marcus Schäfer 32c553bbd2
Cleanup use of partition id maps
For the partition setup the Disk class uses dictionaries
to map the partition name to the partition number. However
there are public partition names such as 'kiwi_BootPart'
and kiwi internal partition names such as 'boot'. The code
should make it more clear which mapping table is used
2016-04-14 15:38:31 +02:00

481 lines
18 KiB
Python

from mock import patch
from mock import call
import mock
import kiwi
from .test_helper import *
from collections import OrderedDict
from kiwi.exceptions import *
from kiwi.xml_description import XMLDescription
from kiwi.xml_state import XMLState
from kiwi.builder.disk import DiskBuilder
from kiwi.storage.mapped_device import MappedDevice
class TestDiskBuilder(object):
@patch('os.path.exists')
@patch('platform.machine')
def setup(self, mock_machine, mock_exists):
mock_machine.return_value = 'x86_64'
mock_exists.return_value = True
description = XMLDescription(
'../data/example_disk_config.xml'
)
self.device_map = {
'root': MappedDevice('/dev/root-device', mock.Mock()),
'boot': MappedDevice('/dev/boot-device', mock.Mock()),
'prep': MappedDevice('/dev/prep-device', mock.Mock()),
'efi': MappedDevice('/dev/efi-device', mock.Mock())
}
self.id_map = {
'kiwi_RootPart': 1,
'kiwi_BootPart': 1
}
self.id_map_sorted = OrderedDict(
sorted(self.id_map.items())
)
self.loop_provider = mock.Mock()
kiwi.builder.disk.LoopDevice = mock.Mock(
return_value=self.loop_provider
)
self.disk = mock.Mock()
provider = mock.Mock()
provider.get_device = mock.Mock(
return_value='/dev/some-loop'
)
self.disk.storage_provider = provider
self.partitioner = mock.Mock()
self.partitioner.get_id = mock.Mock(
return_value=1
)
self.disk.partitioner = self.partitioner
self.disk.get_uuid = mock.Mock(
return_value='0815'
)
self.disk.get_public_partition_id_map = mock.Mock(
return_value=self.id_map_sorted
)
self.disk.get_device = mock.Mock(
return_value=self.device_map
)
self.kernel = mock.Mock()
self.kernel.get_kernel = mock.Mock()
self.kernel.get_xen_hypervisor = mock.Mock()
self.kernel.copy_kernel = mock.Mock()
self.kernel.copy_xen_hypervisor = mock.Mock()
kiwi.builder.disk.Kernel = mock.Mock(
return_value=self.kernel
)
self.disk.subformat = mock.Mock()
self.disk.subformat.get_target_name_for_format = mock.Mock(
return_value='some-target-format-name'
)
kiwi.builder.disk.DiskFormat = mock.Mock(
return_value=self.disk.subformat
)
kiwi.builder.disk.Disk = mock.Mock(
return_value=self.disk
)
self.disk_setup = mock.Mock()
self.disk_setup.get_efi_label = mock.Mock(
return_value='EFI'
)
self.disk_setup.get_root_label = mock.Mock(
return_value='ROOT'
)
self.disk_setup.get_boot_label = mock.Mock(
return_value='BOOT'
)
self.disk_setup.need_boot_partition = mock.Mock(
return_value=True
)
self.bootloader_install = mock.Mock()
kiwi.builder.disk.BootLoaderInstall = mock.MagicMock(
return_value=self.bootloader_install
)
self.bootloader_config = mock.Mock()
kiwi.builder.disk.BootLoaderConfig = mock.MagicMock(
return_value=self.bootloader_config
)
kiwi.builder.disk.DiskSetup = mock.MagicMock(
return_value=self.disk_setup
)
self.boot_image_task = mock.Mock()
self.boot_image_task.boot_root_directory = 'boot_dir'
self.boot_image_task.kernel_filename = 'kernel'
self.boot_image_task.initrd_filename = 'initrd'
self.boot_image_task.xen_hypervisor_filename = 'xen_hypervisor'
kiwi.builder.disk.BootImage = mock.Mock(
return_value=self.boot_image_task
)
self.firmware = mock.Mock()
self.firmware.efi_mode = mock.Mock(
return_value='efi'
)
kiwi.builder.disk.FirmWare = mock.Mock(
return_value=self.firmware
)
self.setup = mock.Mock()
kiwi.builder.disk.SystemSetup = mock.Mock(
return_value=self.setup
)
self.install_image = mock.Mock()
kiwi.builder.disk.InstallImageBuilder = mock.Mock(
return_value=self.install_image
)
self.raid_root = mock.Mock()
kiwi.builder.disk.RaidDevice = mock.Mock(
return_value=self.raid_root
)
self.luks_root = mock.Mock()
kiwi.builder.disk.LuksDevice = mock.Mock(
return_value=self.luks_root
)
self.disk_builder = DiskBuilder(
XMLState(description.load()), 'target_dir', 'root_dir'
)
self.disk_builder.build_type_name = 'oem'
self.machine = mock.Mock()
self.machine.get_domain = mock.Mock(
return_value='dom0'
)
self.disk_builder.machine = self.machine
self.disk_builder.image_format = None
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_ix86(self, mock_machine, mock_exists):
mock_machine.return_value = 'i686'
description = XMLDescription(
'../data/example_disk_config.xml'
)
disk_builder = DiskBuilder(
XMLState(description.load()), 'target_dir', 'root_dir'
)
assert disk_builder.arch == 'ix86'
@raises(KiwiInstallMediaError)
def test_create_invalid_type_for_install_media(self):
self.disk_builder.build_type_name = 'vmx'
self.disk_builder.create()
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('random.randrange')
@patch('kiwi.builder.disk.Command.run')
@patch('os.path.exists')
def test_create_standard_root(
self, mock_path, mock_command, mock_rand, mock_open, mock_fs
):
mock_path.return_value = True
mock_rand.return_value = 15
context_manager_mock = mock.Mock()
mock_open.return_value = context_manager_mock
file_mock = mock.Mock()
enter_mock = mock.Mock()
exit_mock = mock.Mock()
enter_mock.return_value = file_mock
setattr(context_manager_mock, '__enter__', enter_mock)
setattr(context_manager_mock, '__exit__', exit_mock)
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = None
self.disk_builder.install_iso = True
self.disk_builder.install_pxe = True
self.disk_builder.create()
self.setup.create_recovery_archive.assert_called_once_with()
self.setup.export_modprobe_setup.assert_called_once_with(
'boot_dir'
)
self.disk_setup.get_disksize_mbytes.assert_called_once_with()
self.loop_provider.create.assert_called_once_with()
self.disk.wipe.assert_called_once_with()
self.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(
self.firmware.get_efi_partition_size()
)
self.disk.create_boot_partition.assert_called_once_with(
self.disk_setup.boot_partition_size()
)
self.disk.create_prep_partition.assert_called_once_with(
self.firmware.get_prep_partition_size()
)
self.disk.create_root_partition.assert_called_once_with(
'all_free'
)
self.disk.map_partitions.assert_called_once_with()
self.bootloader_config.setup_disk_boot_images.assert_called_once_with(
'0815'
)
self.bootloader_config.setup_disk_image_config.assert_called_once_with(
uuid='0815', kernel='linux.vmx', initrd='initrd.vmx'
)
self.setup.call_edit_boot_config_script.assert_called_once_with(
'btrfs', 1
)
self.bootloader_install.install.assert_called_once_with()
self.setup.call_edit_boot_install_script.assert_called_once_with(
'target_dir/LimeJeOS-openSUSE-13.2.x86_64-1.13.2.raw',
'/dev/boot-device'
)
self.install_image.create_install_iso.assert_called_once_with()
self.install_image.create_install_pxe_archive.assert_called_once_with()
call = filesystem.create_on_device.call_args_list[0]
assert filesystem.create_on_device.call_args_list[0] == \
call(label='EFI')
call = filesystem.create_on_device.call_args_list[1]
assert filesystem.create_on_device.call_args_list[1] == \
call(label='BOOT')
call = filesystem.create_on_device.call_args_list[2]
assert filesystem.create_on_device.call_args_list[2] == \
call(label='ROOT')
call = filesystem.sync_data.call_args_list[0]
assert filesystem.sync_data.call_args_list[0] == \
call()
call = filesystem.sync_data.call_args_list[1]
assert filesystem.sync_data.call_args_list[1] == \
call(['efi/*'])
call = filesystem.sync_data.call_args_list[2]
assert filesystem.sync_data.call_args_list[2] == \
call([
'image', '.profile', '.kconfig', 'var/cache/kiwi',
'boot/*', 'boot/.*', 'boot/efi/*', 'boot/efi/.*'
])
assert mock_open.call_args_list == [
call('boot_dir/config.partids', 'w'),
call('root_dir/boot/mbrid', 'w'),
call('/dev/some-loop', 'wb')
]
assert file_mock.write.call_args_list == [
call('kiwi_BootPart="1"\n'),
call('kiwi_RootPart="1"\n'),
call('0x0f0f0f0f\n'),
call(b'\x0f\x0f\x0f\x0f')
]
assert mock_command.call_args_list == [
call(['cp', 'root_dir/recovery.partition.size', 'boot_dir']),
call(['mv', 'initrd', 'root_dir/boot/initrd.vmx']),
]
self.kernel.copy_kernel.assert_called_once_with(
'root_dir', '/boot/linux.vmx'
)
self.kernel.copy_xen_hypervisor.assert_called_once_with(
'root_dir', '/boot/xen.gz'
)
self.setup.export_rpm_package_list.assert_called_once_with(
'target_dir'
)
self.setup.export_rpm_package_verification.assert_called_once_with(
'target_dir'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_standard_root_dracut_initrd_system(
self, mock_command, mock_open, mock_fs
):
self.disk_builder.initrd_system = 'dracut'
kernel = mock.Mock()
kernel.version = '1.2.3'
self.kernel.get_kernel.return_value = kernel
self.disk_builder.create()
self.bootloader_config.setup_disk_image_config.assert_called_once_with(
uuid='0815', initrd='initrd-1.2.3', kernel='vmlinuz-1.2.3'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_standard_root_dracut_initrd_system_on_arm(
self, mock_command, mock_open, mock_fs
):
self.disk_builder.initrd_system = 'dracut'
self.disk_builder.arch = 'aarch64'
kernel = mock.Mock()
kernel.version = '1.2.3'
self.kernel.get_kernel.return_value = kernel
self.disk_builder.create()
self.bootloader_config.setup_disk_image_config.assert_called_once_with(
uuid='0815', initrd='initrd-1.2.3', kernel='zImage-1.2.3'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
@raises(KiwiDiskBootImageError)
def test_create_standard_root_no_kernel_found(
self, mock_command, mock_open, mock_fs
):
self.kernel.get_kernel.return_value = False
self.disk_builder.create()
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
@raises(KiwiDiskBootImageError)
def test_create_standard_root_no_hypervisor_found(
self, mock_command, mock_open, mock_fs
):
self.kernel.get_xen_hypervisor.return_value = False
self.disk_builder.create()
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_standard_root_s390_boot(
self, mock_command, mock_open, mock_fs
):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = None
self.firmware.efi_mode = mock.Mock(
return_value=False
)
self.disk_builder.bootloader = 'grub2_s390x_emu'
self.disk_builder.create()
assert mock_fs.call_args_list[1] == call(
'ext2', self.device_map['boot'], 'root_dir/boot/zipl/'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_standard_root_secure_boot(
self, mock_command, mock_open, mock_fs
):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = None
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
self.disk_builder.create()
bootloader = self.bootloader_config
bootloader.setup_disk_boot_images.assert_called_once_with('0815')
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_mdraid_root(self, mock_command, mock_open, mock_fs):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = None
self.disk_builder.mdraid = 'mirroring'
self.disk_builder.create()
self.disk.create_root_raid_partition.assert_called_once_with(
'all_free'
)
self.raid_root.create_degraded_raid.assert_called_once_with(
raid_level='mirroring'
)
self.raid_root.create_raid_config.assert_called_once_with(
'boot_dir/etc/mdadm.conf'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_luks_root(self, mock_command, mock_open, mock_fs):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = None
self.disk_builder.luks = 'passphrase'
self.disk_builder.create()
self.luks_root.create_crypto_luks.assert_called_once_with(
passphrase='passphrase', os=None
)
self.luks_root.create_crypttab.assert_called_once_with(
'root_dir/etc/crypttab'
)
@patch('kiwi.builder.disk.FileSystem')
@patch('kiwi.builder.disk.VolumeManager')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
@patch('os.path.exists')
def test_create_volume_managed_root(
self, mock_exists, mock_command, mock_open, mock_volume_manager, mock_fs
):
mock_exists.return_value = True
volume_manager = mock.Mock()
volume_manager.get_device = mock.Mock(
return_value={
'root': MappedDevice('/dev/systemVG/LVRoot', mock.Mock())
}
)
mock_volume_manager.return_value = volume_manager
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.volume_manager_name = 'lvm'
self.disk_builder.create()
self.disk.create_root_lvm_partition.assert_called_once_with(
'all_free'
)
volume_manager.setup.assert_called_once_with('systemVG')
volume_manager.create_volumes.assert_called_once_with('btrfs')
volume_manager.sync_data.assert_called_once_with([
'image', '.profile', '.kconfig', 'var/cache/kiwi',
'boot/*', 'boot/.*', 'boot/efi/*', 'boot/efi/.*'
])
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_hybrid_gpt_requested(
self, mock_command, mock_open, mock_fs
):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.install_media = False
self.disk_builder.hybrid_mbr = True
self.disk_builder.create()
self.disk.create_hybrid_mbr.assert_called_once_with()
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_vboot_firmware_requested(
self, mock_command, mock_open, mock_fs
):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.install_media = False
self.disk_builder.firmware.vboot_mode.return_value = True
self.disk_builder.firmware.get_vboot_partition_size.return_value = 42
self.disk_builder.create()
self.disk.create_vboot_partition.assert_called_once_with(42)
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
def test_create_with_image_format(self, mock_command, mock_open, mock_fs):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.install_media = False
self.disk_builder.image_format = 'vmdk'
self.disk_builder.create()
self.disk.subformat.create_image_format.assert_called_once_with()
@patch('kiwi.builder.disk.FileSystem')
@patch('builtins.open')
@patch('kiwi.builder.disk.Command.run')
@patch('kiwi.logger.log.warning')
def test_create_with_ignore_format_on_install_media(
self, mock_log_warn, mock_command, mock_open, mock_fs
):
filesystem = mock.Mock()
mock_fs.return_value = filesystem
self.disk_builder.install_media = True
self.disk_builder.image_format = 'vmdk'
self.disk_builder.create()
assert mock_log_warn.called