Skip to content

Commit

Permalink
Merge pull request #2105 from dbungert/bridge-kernel
Browse files Browse the repository at this point in the history
Bridge kernel
  • Loading branch information
dbungert authored Oct 16, 2024
2 parents d1086a6 + 5c34c30 commit 6381e52
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 13 deletions.
2 changes: 1 addition & 1 deletion examples/sources/bridge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ kernel:
default: linux-generic
bridge: linux-generic-brg-22.04
bridge_reasons:
- nvidia
- drivers
7 changes: 6 additions & 1 deletion subiquity/models/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,12 @@ def __attrs_post_init__(self):


class BridgeKernelReason(enum.Enum):
NVIDIA = "nvidia"
# When bridge_reasons contains "drivers", some driver packages are known to
# be behind, so we should fall back to the bridge kernel.
DRIVERS = "drivers"
# When bridge_reasons contains "zfs", we should use the bridge kernel as
# the default kernel is not yet known to the kernel team to be sufficiently
# stable.
ZFS = "zfs"


Expand Down
7 changes: 5 additions & 2 deletions subiquity/server/controllers/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,15 @@ def _confirmed(self):
self.app.hub.broadcast(InstallerChannels.BRIDGE_KERNEL_DECIDED)
self._maybe_set_bridge_kernel(BridgeKernelReason.ZFS, fs_model.uses_zfs())
if not self.app.base_model.source.search_drivers:
self._maybe_set_bridge_kernel(BridgeKernelReason.NVIDIA, False)
self._maybe_set_bridge_kernel(BridgeKernelReason.DRIVERS, False)

def _drivers_decided(self):
drivers_controller = self.app.controllers.Drivers
# while the term DRIVERS is used here, only some drivers are expected
# to trigger bridge kernel fallback, and only then if DRIVERS is listed
# as one of the bridge_reasons.
self._maybe_set_bridge_kernel(
BridgeKernelReason.NVIDIA,
BridgeKernelReason.DRIVERS,
drivers_controller.model.do_install
and any("nvidia" in driver for driver in drivers_controller.drivers),
)
Expand Down
6 changes: 4 additions & 2 deletions subiquity/server/controllers/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ def start(self):
self.app.hub.subscribe(
(InstallerChannels.CONFIGURED, "locale"), self._set_locale
)
if self.model.catalog.version != 1:
raise Exception("unknown source catalog version")
if self.model.catalog.version not in (1, 2):
raise Exception(
f"unknown source catalog version {self.model.catalog.version}"
)

def _set_locale(self):
current = self.app.base_model.locale.selected_language
Expand Down
14 changes: 7 additions & 7 deletions subiquity/server/controllers/tests/test_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,19 @@ def n_booleans(*, n):


bridge_scenarios = []
for bridge_zfs, bridge_nvidia, has_zfs, has_nvidia in n_booleans(n=4):
for bridge_zfs, bridge_drivers, has_zfs, has_drivers in n_booleans(n=4):
# We consider scenarios for each reason being a reason to choose
# the kernel and actually discovered.
bridge_reasons = []
if bridge_zfs:
bridge_reasons.append(BridgeKernelReason.ZFS)
if bridge_nvidia:
bridge_reasons.append(BridgeKernelReason.NVIDIA)
if bridge_drivers:
bridge_reasons.append(BridgeKernelReason.DRIVERS)
detected_reasons = []
if has_zfs:
detected_reasons.append(BridgeKernelReason.ZFS)
if has_nvidia:
detected_reasons.append(BridgeKernelReason.NVIDIA)
if has_drivers:
detected_reasons.append(BridgeKernelReason.DRIVERS)
for search_drivers, do_install in n_booleans(n=2):
# Then we consider scenarios where the user chooses whether or
# not to search for drivers and whether or not to install the
Expand All @@ -64,7 +64,7 @@ def n_booleans(*, n):
use_bridge = False
if bridge_zfs and has_zfs:
use_bridge = True
if bridge_nvidia and has_nvidia and do_install:
if bridge_drivers and has_drivers and do_install:
use_bridge = True
bridge_scenarios.append(
(
Expand Down Expand Up @@ -174,7 +174,7 @@ async def test_bridge_options(self, scenario):

if not scenario.search_drivers:
drivers = []
elif BridgeKernelReason.NVIDIA in scenario.detected_reasons:
elif BridgeKernelReason.DRIVERS in scenario.detected_reasons:
drivers = ["something-else", "nvidia-driver"]
else:
drivers = ["something-else"]
Expand Down

0 comments on commit 6381e52

Please sign in to comment.