kiwi-el8/test/unit/defaults_test.py
Neal Gompa 22190cfb74 Add support for filtering out files from the ESP image for GRUB
Prior to this change, KIWI blindly synced the ESP directory into the
embedded ESP image. Depending on the distribution and packages included
for the created image, this can have undesirable side-effects.

For image builds that need some more fine-grained control over the
creation of the embedded ESP image (particularly for ISO images),
this change introduces the ability to inject an exclusion list
similar to what is used to filter out files for the root filesystem.

Fixes: https://github.com/OSInside/kiwi/issues/2008
Fixes: https://github.com/OSInside/kiwi/issues/2777
2025-04-16 15:59:30 -04:00

279 lines
10 KiB
Python

import logging
from unittest.mock import patch
import sys
from unittest.mock import MagicMock
from pytest import (
fixture, raises
)
from .test_helper import argv_kiwi_tests
from kiwi.defaults import Defaults
from kiwi.defaults import grub_loader_type
from kiwi.defaults import shim_loader_type
from kiwi.exceptions import KiwiBootLoaderGrubDataError
class TestDefaults:
@fixture(autouse=True)
def inject_fixtures(self, caplog):
self._caplog = caplog
def setup(self):
self.defaults = Defaults()
def setup_method(self, cls):
self.setup()
def teardown(self):
sys.argv = argv_kiwi_tests
def teardown_method(self, cls):
self.teardown()
def test_get(self):
assert self.defaults.get('kiwi_align') == 1048576
assert self.defaults.get('kiwi_startsector') == 2048
assert self.defaults.get('kiwi_sectorsize') == 512
assert self.defaults.get('kiwi_inode_size') == 256
assert self.defaults.get('kiwi_inode_ratio') == 16384
assert self.defaults.get('kiwi_min_inodes') == 20000
assert self.defaults.get('kiwi_revision')
def test_to_profile(self):
profile = MagicMock()
self.defaults.to_profile(profile)
profile.add.assert_any_call('kiwi_align', 1048576)
profile.add.assert_any_call('kiwi_startsector', 2048)
profile.add.assert_any_call('kiwi_sectorsize', 512)
profile.add.assert_any_call(
'kiwi_revision', self.defaults.get('kiwi_revision')
)
def test_get_preparer(self):
assert Defaults.get_preparer() == \
'KIWI - https://github.com/OSInside/kiwi'
def test_get_publisher(self):
assert Defaults.get_publisher() == 'SUSE LINUX GmbH'
def test_get_default_shared_cache_location(self):
assert Defaults.get_shared_cache_location() == 'var/cache/kiwi'
@patch('kiwi.defaults.Path.which')
def test_get_grub_boot_directory_name(self, mock_which):
mock_which.return_value = 'grub2-install-was-found'
assert Defaults.get_grub_boot_directory_name(
lookup_path='lookup_path'
) == 'grub2'
mock_which.return_value = None
assert Defaults.get_grub_boot_directory_name(
lookup_path='lookup_path'
) == 'grub'
def test_get_live_dracut_modules_from_flag(self):
assert Defaults.get_live_dracut_modules_from_flag('foo') == \
['kiwi-live']
assert Defaults.get_live_dracut_modules_from_flag('overlay') == \
['kiwi-live']
assert Defaults.get_live_dracut_modules_from_flag('dmsquash') == \
['dmsquash-live', 'livenet']
def test_get_iso_boot_path(self):
Defaults.set_platform_name('i686')
assert Defaults.get_iso_boot_path() == 'boot/ix86'
Defaults.set_platform_name('x86_64')
assert Defaults.get_iso_boot_path() == 'boot/x86_64'
@patch('kiwi.defaults.glob.iglob')
def test_get_unsigned_grub_loader(self, mock_glob):
mock_glob.return_value = ['/usr/share/grub2/x86_64-efi/grub.efi']
assert Defaults.get_unsigned_grub_loader('root') == \
mock_glob.return_value.pop()
mock_glob.assert_called_once_with('root/usr/share/grub*/*-efi/grub.efi')
mock_glob.reset_mock()
mock_glob.return_value = []
assert Defaults.get_unsigned_grub_loader('root') is None
def test_is_x86_arch(self):
assert Defaults.is_x86_arch('x86_64') is True
assert Defaults.is_x86_arch('aarch64') is False
@patch('os.path.exists')
def test_get_vendor_grubenv(self, mock_path_exists):
mock_path_exists.return_value = True
assert Defaults.get_vendor_grubenv('boot/efi') == \
'boot/efi/EFI/fedora/grubenv'
def test_parse_exclude_file_is_valid(self):
assert Defaults._parse_exclude_file(
'../data/root-dir', 'exclude_files.yaml'
) == [
'usr/bin/qemu-binfmt',
'usr/bin/qemu-x86_64-binfmt',
'usr/bin/qemu-x86_64'
]
@patch('yaml.safe_load')
def test_parse_exclude_file_is_invalid(self, mock_yaml_safe_load):
mock_yaml_safe_load.return_value = {'invalid': 'artificial'}
with self._caplog.at_level(logging.WARNING):
assert Defaults._parse_exclude_file(
'../data/root-dir', 'exclude_files.yaml'
) == []
def test_get_exclude_list_from_custom_exclude_files(self):
assert Defaults.get_exclude_list_from_custom_exclude_files(
'../data/root-dir'
) == [
'usr/bin/qemu-binfmt',
'usr/bin/qemu-x86_64-binfmt',
'usr/bin/qemu-x86_64'
]
@patch('yaml.safe_load')
def test_get_exclude_list_from_custom_exclude_files_is_invalid(
self, mock_yaml_safe_load
):
mock_yaml_safe_load.return_value = {'invalid': 'artificial'}
with self._caplog.at_level(logging.WARNING):
assert Defaults.get_exclude_list_from_custom_exclude_files(
'../data/root-dir'
) == []
def test_get_exclude_list_from_custom_exclude_files_for_efifatimage(self):
assert Defaults.get_exclude_list_from_custom_exclude_files_for_efifatimage(
'../data/root-dir'
) == [
'BOOT/fbia32.efi',
'BOOT/fbx64.efi',
]
@patch('yaml.safe_load')
def test_get_exclude_list_from_custom_exclude_files_for_efifatimage_is_invalid(
self, mock_yaml_safe_load
):
mock_yaml_safe_load.return_value = {'invalid': 'artificial'}
with self._caplog.at_level(logging.WARNING):
assert Defaults.get_exclude_list_from_custom_exclude_files_for_efifatimage(
'../data/root-dir'
) == []
def test_get_exclude_list_for_root_data_sync(self):
assert Defaults.get_exclude_list_for_root_data_sync() == [
'image', '.kconfig',
'run/*', 'tmp/*',
'.buildenv', 'var/cache/kiwi'
]
assert Defaults.get_exclude_list_for_root_data_sync(no_tmpdirs=False) == [
'image', '.kconfig',
'.buildenv', 'var/cache/kiwi'
]
@patch('glob.iglob')
def test_get_signed_grub_loader(self, mock_iglob):
def iglob_no_matches(pattern):
return []
def iglob_simple_match(pattern):
if '/boot/efi/EFI/*/grub*.efi' in pattern:
return ['root_path/boot/efi/EFI/BOOT/grub.efi']
else:
return []
def iglob_custom_binary_match(pattern):
if '/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed' in pattern:
return [
'root_path'
'/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed'
]
else:
return []
mock_iglob.side_effect = iglob_no_matches
assert Defaults.get_signed_grub_loader('root_path') is None
mock_iglob.side_effect = iglob_simple_match
assert Defaults.get_signed_grub_loader('root_path') == grub_loader_type(
filename='root_path/boot/efi/EFI/BOOT/grub.efi',
binaryname='grub.efi'
)
mock_iglob.side_effect = iglob_custom_binary_match
assert Defaults.get_signed_grub_loader('root_path') == grub_loader_type(
filename='root_path'
'/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed',
binaryname='grubx64.efi'
)
@patch('glob.iglob')
def test_get_mok_manager(self, mock_iglob):
mock_iglob.return_value = []
assert Defaults.get_mok_manager('root_path') is None
mock_iglob.return_value = ['some_glob_result']
assert Defaults.get_mok_manager('root_path') == 'some_glob_result'
@patch('glob.iglob')
def test_get_shim_loader(self, mock_iglob):
def iglob_simple_match(pattern):
if '/usr/lib64/efi/shim.efi' in pattern:
return ['root_path/usr/lib64/efi/shim.efi']
else:
return []
def iglob_custom_binary_match(pattern):
if '/usr/lib/shim/shimx64.efi.signed' in pattern:
return [
'root_path'
'/usr/lib/shim/shimx64.efi.signed'
]
else:
return []
assert Defaults.get_shim_loader('root_path') is None
mock_iglob.side_effect = iglob_simple_match
assert Defaults.get_shim_loader('root_path') == shim_loader_type(
filename='root_path'
'/usr/lib64/efi/shim.efi',
binaryname='shim.efi'
)
mock_iglob.side_effect = iglob_custom_binary_match
assert Defaults.get_shim_loader('root_path/usr/lib/shim/shimx64.efi.signed') == shim_loader_type(
filename='root_path'
'/usr/lib/shim/shimx64.efi.signed',
binaryname='shimx64.efi'
)
@patch('os.path.exists')
def test_get_snapper_config_template_file(self, mock_os_path_exists):
mock_os_path_exists.return_value = False
assert Defaults.get_snapper_config_template_file('root') == ''
mock_os_path_exists.return_value = True
assert Defaults.get_snapper_config_template_file('root') == \
'root/etc/snapper/config-templates/default'
def test_get_min_volume_mbytes(self):
assert Defaults.get_min_volume_mbytes('btrfs') == 120
assert Defaults.get_min_volume_mbytes('xfs') == 300
assert Defaults.get_min_volume_mbytes('some') == 30
@patch('glob.iglob')
def test_get_grub_chrp_loader(self, mock_glob_iglob):
mock_glob_iglob.return_value = []
with raises(KiwiBootLoaderGrubDataError):
Defaults.get_grub_chrp_loader('some-boot')
mock_glob_iglob.reset_mock()
mock_glob_iglob.return_value = [
'/some-boot/boot/grub2/powerpc-ieee1275/grub.elf'
]
assert Defaults.get_grub_chrp_loader('some-boot') == 'grub.elf'
mock_glob_iglob.assert_called_once_with(
'some-boot/boot/grub*/powerpc-ieee1275/grub.elf'
)