curtin-dev team mailing list archive
-
curtin-dev team
-
Mailing list archive
-
Message #03601
[Merge] ~dbungert/curtin:kernel-remove-better-oem into curtin:master
Dan Bungert has proposed merging ~dbungert/curtin:kernel-remove-better-oem into curtin:master.
Commit message:
distro: fix handling of pre-installed OEM kernel
In the case of a pre-installed OEM kernel, we need to handle removals
differently. Since Subiquity is managing OEM kernel installs, we need
that outside input to to know what the "before" state of the kernels is,
and the existing handling of ensure_one_kernel works well with that if
we just pass along that "before" state.
Have Subiquity feed the initial state (calculated before attempting to
install OEM kernels) will handle the OEM case - we start and finish with
one kernel so leave it alone - along with the two kernel case - we have
some other kernel pre-installed then Subiquity installs the OEM kernel,
and the remove list is that pre-installed kernel.
Requested reviews:
curtin developers (curtin-dev)
For more details, see:
https://code.launchpad.net/~dbungert/curtin/+git/curtin/+merge/470067
--
Your team curtin developers is requested to review the proposed merge of ~dbungert/curtin:kernel-remove-better-oem into curtin:master.
diff --git a/curtin/commands/curthooks.py b/curtin/commands/curthooks.py
index 6cebeb0..0539c83 100644
--- a/curtin/commands/curthooks.py
+++ b/curtin/commands/curthooks.py
@@ -373,11 +373,11 @@ def install_kernel(cfg, target):
kernel_cfg = config.fromdict(config.KernelConfig, kernel_cfg_d)
with contextlib.ExitStack() as exitstack:
- if kernel_cfg.remove_existing:
- exitstack.enter_context(distro.ensure_one_kernel(target=target))
- if kernel_cfg.remove:
- exitstack.callback(
- distro.purge_packages, kernel_cfg.remove, target=target
+ if kernel_cfg.remove_existing or kernel_cfg.remove:
+ exitstack.enter_context(
+ distro.ensure_one_kernel(
+ target=target, before=kernel_cfg.remove,
+ )
)
if not kernel_cfg.install:
LOG.debug(
diff --git a/curtin/distro.py b/curtin/distro.py
index 56a80bb..219b854 100644
--- a/curtin/distro.py
+++ b/curtin/distro.py
@@ -516,12 +516,15 @@ def list_kernels(osfamily=None, target=None):
@contextmanager
-def ensure_one_kernel(osfamily=None, target=None):
+def ensure_one_kernel(osfamily=None, target=None, before=None):
"""ensure_one_kernel is a context manager that evalutates the state of
installed kernels, before and after doing package operations. With that
information, kernels that only appear before and not after are removed.
"""
- before = set(list_kernels(osfamily=osfamily, target=target))
+ if bool(before):
+ before = set(before)
+ else:
+ before = set(list_kernels(osfamily=osfamily, target=target))
yield
LOG.debug('ensure_one_kernel: kernels before install %s', before)
diff --git a/tests/unittests/test_curthooks.py b/tests/unittests/test_curthooks.py
index e174e03..4ee3a26 100644
--- a/tests/unittests/test_curthooks.py
+++ b/tests/unittests/test_curthooks.py
@@ -250,7 +250,9 @@ class TestCurthooksInstallKernel(CiTestCase):
}
self.mock_subp.return_value = ("warty", "")
self.mock_uname.return_value = (None, None, "1.2.3-4-flavor")
- self.mock_list_kernels.return_value = []
+ self.mock_list_kernels.return_value = [
+ to_install_kernel_package, to_remove_kernel_package
+ ]
with patch.dict(os.environ, clear=True):
curthooks.install_kernel(kernel_cfg, self.target)
Follow ups