Skip to content

Commit 737b3b4

Browse files
Michal Heckopirat89
Michal Hecko
authored andcommitted
fix(arm,bootloaders): use correct blsdir when boot is not separate
Currently, leapp does not distinguish between having and not having a separate /boot partition. Since blsdir is relative to the device on which /boot resides, ARM systems without a separate /boot could not boot into our upgrade environment, and, instead, they booted back into pre-upgrade RHEL8. This patch adds additional handling for non-separate /boot to the process of specifying custom blsdir. Resolves: RHEL-41193
1 parent c5accf4 commit 737b3b4

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

repos/system_upgrade/common/actors/addupgradebootentry/libraries/addupgradebootentry.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,10 +399,18 @@ def modify_our_grubenv_to_have_separate_blsdir(efi_info):
399399
)
400400

401401
grubenv_vars = _list_grubenv_variables()
402-
system_bls_dir = grubenv_vars.get('blsdir', '/loader/entries').lstrip('/')
402+
403+
if os.path.ismount('/boot'):
404+
default_blsdir = '/loader/entries'
405+
grub_root_device_mountpoint = '/boot'
406+
else:
407+
default_blsdir = '/boot/loader/entries'
408+
grub_root_device_mountpoint = '/'
409+
410+
system_bls_dir = grubenv_vars.get('blsdir', default_blsdir).lstrip('/')
403411

404412
# BLS dir is relative to /boot, prepend it so we can list its contents
405-
system_bls_dir = os.path.join('/boot', system_bls_dir)
413+
system_bls_dir = os.path.join(grub_root_device_mountpoint, system_bls_dir)
406414

407415
# Find our loader entry
408416
try:
@@ -444,7 +452,12 @@ def modify_our_grubenv_to_have_separate_blsdir(efi_info):
444452

445453
shutil.move(leapp_bls_entry_fullpath, bls_entry_dst)
446454

447-
upgrade_bls_dir_rel_to_boot = efi_info.upgrade_bls_dir[len('/boot'):]
455+
# BLSDIR must be relative to grub's root device. Therefore, if /boot is a separate mountpoint
456+
# we need to convert blsdir=/boot/upgrade-loader into blsdir=/upgrade-loader. If there is no
457+
# separate root, then root=/, so rstripping('/') produces an empty string.
458+
# In such a case, the relative paths stays unchanged: blsdir=/boot/upgrade-loader
459+
grub_root_device_mp_without_trail = grub_root_device_mountpoint.rstrip('/')
460+
upgrade_bls_dir_rel_to_boot = efi_info.upgrade_bls_dir[len(grub_root_device_mp_without_trail):]
448461

449462
# Modify leapp's grubenv to define our own BLSDIR
450463
try:

repos/system_upgrade/common/actors/addupgradebootentry/tests/unit_test_addupgradebootentry.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,8 @@ def readlink_mock(path):
331331
assert uuid == 'MY_UUID1'
332332

333333

334-
def test_modify_grubenv_to_have_separate_blsdir(monkeypatch):
334+
@pytest.mark.parametrize('has_separate_boot', (True, False))
335+
def test_modify_grubenv_to_have_separate_blsdir(monkeypatch, has_separate_boot):
335336
efi_info = ArmWorkaroundEFIBootloaderInfo(
336337
original_entry=EFIBootEntry(
337338
boot_number='0001',
@@ -349,9 +350,14 @@ def test_modify_grubenv_to_have_separate_blsdir(monkeypatch):
349350
upgrade_entry_efi_path='/boot/efi/EFI/leapp'
350351
)
351352

353+
def is_mount_mocked(path):
354+
assert path.rstrip('/') == '/boot'
355+
return has_separate_boot
356+
352357
def list_grubenv_variables_mock():
358+
blsdir = '/blsdir' if has_separate_boot else '/boot/blsdir'
353359
return {
354-
'blsdir': '/blsdir'
360+
'blsdir': blsdir
355361
}
356362

357363
def listdir_mock(dir_path):
@@ -369,11 +375,13 @@ def move_mocked(src, dst):
369375
assert dst == '/boot/upgrade-loader/entries/4a9c76478b98444fb5e0fbf533950edf-upgrade.aarch64.conf'
370376

371377
def run_mocked(cmd, *arg, **kwargs):
372-
assert cmd == ['grub2-editenv', '/boot/efi/EFI/leapp/grubenv', 'set', 'blsdir=/upgrade-loader/entries']
378+
blsdir = '/upgrade-loader/entries' if has_separate_boot else '/boot/upgrade-loader/entries'
379+
assert cmd == ['grub2-editenv', '/boot/efi/EFI/leapp/grubenv', 'set', 'blsdir={}'.format(blsdir)]
373380

374381
monkeypatch.setattr(addupgradebootentry, '_list_grubenv_variables', list_grubenv_variables_mock)
375382
monkeypatch.setattr(os, 'listdir', listdir_mock)
376383
monkeypatch.setattr(os.path, 'exists', assert_path_correct)
384+
monkeypatch.setattr(os.path, 'ismount', is_mount_mocked)
377385
monkeypatch.setattr(os, 'makedirs', assert_path_correct)
378386
monkeypatch.setattr(shutil, 'move', move_mocked)
379387
monkeypatch.setattr(addupgradebootentry, 'run', run_mocked)

0 commit comments

Comments
 (0)