ubuntu-drivers: add method to list OEM meta-packages
The ubuntu_drivers.list_drivers() method currently returns names of drivers + name of OEM meta-packages. We now define a new method to be used for the OEM meta-packages only. For now, the has-drivers, no-drivers, run-drivers debug flags affect the presence of the OEM meta-packages as well. Going forward, we should define dry-run directives controlling drivers & OEM independently. Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
This commit is contained in:
parent
919ca5ebd4
commit
e657b7e0e7
|
@ -135,6 +135,25 @@ nvidia-driver-510 linux-modules-nvidia-510-generic-hwe-20.04
|
||||||
|
|
||||||
self.assertEqual(drivers, ["nvidia-driver-510"])
|
self.assertEqual(drivers, ["nvidia-driver-510"])
|
||||||
|
|
||||||
|
@patch("subiquity.server.ubuntu_drivers.run_curtin_command")
|
||||||
|
async def test_list_oem(self, mock_run_curtin_command):
|
||||||
|
# Make sure this gets decoded as utf-8.
|
||||||
|
mock_run_curtin_command.return_value = Mock(stdout=b"""\
|
||||||
|
oem-somerville-tentacool-meta
|
||||||
|
""")
|
||||||
|
drivers = await self.ubuntu_drivers.list_oem(
|
||||||
|
root_dir="/target",
|
||||||
|
context="listing OEM meta-packages")
|
||||||
|
|
||||||
|
mock_run_curtin_command.assert_called_once_with(
|
||||||
|
self.app, "listing OEM meta-packages",
|
||||||
|
"in-target", "-t", "/target",
|
||||||
|
"--",
|
||||||
|
"ubuntu-drivers", "list-oem",
|
||||||
|
capture=True, private_mounts=True)
|
||||||
|
|
||||||
|
self.assertEqual(drivers, ["oem-somerville-tentacool-meta"])
|
||||||
|
|
||||||
|
|
||||||
class TestUbuntuDriversRunDriversInterface(unittest.IsolatedAsyncioTestCase):
|
class TestUbuntuDriversRunDriversInterface(unittest.IsolatedAsyncioTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -37,6 +37,9 @@ class UbuntuDriversInterface(ABC):
|
||||||
def __init__(self, app, gpgpu: bool) -> None:
|
def __init__(self, app, gpgpu: bool) -> None:
|
||||||
self.app = app
|
self.app = app
|
||||||
|
|
||||||
|
self.list_oem_cmd = [
|
||||||
|
"ubuntu-drivers", "list-oem",
|
||||||
|
]
|
||||||
self.list_drivers_cmd = [
|
self.list_drivers_cmd = [
|
||||||
"ubuntu-drivers", "list",
|
"ubuntu-drivers", "list",
|
||||||
"--recommended",
|
"--recommended",
|
||||||
|
@ -56,6 +59,10 @@ class UbuntuDriversInterface(ABC):
|
||||||
async def list_drivers(self, root_dir: str, context) -> List[str]:
|
async def list_drivers(self, root_dir: str, context) -> List[str]:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def list_oem(self, root_dir: str, context) -> List[str]:
|
||||||
|
pass
|
||||||
|
|
||||||
async def install_drivers(self, root_dir: str, context) -> None:
|
async def install_drivers(self, root_dir: str, context) -> None:
|
||||||
await run_curtin_command(
|
await run_curtin_command(
|
||||||
self.app, context,
|
self.app, context,
|
||||||
|
@ -78,6 +85,18 @@ class UbuntuDriversInterface(ABC):
|
||||||
|
|
||||||
return drivers
|
return drivers
|
||||||
|
|
||||||
|
def _oem_metapackages_from_output(self, output: str) -> List[str]:
|
||||||
|
""" Parse the output of ubuntu-drivers list-oem and return a list of
|
||||||
|
packages. """
|
||||||
|
metapackages: List[str] = []
|
||||||
|
# Packages are listed one per line.
|
||||||
|
for line in [x.strip() for x in output.split("\n")]:
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
metapackages.append(line)
|
||||||
|
|
||||||
|
return metapackages
|
||||||
|
|
||||||
|
|
||||||
class UbuntuDriversClientInterface(UbuntuDriversInterface):
|
class UbuntuDriversClientInterface(UbuntuDriversInterface):
|
||||||
""" UbuntuDrivers interface that uses the ubuntu-drivers command from the
|
""" UbuntuDrivers interface that uses the ubuntu-drivers command from the
|
||||||
|
@ -105,12 +124,24 @@ class UbuntuDriversClientInterface(UbuntuDriversInterface):
|
||||||
# output.
|
# output.
|
||||||
return self._drivers_from_output(result.stdout.decode("utf-8"))
|
return self._drivers_from_output(result.stdout.decode("utf-8"))
|
||||||
|
|
||||||
|
async def list_oem(self, root_dir: str, context) -> List[str]:
|
||||||
|
result = await run_curtin_command(
|
||||||
|
self.app, context,
|
||||||
|
"in-target", "-t", root_dir, "--", *self.list_oem_cmd,
|
||||||
|
capture=True, private_mounts=True)
|
||||||
|
# Currently we have no way to specify universal_newlines=True or
|
||||||
|
# encoding="utf-8" to run_curtin_command so we need to decode the
|
||||||
|
# output.
|
||||||
|
return self._oem_metapackages_from_output(
|
||||||
|
result.stdout.decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
class UbuntuDriversHasDriversInterface(UbuntuDriversInterface):
|
class UbuntuDriversHasDriversInterface(UbuntuDriversInterface):
|
||||||
""" A dry-run implementation of ubuntu-drivers that returns a hard-coded
|
""" A dry-run implementation of ubuntu-drivers that returns a hard-coded
|
||||||
list of drivers. """
|
list of drivers. """
|
||||||
gpgpu_drivers: List[str] = ["nvidia-driver-470-server"]
|
gpgpu_drivers: List[str] = ["nvidia-driver-470-server"]
|
||||||
not_gpgpu_drivers: List[str] = ["nvidia-driver-510"]
|
not_gpgpu_drivers: List[str] = ["nvidia-driver-510"]
|
||||||
|
oem_metapackages: List[str] = ["oem-somerville-tentacool-meta"]
|
||||||
|
|
||||||
def __init__(self, app, gpgpu: bool) -> None:
|
def __init__(self, app, gpgpu: bool) -> None:
|
||||||
super().__init__(app, gpgpu)
|
super().__init__(app, gpgpu)
|
||||||
|
@ -122,6 +153,9 @@ class UbuntuDriversHasDriversInterface(UbuntuDriversInterface):
|
||||||
async def list_drivers(self, root_dir: str, context) -> List[str]:
|
async def list_drivers(self, root_dir: str, context) -> List[str]:
|
||||||
return self.drivers
|
return self.drivers
|
||||||
|
|
||||||
|
async def list_oem(self, root_dir: str, context) -> List[str]:
|
||||||
|
return self.oem_metapackages
|
||||||
|
|
||||||
|
|
||||||
class UbuntuDriversNoDriversInterface(UbuntuDriversHasDriversInterface):
|
class UbuntuDriversNoDriversInterface(UbuntuDriversHasDriversInterface):
|
||||||
""" A dry-run implementation of ubuntu-drivers that returns a hard-coded
|
""" A dry-run implementation of ubuntu-drivers that returns a hard-coded
|
||||||
|
@ -129,6 +163,7 @@ class UbuntuDriversNoDriversInterface(UbuntuDriversHasDriversInterface):
|
||||||
|
|
||||||
gpgpu_drivers: List[str] = []
|
gpgpu_drivers: List[str] = []
|
||||||
not_gpgpu_drivers: List[str] = []
|
not_gpgpu_drivers: List[str] = []
|
||||||
|
oem_metapackages: List[str] = []
|
||||||
|
|
||||||
|
|
||||||
class UbuntuDriversRunDriversInterface(UbuntuDriversInterface):
|
class UbuntuDriversRunDriversInterface(UbuntuDriversInterface):
|
||||||
|
@ -150,6 +185,11 @@ class UbuntuDriversRunDriversInterface(UbuntuDriversInterface):
|
||||||
result = await arun_command(self.list_drivers_cmd)
|
result = await arun_command(self.list_drivers_cmd)
|
||||||
return self._drivers_from_output(result.stdout)
|
return self._drivers_from_output(result.stdout)
|
||||||
|
|
||||||
|
async def list_oem(self, root_dir: str, context) -> List[str]:
|
||||||
|
# We run the command locally - ignoring the root_dir.
|
||||||
|
result = await arun_command(self.list_oem_cmd)
|
||||||
|
return self._oem_metapackages_from_output(result.stdout)
|
||||||
|
|
||||||
|
|
||||||
def get_ubuntu_drivers_interface(app) -> UbuntuDriversInterface:
|
def get_ubuntu_drivers_interface(app) -> UbuntuDriversInterface:
|
||||||
is_server = app.base_model.source.current.variant == "server"
|
is_server = app.base_model.source.current.variant == "server"
|
||||||
|
|
Loading…
Reference in New Issue