File: test_boot.py

package info (click to toggle)
mkosi 26-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,564 kB
  • sloc: python: 20,615; sh: 640; makefile: 12
file content (83 lines) | stat: -rw-r--r-- 3,094 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# SPDX-License-Identifier: LGPL-2.1-or-later

import os
import subprocess

import pytest

from mkosi.config import Bootloader, Firmware, OutputFormat
from mkosi.distribution import Distribution
from mkosi.qemu import find_virtiofsd
from mkosi.run import find_binary, run
from mkosi.sandbox import userns_has_single_user
from mkosi.versioncomp import GenericVersion

from . import Image, ImageConfig

pytestmark = pytest.mark.integration


def have_vmspawn() -> bool:
    return find_binary("systemd-vmspawn") is not None and (
        GenericVersion(run(["systemd-vmspawn", "--version"], stdout=subprocess.PIPE).stdout.strip()) >= 256
    )


@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 (
            OutputFormat.esp,
            OutputFormat.uki,
        ):
            pytest.skip("Cannot build RHEL-UBI images with format 'esp' or 'uki'")

        image.build(options=["--format", str(format)])

        if format in (OutputFormat.disk, OutputFormat.directory) and os.getuid() == 0:
            # systemd-resolved is enabled by default in Arch/Debian/Ubuntu (systemd default preset) but fails
            # to start in a systemd-nspawn container with --private-users so we mask it out here to avoid CI
            # failures.
            # FIXME: Remove when Arch/Debian/Ubuntu ship systemd v253
            args = ["systemd.mask=systemd-resolved.service"] if format == OutputFormat.directory else []
            image.boot(args=args)

        if format in (OutputFormat.cpio, OutputFormat.uki, OutputFormat.esp):
            pytest.skip("Default image is too large to be able to boot in CPIO/UKI/ESP format")

        if image.config.distribution == Distribution.rhel_ubi:
            return

        if format in (OutputFormat.tar, OutputFormat.oci, OutputFormat.none, OutputFormat.portable):
            return

        if format == OutputFormat.directory:
            if not find_virtiofsd():
                pytest.skip("virtiofsd is not installed, cannot boot from directory output")

            if userns_has_single_user():
                pytest.skip("Running in user namespace with single user, cannot boot from directory")

            return

        image.vm()

        if have_vmspawn() and format in (OutputFormat.disk, OutputFormat.directory):
            image.vm(options=["--vmm=vmspawn"])

        if format != OutputFormat.disk:
            return

        image.vm(["--firmware=bios"])


@pytest.mark.parametrize("bootloader", Bootloader)
def test_bootloader(config: ImageConfig, bootloader: Bootloader) -> None:
    if config.distribution == Distribution.rhel_ubi or bootloader.is_signed():
        return

    firmware = Firmware.linux if bootloader == Bootloader.none else Firmware.auto

    with Image(config) as image:
        image.build(["--format=disk", "--bootloader", str(bootloader)])
        image.vm(["--firmware", str(firmware)])