boot: extend bootable raid for poweredge devices

This commit is contained in:
Dan Bungert 2023-07-26 13:26:11 -06:00
parent c8c87de19a
commit 67f6f67b8e
2 changed files with 35 additions and 11 deletions

View File

@ -20,12 +20,24 @@ from typing import Any, Optional
import attr
from subiquity.common.dmidecode import dmidecode_get
from subiquity.common.filesystem import gaps, sizes
from subiquity.models.filesystem import Bootloader, Disk, Partition, Raid, align_up
log = logging.getLogger("subiquity.common.filesystem.boot")
def bootable_raid(raid: Raid):
if raid._m.bootloader != Bootloader.UEFI:
return False
if raid.container is not None and raid.container.metadata == "imsm":
return True
if "poweredge" in dmidecode_get("system-product-name").lower():
# LP: #1961079 - all poweredge devices assumed to support raid UEFI boot
return True
return False
@functools.singledispatch
def is_boot_device(device):
"""Is `device` a boot device?"""
@ -45,10 +57,7 @@ def _is_boot_device_disk(disk):
@is_boot_device.register(Raid)
def _is_boot_device_raid(raid):
bl = raid._m.bootloader
if bl != Bootloader.UEFI:
return False
if not raid.container or raid.container.metadata != "imsm":
if not bootable_raid(raid):
return False
return any(p.grub_device for p in raid._partitions)
@ -344,10 +353,7 @@ def _can_be_boot_device_disk(disk, *, resize_partition=None, with_reformatting=F
@can_be_boot_device.register(Raid)
def _can_be_boot_device_raid(raid, *, resize_partition=None, with_reformatting=False):
bl = raid._m.bootloader
if bl != Bootloader.UEFI:
return False
if not raid.container or raid.container.metadata != "imsm":
if not bootable_raid(raid):
return False
if with_reformatting:
return True

View File

@ -14,7 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import unittest
from unittest.mock import Mock
from unittest.mock import Mock, patch
from subiquity.common.filesystem import boot
from subiquity.models.filesystem import Bootloader
@ -26,7 +26,9 @@ class TestBootDevRaid(unittest.TestCase):
raid = make_raid(make_model(Bootloader.BIOS))
self.assertFalse(boot.can_be_boot_device(raid))
def test_UEFI_no_container(self):
@patch("subiquity.common.filesystem.boot.dmidecode_get")
def test_UEFI_no_container(self, dmi_get):
dmi_get.return_value = ""
raid = make_raid(make_model(Bootloader.UEFI))
raid.container = None
self.assertFalse(boot.can_be_boot_device(raid))
@ -37,8 +39,24 @@ class TestBootDevRaid(unittest.TestCase):
raid.container.metadata = "imsm"
self.assertTrue(boot.can_be_boot_device(raid))
def test_UEFI_container_non_imsm(self):
@patch("subiquity.common.filesystem.boot.dmidecode_get")
def test_UEFI_container_non_imsm(self, dmi_get):
dmi_get.return_value = ""
raid = make_raid(make_model(Bootloader.UEFI))
raid.container = Mock()
raid.container.metadata = "something else"
self.assertFalse(boot.can_be_boot_device(raid))
@patch("subiquity.common.filesystem.boot.dmidecode_get")
def test_UEFI_spn_poweredge(self, dmi_get):
dmi_get.return_value = "CompanyName PowerEdge 1234"
raid = make_raid(make_model(Bootloader.UEFI))
raid.container = None
self.assertTrue(boot.can_be_boot_device(raid))
@patch("subiquity.common.filesystem.boot.dmidecode_get")
def test_UEFI_spn_other(self, dmi_get):
dmi_get.return_value = "CompanyName ProductName 1227"
raid = make_raid(make_model(Bootloader.UEFI))
raid.container = None
self.assertFalse(boot.can_be_boot_device(raid))