Instead of using systemd-cat in dry-run mode and systemd-run in normal
mode, we now use systemd-run all the time but pass the --user switch
when running as non-root.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
The LoggedCommandRunner now has the option to start a command with
private mounts enabled - see mount_namespaces(7).
To use this feature, we now rely on systemd-run instead of systemd-cat.
The main benefit is that it should allow us not to worry about mounts
refusing to be un-mounted after executing a curtin in-target command.
On the downside, systemd-run requires root privileges (unless --user is
available) so we can't use it in dry-run mode. For dry-run mode, we
still need to rely on systemd-cat.
Another downside is that the commands passed to systemd-run are run in a
clean environment. Therefore, we must explicitly set the environment
variables that we want to pass to the commands to execute.
I came up with a short list of environment variables that we need but we
might need to add more later.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
We now provide implementation for different interfaces to list and
install drivers using ubuntu-drivers. The implementations are outside
the drivers controller.
We have:
* the normal interface that calls ubuntu-drivers in the root directory
specified (i.e., in /target or an overlay).
* a dry-run interface that calls the system's ubuntu-drivers for
listing the drivers available (but does not install anything).
The listing of drivers will fail if --recommended is not an available
option in the system's ubuntu-drivers implementation.
* a dry-run interface that returns an hard-coded list of drivers and
does nothing on installation.
* a dry-run interface that returns an empty list of drivers.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
Using run_curtin_command, we have no way to specify the encoding or
something like universal_newlines=True. This is actually not supported
by asyncio.create_subprocess_exec(...).
We have partial support for this in Subiquity when using arun_command()
but run_curtin_command() actually relies on astart_command() + wait().
Therefore, we now decode the output at the very end, just before reading
the outout of ubuntu-drivers.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
In the reponse to the /a/drivers GET call, we now include a list of
packages / drivers instead of just storing a boolean telling if any
driver has been found.
Each element from the list corresponds to the name of a package to
install.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
The drivers GET call returned only the value of "has_drivers" (when
known). In order to have the client be able to know the current value of
install/do_install, we now embed the value into the response as well:
Before, the call would return either:
true -> meaning that there are drivers available to install
false -> meaning that there are no drivers available to install
null -> retry later - we don't know yet
Now we have:
{
"has_drivers": boolean or null if we don't know yet
"install": boolean
}
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
The autoinstall data for the drivers was only constituted of a boolean,
e.g.:
drivers: true
or
drivers: false
It was not immediately clear that the boolean value meant (install/don't
install the drivers).
We now store the boolean in the "install" sub-element instead, e.g.:
drivers:
- install: true
drivers:
- install: false
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
os-prober is leaving around invalid devices and we don't know what to do
about it yet, but we do know that we don't require os-prober for
20.04.4. Back this out. LP: #1961640 LP: #1961628
AptConfigurer.setup_overlays() used to accept either a single Lower
directory or a sequence of them. It oftentimes felt confusing so we now
accept only a sequence of Lower's. If we want to pass a single Lower, we
can just pass a list with a single element.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
Added some unit tests for translating different "types" of directories
into a list of options suitable for mount -t overlay.
The unit tests can also be used as examples to visualize how a given
overlay would be configured depending on the parameters that are given
for its creation.
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
Create open_perms context manager for custom or multiple writes.
Create generate_config for a small removal of redundancy.
0640 root:adm the resulting files.