Skip to content

Commit

Permalink
Support leavebootorder for bootupd
Browse files Browse the repository at this point in the history
If leavebootorder was specified through kickstart or kernel boot
arguments we won't pass `--update-firmware` to bootupdctl. That will
avoid creation of the UEFI entry for the bootloader and give people
possibility for additional tweaking or debugging.

This was requested by bootloader developers.

Suggested-by: Timothée Ravier <tim@siosm.fr>
(cherry picked from commit 28d1aed)

Resolves: RHEL-40896
  • Loading branch information
jkonecny12 committed Nov 19, 2024
1 parent 41916d1 commit c4c7fe2
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
14 changes: 11 additions & 3 deletions pyanaconda/modules/payloads/payload/rpm_ostree/installation.py
Original file line number Diff line number Diff line change
Expand Up @@ -513,14 +513,22 @@ def _install_bootupd(self):
device_tree = STORAGE.get_proxy(DEVICE_TREE)
dev_data = DeviceData.from_structure(device_tree.GetDeviceData(bootloader.Drive))

bootupdctl_args = [
"--auto",
"--write-uuid",
]

# do not insert UEFI entry if leavebootorder was requested
if not bootloader.KeepBootOrder:
log.debug("Adding --update-firmware to bootupdctl call")
bootupdctl_args.append("--update-firmware")

rc = execWithRedirect(
"bootupctl",
[
"backend",
"install",
"--auto",
"--write-uuid",
"--update-firmware",
*bootupdctl_args,
"--device",
dev_data.path,
"/",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,7 @@ def test_bootupd_run(self, devdata_mock, storage_mock, symlink_mock, rename_mock
proxy_mock.GetFstabSpec.return_value = "FSTAB-SPEC"
proxy_mock.GetRootDevice.return_value = "device-name"
proxy_mock.Drive = "btldr-drv"
proxy_mock.KeepBootOrder = False
devdata_mock.from_structure.return_value.type = "something-non-btrfs-subvolume-ish"
devdata_mock.from_structure.return_value.path = "/dev/btldr-drv"

Expand All @@ -788,6 +789,48 @@ def test_bootupd_run(self, devdata_mock, storage_mock, symlink_mock, rename_mock
)
])

@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.have_bootupd")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.execWithRedirect")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.os.rename")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.os.symlink")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.STORAGE")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.DeviceData")
def test_bootupd_run_with_leavebootorder(self, devdata_mock, storage_mock, symlink_mock,
rename_mock, exec_mock, have_bootupd_mock):
"""Test OSTree bootloader config task, bootupd"""
exec_mock.return_value = 0
have_bootupd_mock.return_value = True

proxy_mock = storage_mock.get_proxy()
proxy_mock.GetArguments.return_value = ["BOOTLOADER-ARGS"]
proxy_mock.GetFstabSpec.return_value = "FSTAB-SPEC"
proxy_mock.GetRootDevice.return_value = "device-name"
proxy_mock.Drive = "btldr-drv"
proxy_mock.KeepBootOrder = True
devdata_mock.from_structure.return_value.type = "something-non-btrfs-subvolume-ish"
devdata_mock.from_structure.return_value.path = "/dev/btldr-drv"

with tempfile.TemporaryDirectory() as sysroot:
task = ConfigureBootloader(sysroot)
task.run()

rename_mock.assert_not_called()
symlink_mock.assert_not_called()
assert exec_mock.call_count == 2
exec_mock.assert_has_calls([
call(
"bootupctl",
["backend", "install", "--auto", "--write-uuid",
"--device", "/dev/btldr-drv", "/"],
root=sysroot
),
call(
"ostree",
["admin", "instutil", "set-kargs", "BOOTLOADER-ARGS", "root=FSTAB-SPEC", "rw"],
root=sysroot
)
])

@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.execWithRedirect")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.os.rename")
@patch("pyanaconda.modules.payloads.payload.rpm_ostree.installation.os.symlink")
Expand Down

0 comments on commit c4c7fe2

Please sign in to comment.