kiwi-el8/test/unit/bootloader_config_grub2_test.py
Marcus Schäfer 84a09c78d1 Cleanup use of suseGFXBoot regarding grub
The shell method suseGFXBoot from the config/functions contains
code which should be better moved to the python code base dealing
with the bootloader configuration. In this commit all grub
parts of it has been moved to the BootLoaderConfigGrub2 class
2017-06-13 12:41:08 +02:00

954 lines
36 KiB
Python

from mock import patch
from mock import call
import mock
import kiwi
from .test_helper import raises, patch_open
from kiwi.xml_state import XMLState
from kiwi.xml_description import XMLDescription
from kiwi.exceptions import (
KiwiBootLoaderGrubPlatformError,
KiwiBootLoaderGrubSecureBootError,
KiwiTemplateError,
KiwiBootLoaderGrubDataError,
KiwiBootLoaderGrubFontError,
KiwiBootLoaderGrubModulesError
)
from kiwi.bootloader.config.grub2 import BootLoaderConfigGrub2
class TestBootLoaderConfigGrub2(object):
@patch('kiwi.bootloader.config.grub2.FirmWare')
@patch('kiwi.bootloader.config.base.BootLoaderConfigBase.get_boot_theme')
@patch('kiwi.bootloader.config.base.BootLoaderConfigBase.get_hypervisor_domain')
@patch('platform.machine')
def setup(
self, mock_machine, mock_domain, mock_theme, mock_firmware
):
self.context_manager_mock = mock.Mock()
self.file_mock = mock.Mock()
self.enter_mock = mock.Mock()
self.exit_mock = mock.Mock()
self.enter_mock.return_value = self.file_mock
setattr(self.context_manager_mock, '__enter__', self.enter_mock)
setattr(self.context_manager_mock, '__exit__', self.exit_mock)
self.os_exists = {
'root_dir/boot/unicode.pf2': True,
'root_dir/boot/grub2/themes/some-theme/background.png': True,
'root_dir/usr/share/grub2': True,
'root_dir/usr/share/grub': False,
'root_dir/boot/grub2/themes': False,
'root_dir/boot/grub/themes': False,
'root_dir/boot/grub/unicode.pf2': False,
'root_dir/usr/lib/grub2': True,
'root_dir/usr/lib/grub': False,
'root_dir/boot/grub2/x86_64-efi': False,
'root_dir/boot/grub2/i386-pc': False,
'root_dir/boot/grub2/x86_64-xen': False,
'root_dir/usr/lib64/efi/shim.efi': True,
'root_dir/usr/lib64/efi/grub.efi': True,
'root_dir/usr/lib64/efi/does-not-exist': False,
'root_dir/boot/efi/': True
}
self.glob_iglob = [
['root_dir/usr/lib64/efi/grub.efi'],
['root_dir/usr/lib64/efi/shim.efi']
]
mock_machine.return_value = 'x86_64'
mock_theme.return_value = None
mock_domain.return_value = None
kiwi.bootloader.config.grub2.Path = mock.Mock()
kiwi.bootloader.config.base.Path = mock.Mock()
self.firmware = mock.Mock()
self.firmware.ec2_mode = mock.Mock(
return_value=None
)
self.firmware.efi_mode = mock.Mock(
return_value=None
)
mock_firmware.return_value = self.firmware
self.mbrid = mock.Mock()
self.mbrid.get_id = mock.Mock(
return_value='0xffffffff'
)
self.grub2 = mock.Mock()
kiwi.bootloader.config.grub2.BootLoaderTemplateGrub2 = mock.Mock(
return_value=self.grub2
)
self.state = XMLState(
XMLDescription('../data/example_config.xml').load()
)
self.bootloader = BootLoaderConfigGrub2(
self.state, 'root_dir', {'grub_directory_name': 'grub2'}
)
@patch('platform.machine')
@patch('kiwi.bootloader.config.grub2.Path.which')
def test_post_init_grub2_boot_directory(self, mock_which, mock_machine):
xml_state = mock.MagicMock()
xml_state.build_type.get_firmware = mock.Mock(
return_value=None
)
mock_machine.return_value = 'i686'
mock_which.return_value = None
bootloader = BootLoaderConfigGrub2(xml_state, 'root_dir')
assert bootloader.boot_directory_name == 'grub'
@raises(KiwiBootLoaderGrubPlatformError)
@patch('platform.machine')
def test_post_init_invalid_platform(self, mock_machine):
mock_machine.return_value = 'unsupported-arch'
BootLoaderConfigGrub2(mock.Mock(), 'root_dir')
@patch('kiwi.logger.log.warning')
@patch('kiwi.defaults.Defaults.get_shim_loader')
@patch('kiwi.defaults.Defaults.get_signed_grub_loader')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch('builtins.open')
@patch('os.path.exists')
@patch('platform.machine')
@raises(KiwiBootLoaderGrubSecureBootError)
def test_setup_install_boot_images_raises_no_shim(
self, mock_machine, mock_exists, mock_open,
mock_sync, mock_command, mock_grub, mock_shim, mock_warn
):
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
mock_shim.return_value = None
mock_grub.return_value = 'grub.efi'
mock_machine.return_value = 'x86_64'
self.bootloader.theme = 'some-theme'
self.os_exists['root_dir/usr/share/grub2/themes/some-theme'] = False
self.os_exists['root_dir/boot/grub2/themes/some-theme'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_install_boot_images(self.mbrid)
@patch('kiwi.logger.log.warning')
@patch('kiwi.defaults.Defaults.get_shim_loader')
@patch('kiwi.defaults.Defaults.get_signed_grub_loader')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch('builtins.open')
@patch('os.path.exists')
@patch('platform.machine')
@raises(KiwiBootLoaderGrubSecureBootError)
def test_setup_install_boot_images_raises_no_efigrub(
self, mock_machine, mock_exists, mock_open,
mock_sync, mock_command, mock_grub, mock_shim, mock_warn
):
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
mock_shim.return_value = 'shim.efi'
mock_grub.return_value = None
mock_machine.return_value = 'x86_64'
self.bootloader.theme = 'some-theme'
self.os_exists['root_dir/usr/share/grub2/themes/some-theme'] = False
self.os_exists['root_dir/boot/grub2/themes/some-theme'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_install_boot_images(self.mbrid)
@patch('platform.machine')
def test_post_init_ix86_platform(self, mock_machine):
xml_state = mock.MagicMock()
xml_state.build_type.get_firmware = mock.Mock(
return_value=None
)
mock_machine.return_value = 'i686'
bootloader = BootLoaderConfigGrub2(xml_state, 'root_dir')
assert bootloader.arch == 'ix86'
@patch('platform.machine')
def test_post_init_ppc_platform(self, mock_machine):
xml_state = mock.MagicMock()
xml_state.build_type.get_firmware = mock.Mock(
return_value=None
)
mock_machine.return_value = 'ppc64'
bootloader = BootLoaderConfigGrub2(xml_state, 'root_dir')
assert bootloader.arch == mock_machine.return_value
@patch('platform.machine')
def test_post_init_arm64_platform(self, mock_machine):
xml_state = mock.MagicMock()
xml_state.build_type.get_firmware = mock.Mock(
return_value=None
)
mock_machine.return_value = 'arm64'
bootloader = BootLoaderConfigGrub2(xml_state, 'root_dir')
assert bootloader.arch == mock_machine.return_value
@patch('os.path.exists')
@patch('platform.machine')
@patch('kiwi.bootloader.config.base.BootLoaderConfigBase.get_hypervisor_domain')
def test_post_init_dom0(self, mock_domain, mock_machine, mock_exists):
mock_machine.return_value = 'x86_64'
mock_domain.return_value = 'dom0'
mock_exists.return_value = True
self.bootloader.post_init(None)
assert self.bootloader.multiboot is True
assert self.bootloader.hybrid_boot is False
assert self.bootloader.xen_guest is False
@patch('os.path.exists')
@patch('platform.machine')
@patch('kiwi.bootloader.config.base.BootLoaderConfigBase.get_hypervisor_domain')
def test_post_init_domU(self, mock_domain, mock_machine, mock_exists):
mock_machine.return_value = 'x86_64'
mock_domain.return_value = 'domU'
mock_exists.return_value = True
self.bootloader.post_init(None)
assert self.bootloader.multiboot is False
assert self.bootloader.hybrid_boot is False
assert self.bootloader.xen_guest is True
@patch('os.path.exists')
@patch('platform.machine')
def test_post_init_ec2(self, mock_machine, mock_exists):
mock_machine.return_value = 'x86_64'
mock_exists.return_value = True
self.bootloader.firmware.ec2_mode.return_value = 'ec2hvm'
self.bootloader.post_init(None)
assert self.bootloader.xen_guest is True
@patch_open
@patch('os.path.exists')
@patch.object(BootLoaderConfigGrub2, '_setup_default_grub')
@patch.object(BootLoaderConfigGrub2, 'setup_sysconfig_bootloader')
@patch('glob.iglob')
@patch('kiwi.bootloader.config.grub2.Command.run')
def test_write(
self, mock_command, mock_glob, mock_setup_sysconfig_bootloader,
mock_setup_default_grub, mock_exists, mock_open
):
mock_exists.return_value = True
mock_open.return_value = self.context_manager_mock
self.bootloader.config = 'some-data'
self.bootloader.efi_boot_path = 'root_dir/boot/efi/EFI/BOOT/'
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
self.bootloader.iso_boot = True
mock_glob.return_value = []
self.bootloader.write()
assert mock_open.call_args_list == [
call('root_dir/boot/grub2/grub.cfg', 'w'),
call('root_dir/boot/efi/EFI/BOOT/grub.cfg', 'w')
]
assert self.file_mock.write.call_args_list == [
call('some-data'),
call('some-data')
]
assert mock_command.call_args_list == [
call([
'qemu-img', 'create', 'root_dir/boot/x86_64/efi', '15M'
]),
call([
'mkdosfs', '-n', 'BOOT', 'root_dir/boot/x86_64/efi'
]),
call([
'mcopy', '-Do', '-s', '-i', 'root_dir/boot/x86_64/efi',
'root_dir/EFI', '::'
])
]
mock_setup_default_grub.assert_called_once_with()
mock_setup_sysconfig_bootloader.assert_called_once_with()
@patch_open
@patch('os.path.exists')
@patch.object(BootLoaderConfigGrub2, '_setup_default_grub')
@patch.object(BootLoaderConfigGrub2, 'setup_sysconfig_bootloader')
@patch('glob.iglob')
@patch('kiwi.bootloader.config.grub2.Command.run')
def test_write_efi_for_vendor(
self, mock_command, mock_glob, mock_setup_sysconfig_bootloader,
mock_setup_default_grub, mock_exists, mock_open
):
mock_exists.return_value = True
mock_open.return_value = self.context_manager_mock
self.bootloader.config = 'some-data'
self.bootloader.efi_boot_path = 'root_dir/boot/efi/EFI/BOOT/'
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
self.bootloader.iso_boot = True
mock_glob.return_value = ['root_dir/boot/efi/EFI/fedora/shim.efi']
self.bootloader.write()
assert mock_open.call_args_list == [
call('root_dir/boot/grub2/grub.cfg', 'w'),
call('root_dir/boot/efi/EFI/fedora/grub.cfg', 'w')
]
@patch('os.path.exists')
@patch('kiwi.bootloader.config.grub2.SysConfig')
def test__setup_default_grub(self, mock_sysconfig, mock_exists):
grub_default = mock.MagicMock()
mock_sysconfig.return_value = grub_default
mock_exists.return_value = True
self.bootloader.cmdline = 'some-cmdline'
self.bootloader.terminal = 'serial'
self.bootloader.theme = 'openSUSE'
self.firmware.efi_mode.return_value = 'efi'
self.bootloader._setup_default_grub()
mock_sysconfig.assert_called_once_with('root_dir/etc/default/grub')
grub_default.write.assert_called_once_with()
assert grub_default.__setitem__.call_args_list == [
call('GRUB_BACKGROUND', '/boot/grub2/themes/openSUSE/background.png'),
call('GRUB_CMDLINE_LINUX', '"some-cmdline"'),
call('GRUB_SERIAL_COMMAND', '"serial --speed=38400 --unit=0 --word=8 --parity=no --stop=1"'),
call('GRUB_THEME', '/boot/grub2/themes/openSUSE/theme.txt'),
call('GRUB_TIMEOUT', 10),
call('GRUB_USE_INITRDEFI', 'true'),
call('GRUB_USE_LINUXEFI', 'true'),
call('SUSE_BTRFS_SNAPSHOT_BOOTING', 'true')
]
@patch('os.path.exists')
@patch('kiwi.bootloader.config.grub2.SysConfig')
def test_setup_sysconfig_bootloader(self, mock_sysconfig, mock_exists):
sysconfig_bootloader = mock.MagicMock()
mock_sysconfig.return_value = sysconfig_bootloader
mock_exists.return_value = True
self.bootloader.cmdline = 'some-cmdline'
self.bootloader.cmdline_failsafe = 'some-failsafe-cmdline'
self.bootloader.setup_sysconfig_bootloader()
mock_sysconfig.assert_called_once_with(
'root_dir/etc/sysconfig/bootloader'
)
sysconfig_bootloader.write.assert_called_once_with()
assert sysconfig_bootloader.__setitem__.call_args_list == [
call('DEFAULT_APPEND', '"some-cmdline"'),
call('FAILSAFE_APPEND', '"some-failsafe-cmdline"'),
call('LOADER_LOCATION', 'mbr'),
call('LOADER_TYPE', 'grub2')
]
def test_setup_live_image_config_multiboot(self):
self.bootloader.multiboot = True
self.bootloader.setup_live_image_config(self.mbrid)
self.grub2.get_multiboot_iso_template.assert_called_once_with(
True, 'gfxterm'
)
def test_setup_live_image_config_standard(self):
self.bootloader.multiboot = False
self.bootloader.setup_live_image_config(self.mbrid)
self.grub2.get_iso_template.assert_called_once_with(
True, True, 'gfxterm'
)
def test_setup_disk_image_config_multiboot(self):
self.bootloader.multiboot = True
self.bootloader.setup_disk_image_config('boot_uuid', 'root_uuid')
self.grub2.get_multiboot_disk_template.assert_called_once_with(
True, 'gfxterm'
)
def test_setup_install_image_config_multiboot(self):
self.bootloader.multiboot = True
self.bootloader.setup_install_image_config(self.mbrid)
self.grub2.get_multiboot_install_template.assert_called_once_with(
True, 'gfxterm'
)
def test_setup_disk_image_config_standard(self):
self.bootloader.multiboot = False
self.bootloader.setup_disk_image_config('boot_uuid', 'root_uuid')
self.grub2.get_disk_template.assert_called_once_with(
True, True, 'gfxterm'
)
def test_setup_install_image_config_standard(self):
self.bootloader.multiboot = False
self.bootloader.setup_install_image_config(self.mbrid)
self.grub2.get_install_template.assert_called_once_with(
True, True, 'gfxterm'
)
@raises(KiwiTemplateError)
def test_setup_iso_image_config_substitute_error(self):
self.bootloader.multiboot = True
template = mock.Mock()
template.substitute = mock.Mock()
template.substitute.side_effect = Exception
self.grub2.get_multiboot_iso_template = mock.Mock(
return_value=template
)
self.bootloader.setup_live_image_config(self.mbrid)
@raises(KiwiTemplateError)
def test_setup_disk_image_config_substitute_error(self):
self.bootloader.multiboot = True
template = mock.Mock()
template.substitute = mock.Mock()
template.substitute.side_effect = Exception
self.grub2.get_multiboot_disk_template = mock.Mock(
return_value=template
)
self.bootloader.setup_disk_image_config('boot_uuid', 'root_uuid')
@raises(KiwiTemplateError)
def test_setup_install_image_config_substitute_error(self):
self.bootloader.multiboot = True
template = mock.Mock()
template.substitute = mock.Mock()
template.substitute.side_effect = Exception
self.grub2.get_multiboot_install_template = mock.Mock(
return_value=template
)
self.bootloader.setup_install_image_config(self.mbrid)
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('os.path.exists')
@raises(KiwiBootLoaderGrubDataError)
def test_no_grub_installation_found(self, mock_exists, mock_command):
self.os_exists['root_dir/boot/unicode.pf2'] = False
self.os_exists['root_dir/usr/share/grub2'] = False
self.os_exists['root_dir/usr/share/grub'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('0815')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('os.path.exists')
@raises(KiwiBootLoaderGrubFontError)
def test_setup_disk_boot_images_raises_font_does_not_exist(
self, mock_exists, mock_command
):
self.os_exists['root_dir/boot/unicode.pf2'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
mock_command.side_effect = Exception
self.bootloader.setup_disk_boot_images('0815')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('platform.machine')
@patch('os.path.exists')
@patch.object(BootLoaderConfigGrub2, '_copy_theme_data_to_boot_directory')
@raises(KiwiBootLoaderGrubModulesError)
def test_setup_disk_boot_images_raises_grub_modules_does_not_exist(
self, mock_copy_theme_data, mock_exists, mock_machine, mock_command
):
mock_exists.return_value = True
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value=False
)
mock_command.side_effect = Exception
self.bootloader.setup_disk_boot_images('0815')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch_open
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_disk_boot_images_xen_guest_efi_image_needs_multiboot(
self, mock_machine, mock_exists, mock_open, mock_sync, mock_command
):
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='efi'
)
self.bootloader.xen_guest = True
self.os_exists['root_dir/boot/unicode.pf2'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('0815')
assert mock_command.call_args_list == [
call([
'cp', 'root_dir/usr/share/grub2/unicode.pf2',
'root_dir/boot/unicode.pf2'
]),
call([
'grub2-mkimage', '-O', 'x86_64-efi',
'-o', 'root_dir/boot/efi/EFI/BOOT/bootx64.efi',
'-c', 'root_dir/boot/efi/EFI/BOOT/earlyboot.cfg',
'-p', '//grub2',
'-d', 'root_dir/usr/lib/grub2/x86_64-efi',
'ext2', 'iso9660', 'linux', 'echo', 'configfile',
'search_label', 'search_fs_file', 'search', 'search_fs_uuid',
'ls', 'normal', 'gzio', 'png', 'fat', 'gettext', 'font',
'minicmd', 'gfxterm', 'gfxmenu', 'video', 'video_fb', 'xfs',
'btrfs', 'lvm', 'test', 'multiboot', 'part_gpt',
'part_msdos', 'efi_gop', 'efi_uga', 'linuxefi'
])
]
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch_open
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_disk_boot_images_bios_plus_efi(
self, mock_machine, mock_exists, mock_open, mock_sync, mock_command
):
data = mock.Mock()
mock_sync.return_value = data
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='efi'
)
self.os_exists['root_dir/boot/unicode.pf2'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
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)
self.bootloader.setup_disk_boot_images('0815')
mock_open.assert_called_once_with(
'root_dir/boot/efi/EFI/BOOT/earlyboot.cfg', 'w'
)
assert file_mock.write.call_args_list == [
call('search --fs-uuid --set=root 0815\n'),
call('set prefix=($root)//grub2\n')
]
assert mock_command.call_args_list == [
call([
'cp', 'root_dir/usr/share/grub2/unicode.pf2',
'root_dir/boot/unicode.pf2'
]),
call([
'grub2-mkimage', '-O', 'x86_64-efi',
'-o', 'root_dir/boot/efi/EFI/BOOT/bootx64.efi',
'-c', 'root_dir/boot/efi/EFI/BOOT/earlyboot.cfg',
'-p', '//grub2',
'-d', 'root_dir/usr/lib/grub2/x86_64-efi',
'ext2', 'iso9660', 'linux', 'echo', 'configfile',
'search_label', 'search_fs_file', 'search', 'search_fs_uuid',
'ls', 'normal', 'gzio', 'png', 'fat', 'gettext', 'font',
'minicmd', 'gfxterm', 'gfxmenu', 'video', 'video_fb', 'xfs',
'btrfs', 'lvm', 'test', 'part_gpt', 'part_msdos', 'efi_gop',
'efi_uga', 'linuxefi'
])
]
assert mock_sync.call_args_list == [
call(
'root_dir/usr/lib/grub2/i386-pc/',
'root_dir/boot/grub2/i386-pc'
),
call(
'root_dir/usr/lib/grub2/x86_64-efi/',
'root_dir/boot/grub2/x86_64-efi'
)
]
assert data.sync_data.call_args_list == [
call(exclude=['*.module'], options=['-z', '-a']),
call(exclude=['*.module'], options=['-z', '-a'])
]
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_disk_boot_images_xen_guest(
self, mock_machine, mock_exists, mock_sync, mock_command
):
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value=None
)
self.bootloader.xen_guest = True
self.os_exists['root_dir/boot/unicode.pf2'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('0815')
mock_command.assert_called_once_with(
[
'cp', 'root_dir/usr/share/grub2/unicode.pf2',
'root_dir/boot/unicode.pf2'
]
)
mock_sync.assert_called_once_with(
'root_dir/usr/lib/grub2/x86_64-xen/',
'root_dir/boot/grub2/x86_64-xen'
)
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_disk_boot_images_ppc(
self, mock_machine, mock_exists, mock_sync, mock_command
):
mock_machine.return_value = 'ppc64le'
self.bootloader.arch = 'ppc64le'
self.firmware.efi_mode = mock.Mock(
return_value=None
)
self.bootloader.xen_guest = False
self.os_exists['root_dir/boot/unicode.pf2'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('0815')
mock_command.assert_called_once_with(
[
'cp', 'root_dir/usr/share/grub2/unicode.pf2',
'root_dir/boot/unicode.pf2'
]
)
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('os.path.exists')
@patch('platform.machine')
@patch('kiwi.logger.log.info')
def test_setup_disk_boot_images_bios_plus_efi_secure_boot(
self, mock_log, mock_machine, mock_exists, mock_command
):
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('uuid')
assert mock_command.call_args_list == [
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/i386-pc/',
'root_dir/boot/grub2/i386-pc'
]),
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/x86_64-efi/',
'root_dir/boot/grub2/x86_64-efi']
)]
assert mock_log.called
@patch('kiwi.bootloader.config.grub2.Path.which')
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('os.path.exists')
@patch('platform.machine')
@patch('kiwi.logger.log.info')
@patch('glob.iglob')
def test_setup_disk_boot_images_bios_plus_efi_secure_boot_no_shim_install(
self, mock_glob, mock_log, mock_machine, mock_exists,
mock_command, mock_which
):
# we expect the copy of shim.efi and grub.efi from the fallback
# code if no shim_install was found for building the disk image
mock_which.return_value = None
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
def side_effect(arg):
return self.os_exists[arg]
def side_effect_glob(arg):
return self.glob_iglob.pop()
mock_glob.side_effect = side_effect_glob
mock_exists.side_effect = side_effect
self.bootloader.setup_disk_boot_images('uuid')
assert mock_command.call_args_list == [
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/i386-pc/',
'root_dir/boot/grub2/i386-pc'
]),
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/x86_64-efi/',
'root_dir/boot/grub2/x86_64-efi'
]),
call([
'cp', 'root_dir/usr/lib64/efi/shim.efi',
'root_dir/boot/efi/EFI/BOOT/bootx64.efi'
]),
call([
'cp', 'root_dir/usr/lib64/efi/grub.efi',
'root_dir/boot/efi/EFI/BOOT'
])
]
assert mock_log.called
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch_open
@patch('os.path.exists')
@patch('platform.machine')
def test_setup_install_boot_images_efi(
self, mock_machine, mock_exists, mock_open, mock_sync, mock_command
):
data = mock.Mock()
mock_sync.return_value = data
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='efi'
)
self.os_exists['root_dir/boot/unicode.pf2'] = False
self.os_exists['root_dir/boot/efi/'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
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)
self.bootloader.setup_install_boot_images(self.mbrid)
assert mock_open.call_args_list == [
call('root_dir//EFI/BOOT/earlyboot.cfg', 'w')
]
assert file_mock.write.call_args_list == [
call('search --file --set=root /boot/0xffffffff\n'),
call('set prefix=($root)/boot/grub2\n')
]
assert mock_command.call_args_list == [
call([
'cp', 'root_dir/usr/share/grub2/unicode.pf2',
'root_dir/boot/unicode.pf2'
]),
call([
'grub2-mkimage', '-O', 'x86_64-efi',
'-o', 'root_dir//EFI/BOOT/bootx64.efi',
'-c', 'root_dir//EFI/BOOT/earlyboot.cfg',
'-p', '//grub2',
'-d', 'root_dir/usr/lib/grub2/x86_64-efi',
'ext2', 'iso9660', 'linux', 'echo', 'configfile',
'search_label', 'search_fs_file', 'search', 'search_fs_uuid',
'ls', 'normal', 'gzio', 'png', 'fat', 'gettext', 'font',
'minicmd', 'gfxterm', 'gfxmenu', 'video', 'video_fb', 'xfs',
'btrfs', 'lvm', 'test', 'part_gpt', 'part_msdos', 'efi_gop',
'efi_uga', 'linuxefi'
])
]
assert mock_sync.call_args_list == [
call(
'root_dir/usr/lib/grub2/i386-pc/',
'root_dir/boot/grub2/i386-pc'
),
call(
'root_dir/usr/lib/grub2/x86_64-efi/',
'root_dir/boot/grub2/x86_64-efi'
)
]
assert data.sync_data.call_args_list == [
call(exclude=['*.module'], options=['-z', '-a']),
call(exclude=['*.module'], options=['-z', '-a'])
]
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('os.path.exists')
@patch('platform.machine')
@patch('kiwi.logger.log.info')
@patch('glob.iglob')
def test_setup_install_boot_images_efi_secure_boot(
self, mock_glob, mock_log, mock_machine, mock_exists, mock_command
):
mock_machine.return_value = 'x86_64'
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
def side_effect_exists(arg):
return self.os_exists[arg]
def side_effect_glob(arg):
return self.glob_iglob.pop()
mock_glob.side_effect = side_effect_glob
mock_exists.side_effect = side_effect_exists
self.bootloader.setup_install_boot_images(self.mbrid, 'root_dir')
assert mock_command.call_args_list == [
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/i386-pc/',
'root_dir/boot/grub2/i386-pc'
]),
call([
'rsync', '-a', 'root_dir/boot/efi/', 'root_dir'
]),
call([
'rsync', '-z', '-a', '--exclude', '/*.module',
'root_dir/usr/lib/grub2/x86_64-efi/',
'root_dir/boot/grub2/x86_64-efi'
]),
call([
'cp', 'root_dir/usr/lib64/efi/shim.efi',
'root_dir//EFI/BOOT/bootx64.efi'
]),
call([
'cp', 'root_dir/usr/lib64/efi/grub.efi', 'root_dir//EFI/BOOT'
])
]
assert mock_log.called
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch_open
@patch('os.path.exists')
@patch('kiwi.logger.log.warning')
@patch('platform.machine')
@patch('glob.iglob')
def test_setup_install_boot_images_with_theme_from_usr_share(
self, mock_glob, mock_machine, mock_warn, mock_exists, mock_open,
mock_sync, mock_command
):
mock_glob.return_value = [
'root_dir/boot/grub2/themes/some-theme/background.png'
]
data = mock.Mock()
mock_sync.return_value = data
mock_machine.return_value = 'x86_64'
self.bootloader.theme = 'some-theme'
self.os_exists['lookup_path/usr/share/grub2'] = True
self.os_exists['lookup_path/usr/lib/grub2'] = True
self.os_exists['lookup_path/usr/share/grub2/themes/some-theme'] = True
self.os_exists['lookup_path/boot/grub2/themes/some-theme'] = True
self.os_exists['root_dir/boot/grub2/themes/some-theme'] = True
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_install_boot_images(
self.mbrid, lookup_path='lookup_path'
)
assert mock_command.call_args_list == [
call([
'cp', 'root_dir/boot/grub2/themes/some-theme/background.png',
'root_dir/background.png'
]),
call([
'mv', 'root_dir/background.png',
'root_dir/boot/grub2/themes/some-theme'
])
]
assert mock_sync.call_args_list[0] == call(
'lookup_path/usr/share/grub2/themes/some-theme',
'root_dir/boot/grub2/themes'
)
assert data.sync_data.call_args_list[0] == call(
options=['-z', '-a']
)
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch_open
@patch('os.path.exists')
@patch('kiwi.logger.log.warning')
@patch('platform.machine')
@patch('glob.iglob')
def test_setup_install_boot_images_with_theme_from_boot(
self, mock_glob, mock_machine, mock_warn, mock_exists,
mock_open, mock_sync
):
mock_glob.return_value = [
'lookup_path/boot/grub2/themes/some-theme/background.png'
]
data = mock.Mock()
mock_sync.return_value = data
mock_machine.return_value = 'x86_64'
self.bootloader.theme = 'some-theme'
self.os_exists['lookup_path/usr/share/grub2'] = True
self.os_exists['lookup_path/usr/lib/grub2'] = True
self.os_exists['lookup_path/usr/share/grub2/themes/some-theme'] = False
self.os_exists['root_dir/boot/grub2/themes/some-theme'] = True
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_install_boot_images(
self.mbrid, lookup_path='lookup_path'
)
assert mock_sync.call_args_list[0] == call(
'lookup_path/boot/grub2/themes/some-theme',
'root_dir/boot/grub2/themes'
)
assert data.sync_data.call_args_list[0] == call(
options=['-z', '-a']
)
@patch('kiwi.bootloader.config.grub2.Command.run')
@patch('kiwi.bootloader.config.grub2.DataSync')
@patch('builtins.open')
@patch('os.path.exists')
@patch('kiwi.logger.log.warning')
@patch('platform.machine')
def test_setup_install_boot_images_with_theme_not_existing(
self, mock_machine, mock_warn, mock_exists, mock_open,
mock_sync, mock_command
):
mock_machine.return_value = 'x86_64'
self.bootloader.theme = 'some-theme'
self.os_exists['root_dir/usr/share/grub2/themes/some-theme'] = False
self.os_exists['root_dir/boot/grub2/themes/some-theme'] = False
def side_effect(arg):
return self.os_exists[arg]
mock_exists.side_effect = side_effect
self.bootloader.setup_install_boot_images(self.mbrid)
assert mock_warn.called
assert self.bootloader.terminal == 'console'
@patch('kiwi.bootloader.config.grub2.BootLoaderConfigGrub2.setup_install_boot_images')
def test_setup_live_boot_images(self, mock_setup_install_boot_images):
self.bootloader.setup_live_boot_images(self.mbrid)
mock_setup_install_boot_images.assert_called_once_with(
self.mbrid, None
)