Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compat entry name for kernel-install in sd-boot #2431

Merged
merged 2 commits into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions kiwi/bootloader/config/systemd_boot.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
# along with kiwi. If not, see <http://www.gnu.org/licenses/>
#
import os
import glob
from string import Template
from typing import Dict

Expand All @@ -28,10 +29,12 @@
from kiwi.storage.loop_device import LoopDevice
from kiwi.storage.disk import Disk
from kiwi.command import Command
from kiwi.utils.os_release import OsRelease

from kiwi.exceptions import (
KiwiTemplateError,
KiwiBootLoaderTargetError
KiwiBootLoaderTargetError,
KiwiKernelLookupError
)

import kiwi.defaults as defaults
Expand Down Expand Up @@ -83,10 +86,20 @@ def set_loader_entry(self, root_dir: str, target: str) -> None:
:param str target:
target identifier, one of disk, live(iso) or install(iso)
"""
os_release = OsRelease(root_dir)
try:
kernel_name = os.path.basename(
list(glob.iglob(f'{root_dir}/lib/modules/*'))[0]
)
except Exception as issue:
raise KiwiKernelLookupError(
f'Kernel lookup in {root_dir}/lib/modules failed with {issue}'
)
default_entry = f'{os_release.get("ID")}-{kernel_name}.conf'
BootLoaderSystemdBoot._write_config_file(
BootLoaderTemplateSystemdBoot().get_entry_template(),
root_dir + '/boot/efi/loader/entries/main.conf',
self._get_template_parameters()
root_dir + f'/boot/efi/loader/entries/{default_entry}',
self._get_template_parameters(default_entry)
)

def _create_embedded_fat_efi_image(self, path: str):
Expand Down Expand Up @@ -192,14 +205,17 @@ def _run_bootctl(self, root_dir: str) -> None:
self._get_template_parameters()
)

def _get_template_parameters(self) -> Dict[str, str]:
def _get_template_parameters(
self, default_entry: str = 'main.conf'
) -> Dict[str, str]:
return {
'kernel_file': self.custom_args['kernel'] or 'vmlinuz',
'initrd_file': self.custom_args['initrd'] or 'initrd',
'boot_options': self.cmdline,
'boot_timeout': self.timeout,
'bootpath': self.get_boot_path(),
'title': self.get_menu_entry_title()
'title': self.get_menu_entry_title(),
'default_entry': default_entry
}

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion kiwi/bootloader/template/systemd_boot.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ def __init__(self):

self.loader = dedent('''
# kiwi generated loader config file
default main.conf
console-mode max
editor no
''').strip() + self.cr
Expand Down
6 changes: 6 additions & 0 deletions kiwi/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,12 @@ class KiwiOCIArchiveToolError(KiwiError):
"""


class KiwiOSReleaseImportError(KiwiError):
"""
Exception raised if reading etc/os-release caused an issue
"""


class KiwiPackageManagerSetupError(KiwiError):
"""
Exception raised if an attempt was made to create a package
Expand Down
46 changes: 46 additions & 0 deletions kiwi/utils/os_release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Copyright (c) 2024 SUSE Software Solutions Germany GmbH. All rights reserved.
#
# This file is part of kiwi.
#
# kiwi is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# kiwi is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with kiwi. If not, see <http://www.gnu.org/licenses/>
#
import csv

# project
from kiwi.exceptions import KiwiOSReleaseImportError


class OsRelease:
"""
**Read os-release information**
"""
def __init__(self, root_dir: str):
self.data = {}
os_release = root_dir + '/etc/os-release'
try:
with open(os_release) as osdata:
reader = csv.reader(osdata, delimiter='=')
self.data = dict(reader)
except Exception as issue:
raise KiwiOSReleaseImportError(
f'Import of {os_release} failed with {issue}'
)

def get(self, key: str) -> str:
"""
Return value for key or an empty string if not present

:param string key: key name from os-release
"""
return self.data.get(key) or ''
12 changes: 12 additions & 0 deletions test/data/etc/os-release
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
NAME="openSUSE Leap"
VERSION="15.5"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="15.5"
PRETTY_NAME="openSUSE Leap 15.5"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:15.5"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
DOCUMENTATION_URL="https://en.opensuse.org/Portal:Leap"
LOGO="distributor-logo-Leap"
42 changes: 36 additions & 6 deletions test/unit/bootloader/config/systemd_boot_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@

from kiwi.exceptions import (
KiwiTemplateError,
KiwiBootLoaderTargetError
KiwiBootLoaderTargetError,
KiwiKernelLookupError
)


Expand Down Expand Up @@ -41,6 +42,8 @@ def test_setup_loader_raises_invalid_target(self):
self.bootloader.setup_loader('iso')

@patch('os.path.exists')
@patch('kiwi.bootloader.config.systemd_boot.OsRelease')
@patch('kiwi.bootloader.config.systemd_boot.glob.iglob')
@patch('kiwi.bootloader.config.systemd_boot.BootImageBase.get_boot_names')
@patch('kiwi.bootloader.config.systemd_boot.Path.wipe')
@patch('kiwi.bootloader.config.systemd_boot.Path.create')
Expand All @@ -54,8 +57,14 @@ def test_setup_loader(
mock_get_template_parameters, mock_write_config_file,
mock_BootLoaderTemplateSystemdBoot, mock_Command_run,
mock_Path_create, mock_Path_wipe, mock_BootImageBase_get_boot_names,
mock_iglob,
mock_OsRelease,
mock_os_path_exists
):
mock_iglob.return_value = ['/lib/modules/5.3.18-59.10-default']
os_release = Mock()
os_release.get.return_value = 'opensuse-leap'
mock_OsRelease.return_value = os_release
kernel_info = Mock()
kernel_info.kernel_version = 'kernel-version'
kernel_info.kernel_filename = 'kernel-filename'
Expand All @@ -65,13 +74,16 @@ def test_setup_loader(
self.bootloader.setup_loader('disk')
assert mock_write_config_file.call_args_list == [
call(
mock_BootLoaderTemplateSystemdBoot.return_value.get_loader_template.return_value,
mock_BootLoaderTemplateSystemdBoot.
return_value.get_loader_template.return_value,
'system_root_mount/boot/efi/loader/loader.conf',
mock_get_template_parameters.return_value
),
call(
mock_BootLoaderTemplateSystemdBoot.return_value.get_entry_template.return_value,
'system_root_mount/boot/efi/loader/entries/main.conf',
mock_BootLoaderTemplateSystemdBoot.
return_value.get_entry_template.return_value,
'system_root_mount/boot/efi/loader/entries/'
'opensuse-leap-5.3.18-59.10-default.conf',
mock_get_template_parameters.return_value
)
]
Expand Down Expand Up @@ -104,10 +116,27 @@ def test_setup_loader(
)
]

@patch('kiwi.bootloader.config.systemd_boot.OsRelease')
@patch('kiwi.bootloader.config.systemd_boot.glob.iglob')
@patch.object(BootLoaderSystemdBoot, '_write_config_file')
def test_set_loader_entry(self, mock_write_config_file):
def test_set_loader_entry(
self, mock_write_config_file, mock_iglob, mock_OsRelease
):
mock_iglob.return_value = ['/lib/modules/5.3.18-59.10-default']
os_release = Mock()
os_release.get.return_value = 'opensuse-leap'
mock_OsRelease.return_value = os_release
self.bootloader.set_loader_entry('root_dir', 'disk')

@patch('kiwi.bootloader.config.systemd_boot.OsRelease')
@patch('kiwi.bootloader.config.systemd_boot.glob.iglob')
def test_set_loader_entry_kernel_lookup_raises(
self, mock_iglob, mock_OsRelease
):
mock_iglob.return_value = None
with raises(KiwiKernelLookupError):
self.bootloader.set_loader_entry('root_dir', 'disk')

def test_create_loader_image(self):
self.bootloader.create_loader_image('disk')
self.bootloader.create_efi_path.assert_called_once_with()
Expand All @@ -120,7 +149,8 @@ def test_get_template_parameters(self):
'boot_options': '',
'boot_timeout': 0,
'bootpath': 'bootpath',
'title': 'title'
'title': 'title',
'default_entry': 'main.conf'
}

@patch('kiwi.bootloader.config.systemd_boot.Path.create')
Expand Down
19 changes: 19 additions & 0 deletions test/unit/utils/os_release_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from pytest import raises

from kiwi.utils.os_release import OsRelease
from kiwi.exceptions import KiwiOSReleaseImportError


class TestOsRelease(object):
def setup(self):
self.os_release = OsRelease('../data')

def setup_method(self, cls):
self.setup()

def test_setup_raises(self):
with raises(KiwiOSReleaseImportError):
OsRelease('does-not-exist')

def test_get(self):
assert self.os_release.get('ID') == 'opensuse-leap'