curtin-dev team mailing list archive
-
curtin-dev team
-
Mailing list archive
-
Message #03595
[Merge] ~dbungert/curtin:kernel-remove-ctd into curtin:master
Dan Bungert has proposed merging ~dbungert/curtin:kernel-remove-ctd into curtin:master.
Commit message:
curthooks: support explicit kernel removal
Requested reviews:
curtin developers (curtin-dev)
For more details, see:
https://code.launchpad.net/~dbungert/curtin/+git/curtin/+merge/469886
I think with this I don't need https://code.launchpad.net/~dbungert/curtin/+git/curtin/+merge/469605
--
Your team curtin developers is requested to review the proposed merge of ~dbungert/curtin:kernel-remove-ctd into curtin:master.
diff --git a/curtin/commands/curthooks.py b/curtin/commands/curthooks.py
index 51b2a08..6cebeb0 100644
--- a/curtin/commands/curthooks.py
+++ b/curtin/commands/curthooks.py
@@ -372,18 +372,19 @@ def install_kernel(cfg, target):
kernel_cfg = config.fromdict(config.KernelConfig, kernel_cfg_d)
- if not kernel_cfg.install:
- if kernel_cfg.remove_existing:
- distro.purge_all_kernels(target=target)
- LOG.debug(
- "Not installing any kernel since kernel: {install: false} "
- "was specified"
- )
- return
-
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 not kernel_cfg.install:
+ LOG.debug(
+ "Not installing any kernel since kernel: {install: false} "
+ "was specified"
+ )
+ return
mapping = copy.deepcopy(KERNEL_MAPPING)
config.merge_config(mapping, kernel_cfg.mapping)
diff --git a/curtin/config.py b/curtin/config.py
index e9f578d..74451c8 100644
--- a/curtin/config.py
+++ b/curtin/config.py
@@ -161,6 +161,7 @@ class KernelConfig:
mapping: dict = attr.Factory(dict)
install: bool = attr.ib(default=True, converter=value_as_boolean)
remove_existing: bool = attr.ib(default=False, converter=value_as_boolean)
+ remove: list = attr.Factory(list)
class SerializationError(Exception):
diff --git a/doc/topics/config.rst b/doc/topics/config.rst
index d511f94..b579f37 100644
--- a/doc/topics/config.rst
+++ b/doc/topics/config.rst
@@ -446,6 +446,10 @@ kernels in .deb packages are removed from the target system (packages which
kernel is being installed, this also implies the removal of the
``linux-firmware`` package.
+**remove**: *<List of kernel package names>*
+
+After kernel installation, remove the listed packages.
+
**Examples**::
kernel:
@@ -466,6 +470,11 @@ kernel is being installed, this also implies the removal of the
install: false
remove_existing: true
+ # install hwe kernel, remove generic kernel
+ kernel:
+ package: linux-image-generic-hwe-24.04
+ remove: ["linux-generic"]
+
kexec
~~~~~
diff --git a/tests/unittests/test_curthooks.py b/tests/unittests/test_curthooks.py
index 47df8bf..e174e03 100644
--- a/tests/unittests/test_curthooks.py
+++ b/tests/unittests/test_curthooks.py
@@ -219,6 +219,52 @@ class TestCurthooksInstallKernel(CiTestCase):
# remove
self.mock_purgepkg.assert_not_called()
+ def test__remove_explicitly(self):
+ to_remove_kernel_package = "mock-linux-kernel"
+ kernel_cfg = {
+ 'kernel': {
+ 'install': False,
+ 'remove': [to_remove_kernel_package],
+ }
+ }
+ self.mock_subp.return_value = ("warty", "")
+ self.mock_uname.return_value = (None, None, "1.2.3-4-flavor")
+ self.mock_list_kernels.return_value = ["mock-kernel-1.2.3-4-generic"]
+
+ with patch.dict(os.environ, clear=True):
+ curthooks.install_kernel(kernel_cfg, self.target)
+
+ self.mock_instpkg.assert_not_called()
+ self.mock_purgepkg.assert_called_with(
+ [to_remove_kernel_package], target=self.target,
+ )
+
+ def test__install_and_remove(self):
+ to_remove_kernel_package = "mock-linux-kernel"
+ to_install_kernel_package = "mock-linux-hwe-kernel"
+ kernel_cfg = {
+ 'kernel': {
+ 'package': to_install_kernel_package,
+ 'remove': [to_remove_kernel_package],
+ }
+ }
+ self.mock_subp.return_value = ("warty", "")
+ self.mock_uname.return_value = (None, None, "1.2.3-4-flavor")
+ self.mock_list_kernels.return_value = []
+
+ with patch.dict(os.environ, clear=True):
+ curthooks.install_kernel(kernel_cfg, self.target)
+
+ self.mock_instpkg.assert_called_with(
+ [to_install_kernel_package],
+ target=self.target,
+ env=self.fk_env,
+ )
+
+ self.mock_purgepkg.assert_called_with(
+ [to_remove_kernel_package], target=self.target,
+ )
+
class TestEnableDisableUpdateInitramfs(CiTestCase):
Follow ups