← Back to team overview

curtin-dev team mailing list archive

[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