]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Refactor extension image helper methods
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 17 Dec 2024 08:09:16 +0000 (09:09 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 17 Dec 2024 09:52:24 +0000 (10:52 +0100)
Let's have two helper methods, is_extension_image() and
is_extension_or_portable_image(). The first is for true extensions,
that are overlayed on top of an existing system, whereas the second
one includes portable images, which are standalone and not overlayed
on top of an existing system.

mkosi/__init__.py
mkosi/bootloader.py
mkosi/config.py
tests/test_boot.py

index b79f5041afc7203bbe9010d4f31fbe44ba6e7f4d..6ecda4f95ba0360f329e9c29cfac3b4dcd901d69 100644 (file)
@@ -201,10 +201,7 @@ def install_distribution(context: Context) -> None:
         with complete_step(f"Installing extra packages for {context.config.distribution.pretty_name()}"):
             context.config.distribution.install_packages(context, context.config.packages)
     else:
-        if context.config.overlay or context.config.output_format in (
-            OutputFormat.sysext,
-            OutputFormat.confext,
-        ):
+        if context.config.overlay or context.config.output_format.is_extension_image():
             if context.config.packages:
                 die(
                     "Cannot install packages in extension images without a base tree",
@@ -288,7 +285,7 @@ def remove_packages(context: Context) -> None:
 
 
 def check_root_populated(context: Context) -> None:
-    if context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.output_format.is_extension_image():
         return
 
     """Check that the root was populated by looking for a os-release file."""
@@ -308,7 +305,7 @@ def configure_os_release(context: Context) -> None:
     if not (context.config.image_id or context.config.image_version or context.config.hostname):
         return
 
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     for candidate in ["usr/lib/os-release", "usr/lib/initrd-release", "etc/os-release"]:
@@ -2085,7 +2082,7 @@ def install_kernel(context: Context, partitions: Sequence[Partition]) -> None:
 
     if context.config.bootable == ConfigFeature.auto and (
         context.config.output_format == OutputFormat.cpio
-        or context.config.output_format.is_extension_image()
+        or context.config.output_format.is_extension_or_portable_image()
         or context.config.overlay
     ):
         return
@@ -2719,7 +2716,7 @@ def configure_ssh(context: Context) -> None:
 
 
 def configure_initrd(context: Context) -> None:
-    if context.config.overlay or context.config.output_format.is_extension_image():
+    if context.config.overlay or context.config.output_format.is_extension_or_portable_image():
         return
 
     if (
@@ -2740,7 +2737,7 @@ def configure_initrd(context: Context) -> None:
 
 
 def configure_clock(context: Context) -> None:
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     with umask(~0o644):
@@ -2748,7 +2745,7 @@ def configure_clock(context: Context) -> None:
 
 
 def run_depmod(context: Context, *, cache: bool = False) -> None:
-    if context.config.overlay or context.config.output_format.is_extension_image():
+    if context.config.overlay or context.config.output_format.is_extension_or_portable_image():
         return
 
     outputs = (
@@ -2787,7 +2784,7 @@ def run_depmod(context: Context, *, cache: bool = False) -> None:
 
 
 def run_sysusers(context: Context) -> None:
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     if not context.config.find_binary("systemd-sysusers"):
@@ -2804,7 +2801,7 @@ def run_sysusers(context: Context) -> None:
 
 
 def run_tmpfiles(context: Context) -> None:
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     if not context.config.find_binary("systemd-tmpfiles"):
@@ -2846,7 +2843,7 @@ def run_tmpfiles(context: Context) -> None:
 
 
 def run_preset(context: Context) -> None:
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     if not context.config.find_binary("systemctl"):
@@ -2865,7 +2862,7 @@ def run_preset(context: Context) -> None:
 
 
 def run_hwdb(context: Context) -> None:
-    if context.config.overlay or context.config.output_format in (OutputFormat.sysext, OutputFormat.confext):
+    if context.config.overlay or context.config.output_format.is_extension_image():
         return
 
     if not context.config.find_binary("systemd-hwdb"):
@@ -2883,7 +2880,7 @@ def run_hwdb(context: Context) -> None:
 
 
 def run_firstboot(context: Context) -> None:
-    if context.config.overlay or context.config.output_format.is_extension_image():
+    if context.config.overlay or context.config.output_format.is_extension_or_portable_image():
         return
 
     if not context.config.find_binary("systemd-firstboot"):
@@ -3408,7 +3405,7 @@ def make_esp(context: Context, uki: Path) -> list[Partition]:
     )
 
 
-def make_extension_image(context: Context, output: Path) -> None:
+def make_extension_or_portable_image(context: Context, output: Path) -> None:
     unsigned = "-unsigned" if not want_verity(context.config) else ""
     r = context.resources / f"repart/definitions/{context.config.output_format}{unsigned}.repart.d"
 
@@ -3732,8 +3729,8 @@ def build_image(context: Context) -> None:
         assert stub and kver and kimg
         make_uki(context, stub, kver, kimg, microcode, context.staging / context.config.output_split_uki)
         make_esp(context, context.staging / context.config.output_split_uki)
-    elif context.config.output_format.is_extension_image():
-        make_extension_image(context, context.staging / context.config.output_with_format)
+    elif context.config.output_format.is_extension_or_portable_image():
+        make_extension_or_portable_image(context, context.staging / context.config.output_with_format)
     elif context.config.output_format == OutputFormat.directory:
         context.root.rename(context.staging / context.config.output_with_format)
 
index 04476711045e13b6655438b1baeb51297c73c93d..d80aa86b64dcc3d2b37994bcadabb6829ae182c3 100644 (file)
@@ -51,7 +51,7 @@ def want_efi(config: Config) -> bool:
 
     if (
         config.output_format == OutputFormat.cpio
-        or config.output_format.is_extension_image()
+        or config.output_format.is_extension_or_portable_image()
         or config.overlay
     ) and config.bootable == ConfigFeature.auto:
         return False
index 7cd959d61fea816327e74140856aaad7a749cd97..71036d770cc84b41cd0f319b683e738b100fc111 100644 (file)
@@ -203,10 +203,20 @@ class OutputFormat(StrEnum):
         }.get(self, "")  # fmt: skip
 
     def use_outer_compression(self) -> bool:
-        return self in (OutputFormat.tar, OutputFormat.cpio, OutputFormat.disk) or self.is_extension_image()
+        return self in (
+            OutputFormat.tar,
+            OutputFormat.cpio,
+            OutputFormat.disk,
+            OutputFormat.sysext,
+            OutputFormat.confext,
+            OutputFormat.portable,
+        )
 
     def is_extension_image(self) -> bool:
-        return self in (OutputFormat.sysext, OutputFormat.confext, OutputFormat.portable)
+        return self in (OutputFormat.sysext, OutputFormat.confext)
+
+    def is_extension_or_portable_image(self) -> bool:
+        return self.is_extension_image() or self == OutputFormat.portable
 
 
 class ManifestFormat(StrEnum):
@@ -4817,7 +4827,7 @@ def summary(config: Config) -> str:
                     SELinux Relabel: {config.selinux_relabel}
 """
 
-    if config.output_format.is_extension_image() or config.output_format in (
+    if config.output_format.is_extension_or_portable_image() or config.output_format in (
         OutputFormat.disk,
         OutputFormat.uki,
         OutputFormat.esp,
index 54cddd1ee3ba5639e7843f0d592599effcc39b47..e92159b064233ae830dd466113d343657963097a 100644 (file)
@@ -22,9 +22,7 @@ def have_vmspawn() -> bool:
     )
 
 
-@pytest.mark.parametrize(
-    "format", [f for f in OutputFormat if f not in (OutputFormat.confext, OutputFormat.sysext)]
-)
+@pytest.mark.parametrize("format", [f for f in OutputFormat if not f.is_extension_image()])
 def test_format(config: ImageConfig, format: OutputFormat) -> None:
     with Image(config) as image:
         if image.config.distribution == Distribution.rhel_ubi and format in (
@@ -50,7 +48,7 @@ def test_format(config: ImageConfig, format: OutputFormat) -> None:
         if image.config.distribution == Distribution.rhel_ubi:
             return
 
-        if format in (OutputFormat.tar, OutputFormat.oci, OutputFormat.none) or format.is_extension_image():
+        if format in (OutputFormat.tar, OutputFormat.oci, OutputFormat.none, OutputFormat.portable):
             return
 
         if format == OutputFormat.directory and not find_virtiofsd():