From da16a0d06c65665fbc1c2789a34b583b4c2ed705 Mon Sep 17 00:00:00 2001 From: Jiri Konecny Date: Mon, 10 Jun 2024 14:46:29 +0200 Subject: [PATCH] Support leavebootorder for bootupd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 (cherry picked from commit 28d1aed119edc4a75c6083d8a29d425fb0d7b840) Resolves: RHEL-40897 --- .../payload/rpm_ostree/installation.py | 14 ++++-- .../payloads/payload/test_rpm_ostree_tasks.py | 43 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/pyanaconda/modules/payloads/payload/rpm_ostree/installation.py b/pyanaconda/modules/payloads/payload/rpm_ostree/installation.py index 2eb1327e0902..4662655ede39 100644 --- a/pyanaconda/modules/payloads/payload/rpm_ostree/installation.py +++ b/pyanaconda/modules/payloads/payload/rpm_ostree/installation.py @@ -430,14 +430,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, "/", diff --git a/tests/unit_tests/pyanaconda_tests/modules/payloads/payload/test_rpm_ostree_tasks.py b/tests/unit_tests/pyanaconda_tests/modules/payloads/payload/test_rpm_ostree_tasks.py index ca8663be9a1d..4ab08380890a 100644 --- a/tests/unit_tests/pyanaconda_tests/modules/payloads/payload/test_rpm_ostree_tasks.py +++ b/tests/unit_tests/pyanaconda_tests/modules/payloads/payload/test_rpm_ostree_tasks.py @@ -681,6 +681,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" @@ -705,6 +706,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")