# SPDX-License-Identifier: LGPL-2.1+
import contextlib
+import dataclasses
import os
import subprocess
import sys
from collections.abc import Iterator, Sequence
from pathlib import Path
from types import TracebackType
-from typing import Any, NamedTuple, Optional
+from typing import Any, Optional
import pytest
from mkosi.user import INVOKING_USER
+@dataclasses.dataclass(frozen=True)
+class ImageConfig:
+ distribution: Distribution
+ release: str
+ tools_tree_distribution: Optional[Distribution]
+ tools_tree_release: Optional[str]
+ debug_shell: bool
+
+
class Image:
- class Config(NamedTuple):
- distribution: Distribution
- release: str
- tools_tree_distribution: Optional[Distribution]
- tools_tree_release: Optional[str]
- debug_shell: bool
-
- def __init__(self, config: Config, options: Sequence[PathString] = []) -> None:
+ def __init__(self, config: ImageConfig, options: Sequence[PathString] = []) -> None:
self.options = options
self.config = config
from mkosi.config import parse_config
from mkosi.distributions import Distribution, detect_distribution
-from . import Image, ci_group
+from . import ImageConfig, ci_group
def pytest_addoption(parser: Any) -> None:
@pytest.fixture(scope="session")
-def config(request: Any) -> Image.Config:
+def config(request: Any) -> ImageConfig:
distribution = cast(Distribution, request.config.getoption("--distribution"))
release = cast(str, request.config.getoption("--release") or parse_config(["-d", str(distribution)])[1][0].release)
- return Image.Config(
+ return ImageConfig(
distribution=distribution,
release=release,
tools_tree_distribution=cast(Distribution, request.config.getoption("--tools-tree-distribution")),
from mkosi.run import find_binary, run
from mkosi.versioncomp import GenericVersion
-from . import Image
+from . import Image, ImageConfig
pytestmark = pytest.mark.integration
@pytest.mark.parametrize("format", [f for f in OutputFormat if f not in (OutputFormat.confext, OutputFormat.sysext)])
-def test_format(config: Image.Config, format: OutputFormat) -> None:
+def test_format(config: ImageConfig, format: OutputFormat) -> None:
with Image(
config,
options=[
@pytest.mark.parametrize("bootloader", Bootloader)
-def test_bootloader(config: Image.Config, bootloader: Bootloader) -> None:
+def test_bootloader(config: ImageConfig, bootloader: Bootloader) -> None:
if config.distribution == Distribution.rhel_ubi:
return
from mkosi.user import INVOKING_USER
from mkosi.versioncomp import GenericVersion
-from . import Image, ci_group
+from . import Image, ImageConfig, ci_group
pytestmark = pytest.mark.integration
@pytest.fixture(scope="module")
-def initrd(request: Any, config: Image.Config) -> Iterator[Image]:
+def initrd(request: Any, config: ImageConfig) -> Iterator[Image]:
with (
ci_group(f"Initrd image {config.distribution}/{config.release}"),
Image(
@pytest.mark.skipif(os.getuid() != 0, reason="mkosi-initrd LUKS+LVM test can only be executed as root")
-def test_initrd_luks_lvm(config: Image.Config, initrd: Image, passphrase: Path) -> None:
+def test_initrd_luks_lvm(config: ImageConfig, initrd: Image, passphrase: Path) -> None:
with Image(
config,
options=[
import pytest
-from . import Image
+from . import Image, ImageConfig
pytestmark = pytest.mark.integration
-def test_sysext(config: Image.Config) -> None:
+def test_sysext(config: ImageConfig) -> None:
with Image(
config,
options=[