The parameter for the uuid is not enough to handle all supported disk geometries. If the disk has an extra boot partition the bootloader setup must read the boot data from the boot partition but must set the root for the kernel cmdline to the root partition. Therefore the interface needs to change and must provide both the boot_uuid and the root_uuid in oder to allow the method to setup the correct values
247 lines
9.3 KiB
Python
247 lines
9.3 KiB
Python
from mock import patch
|
|
from mock import call
|
|
import mock
|
|
|
|
from .test_helper import *
|
|
|
|
from kiwi.xml_state import XMLState
|
|
from kiwi.xml_description import XMLDescription
|
|
from kiwi.exceptions import *
|
|
from kiwi.bootloader.config.base import BootLoaderConfigBase
|
|
|
|
|
|
class TestBootLoaderConfigBase(object):
|
|
def setup(self):
|
|
description = XMLDescription(
|
|
'../data/example_config.xml'
|
|
)
|
|
self.state = XMLState(
|
|
description.load()
|
|
)
|
|
self.bootloader = BootLoaderConfigBase(
|
|
self.state, 'root_dir'
|
|
)
|
|
|
|
@raises(NotImplementedError)
|
|
def test_write(self):
|
|
self.bootloader.write()
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_disk_image_config(self):
|
|
self.bootloader.setup_disk_image_config(
|
|
'boot_uuid', 'root_uuid', 'hypervisor', 'kernel', 'initrd'
|
|
)
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_install_image_config(self):
|
|
self.bootloader.setup_install_image_config(
|
|
'mbrid', 'hypervisor', 'kernel', 'initrd'
|
|
)
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_live_image_config(self):
|
|
self.bootloader.setup_live_image_config(
|
|
'mbrid', 'hypervisor', 'kernel', 'initrd'
|
|
)
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_disk_boot_images(self):
|
|
self.bootloader.setup_disk_boot_images('uuid')
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_install_boot_images(self):
|
|
self.bootloader.setup_install_boot_images('mbrid')
|
|
|
|
@raises(NotImplementedError)
|
|
def test_setup_live_boot_images(self):
|
|
self.bootloader.setup_live_boot_images('mbrid')
|
|
|
|
@patch('kiwi.path.Path.create')
|
|
def test_create_efi_path(self, mock_path):
|
|
self.bootloader.create_efi_path()
|
|
mock_path.assert_called_once_with('root_dir/boot/efi/EFI/BOOT')
|
|
|
|
@patch('kiwi.path.Path.create')
|
|
def test_create_efi_path_with_prefix(self, mock_path):
|
|
self.bootloader.create_efi_path('')
|
|
mock_path.assert_called_once_with('root_dir//EFI/BOOT')
|
|
|
|
def test_get_boot_theme(self):
|
|
assert self.bootloader.get_boot_theme() == 'openSUSE'
|
|
|
|
def test_get_boot_timeout_seconds(self):
|
|
assert self.bootloader.get_boot_timeout_seconds() == 10
|
|
|
|
@patch('kiwi.xml_parse.type_.get_installprovidefailsafe')
|
|
def test_failsafe_boot_entry_requested(
|
|
self, mock_installprovidefailsafe
|
|
):
|
|
mock_installprovidefailsafe.return_value = True
|
|
assert self.bootloader.failsafe_boot_entry_requested() is True
|
|
mock_installprovidefailsafe.return_value = False
|
|
assert self.bootloader.failsafe_boot_entry_requested() is False
|
|
|
|
def test_get_hypervisor_domain(self):
|
|
assert self.bootloader.get_hypervisor_domain() == 'domU'
|
|
|
|
def test_get_boot_cmdline(self):
|
|
assert self.bootloader.get_boot_cmdline() == 'splash'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_kernelcmdline')
|
|
def test_get_boot_cmdline_custom_root(self, mock_cmdline):
|
|
mock_cmdline.return_value = 'root=/dev/myroot'
|
|
assert self.bootloader.get_boot_cmdline() == 'root=/dev/myroot'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_firmware')
|
|
def test_get_boot_cmdline_firmware_ec2(self, mock_firmware):
|
|
mock_firmware.return_value = 'ec2'
|
|
assert self.bootloader.get_boot_cmdline('uuid') == \
|
|
'splash root=UUID=uuid rw'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_initrd_system')
|
|
def test_get_boot_cmdline_initrd_system_is_dracut(self, mock_initrd):
|
|
mock_initrd.return_value = 'dracut'
|
|
assert self.bootloader.get_boot_cmdline('uuid') == \
|
|
'splash root=UUID=uuid rw'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_firmware')
|
|
@patch('kiwi.logger.log.warning')
|
|
def test_get_boot_cmdline_firmware_ec2_no_uuid(
|
|
self, mock_log_warn, mock_firmware
|
|
):
|
|
mock_firmware.return_value = 'ec2'
|
|
self.bootloader.get_boot_cmdline()
|
|
assert mock_log_warn.called
|
|
|
|
@patch('kiwi.xml_parse.type_.get_installboot')
|
|
def test_get_install_image_boot_default(self, mock_installboot):
|
|
mock_installboot.return_value = None
|
|
assert self.bootloader.get_install_image_boot_default() == '0'
|
|
assert self.bootloader.get_install_image_boot_default('isolinux') == \
|
|
'Boot_from_Hard_Disk'
|
|
mock_installboot.return_value = 'failsafe-install'
|
|
assert self.bootloader.get_install_image_boot_default() == '2'
|
|
assert self.bootloader.get_install_image_boot_default('isolinux') == \
|
|
'Failsafe_--_Install_Bob'
|
|
mock_installboot.return_value = 'install'
|
|
assert self.bootloader.get_install_image_boot_default() == '1'
|
|
assert self.bootloader.get_install_image_boot_default('isolinux') == \
|
|
'Install_Bob'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_installboot')
|
|
@patch('kiwi.xml_parse.type_.get_installprovidefailsafe')
|
|
@patch('kiwi.logger.log.warning')
|
|
def test_get_install_image_boot_default_failsafe_but_no_failsafe_entry(
|
|
self, mock_warn, mock_installprovidefailsafe, mock_installboot
|
|
):
|
|
mock_installprovidefailsafe.return_value = False
|
|
mock_installboot.return_value = 'failsafe-install'
|
|
assert self.bootloader.get_install_image_boot_default() == '1'
|
|
assert mock_warn.call_args_list == [
|
|
call(
|
|
'Failsafe install requested but failsafe menu entry is disabled'
|
|
),
|
|
call('Switching to standard install')
|
|
]
|
|
|
|
@raises(KiwiBootLoaderTargetError)
|
|
def test_get_boot_path_raises(self):
|
|
self.bootloader.get_boot_path('foo')
|
|
|
|
@raises(KiwiBootLoaderTargetError)
|
|
@patch('kiwi.bootloader.config.base.DiskSetup')
|
|
@patch('kiwi.xml_parse.type_.get_filesystem')
|
|
@patch('kiwi.xml_state.XMLState.get_volumes')
|
|
def test_get_boot_path_btrfs_boot_is_a_volume_error(
|
|
self, mock_volumes, mock_fs, mock_disk_setup
|
|
):
|
|
volume = mock.Mock()
|
|
volume.name = 'boot'
|
|
mock_volumes.return_value = [volume]
|
|
mock_fs.return_value = 'btrfs'
|
|
disk_setup = mock.Mock()
|
|
disk_setup.need_boot_partition = mock.Mock(
|
|
return_value=False
|
|
)
|
|
mock_disk_setup.return_value = disk_setup
|
|
self.bootloader.get_boot_path()
|
|
|
|
@patch('kiwi.bootloader.config.base.DiskSetup')
|
|
@patch('kiwi.xml_parse.type_.get_filesystem')
|
|
@patch('kiwi.xml_parse.type_.get_btrfs_root_is_snapshot')
|
|
@patch('kiwi.xml_state.XMLState.get_volumes')
|
|
def test_get_boot_path_btrfs_no_snapshot(
|
|
self, mock_volumes, mock_snapshot, mock_fs, mock_disk_setup
|
|
):
|
|
volume = mock.Mock()
|
|
volume.name = 'some-volume'
|
|
mock_volumes.return_value = [volume]
|
|
mock_fs.return_value = 'btrfs'
|
|
mock_snapshot.return_value = False
|
|
disk_setup = mock.Mock()
|
|
disk_setup.need_boot_partition = mock.Mock(
|
|
return_value=False
|
|
)
|
|
mock_disk_setup.return_value = disk_setup
|
|
assert self.bootloader.get_boot_path() == \
|
|
'/@/boot'
|
|
|
|
@patch('kiwi.bootloader.config.base.DiskSetup')
|
|
@patch('kiwi.xml_parse.type_.get_filesystem')
|
|
@patch('kiwi.xml_parse.type_.get_btrfs_root_is_snapshot')
|
|
@patch('kiwi.xml_state.XMLState.get_volumes')
|
|
def test_get_boot_path_btrfs_snapshot(
|
|
self, mock_volumes, mock_snapshot, mock_fs, mock_disk_setup
|
|
):
|
|
volume = mock.Mock()
|
|
volume.name = 'some-volume'
|
|
mock_volumes.return_value = [volume]
|
|
mock_fs.return_value = 'btrfs'
|
|
mock_snapshot.return_value = True
|
|
disk_setup = mock.Mock()
|
|
disk_setup.need_boot_partition = mock.Mock(
|
|
return_value=False
|
|
)
|
|
mock_disk_setup.return_value = disk_setup
|
|
assert self.bootloader.get_boot_path() == \
|
|
'/boot'
|
|
|
|
def test_quote_title(self):
|
|
assert self.bootloader.quote_title('aaa bbb [foo]') == 'aaa_bbb_(foo)'
|
|
|
|
@patch('kiwi.xml_parse.image.get_displayname')
|
|
def test_get_menu_entry_title(self, mock_displayname):
|
|
mock_displayname.return_value = None
|
|
assert self.bootloader.get_menu_entry_title() == \
|
|
'LimeJeOS-openSUSE-13.2 [ OEM ]'
|
|
|
|
@patch('kiwi.xml_parse.image.get_displayname')
|
|
def test_get_menu_entry_title_plain(self, mock_displayname):
|
|
mock_displayname.return_value = None
|
|
assert self.bootloader.get_menu_entry_title(plain=True) == \
|
|
'LimeJeOS-openSUSE-13.2'
|
|
|
|
@patch('kiwi.xml_parse.image.get_displayname')
|
|
def test_get_menu_entry_install_title(self, mock_displayname):
|
|
mock_displayname.return_value = None
|
|
assert self.bootloader.get_menu_entry_install_title() == \
|
|
'LimeJeOS-openSUSE-13.2'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_vga')
|
|
def test_get_gfxmode_default(self, mock_get_vga):
|
|
mock_get_vga.return_value = None
|
|
assert self.bootloader.get_gfxmode('isolinux') == '800 600'
|
|
assert self.bootloader.get_gfxmode('grub2') == '800x600'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_vga')
|
|
def test_get_gfxmode(self, mock_get_vga):
|
|
mock_get_vga.return_value = '0x318'
|
|
assert self.bootloader.get_gfxmode('isolinux') == '1024 768'
|
|
assert self.bootloader.get_gfxmode('grub2') == '1024x768'
|
|
|
|
@patch('kiwi.xml_parse.type_.get_vga')
|
|
def test_get_gfxmode_other_loader(self, mock_get_vga):
|
|
mock_get_vga.return_value = '0x318'
|
|
assert self.bootloader.get_gfxmode('some-loader') == \
|
|
mock_get_vga.return_value
|