Skip to content

Commit

Permalink
test: test both `quay.io/centos-bootc/{centos,fedora}-bootc:{eln,stre…
Browse files Browse the repository at this point in the history
…am9}`

Now that `bib` supports both fedora and centos bootc we need to start
testing both as part of the integration suite.
  • Loading branch information
mvo5 committed Jan 22, 2024
1 parent f25439c commit 427b747
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 24 deletions.
9 changes: 0 additions & 9 deletions test/containerbuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,3 @@ def build_container_fixture():
"-t", container_tag,
])
return container_tag


def container_to_build_ref():
# TODO: make this another indirect fixture input, e.g. by making
# making "image_type" an "image" tuple (type, container_ref_to_test)
return os.getenv(
"BIB_TEST_BOOTC_CONTAINER_TAG",
"quay.io/centos-bootc/fedora-bootc:eln",
)
21 changes: 9 additions & 12 deletions test/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@

# local test utils
import testutil
from containerbuild import build_container_fixture, container_to_build_ref # noqa: F401
from containerbuild import build_container_fixture # noqa: F401
from testcases import gen_testcases
from vm import AWS, QEMU

if not testutil.has_executable("podman"):
Expand All @@ -27,10 +28,6 @@
pytest.skip("need x86_64-v3 capable CPU", allow_module_level=True)


# image types to test
SUPPORTED_IMAGE_TYPES = ["qcow2", "ami", "raw"]


class ImageBuildResult(NamedTuple):
img_type: str
img_path: str
Expand All @@ -47,7 +44,7 @@ def image_type_fixture(tmpdir_factory, build_container, request, force_aws_uploa
ImageBuildResult with the resulting image path and user/password
"""
# image_type is passed via special pytest parameter fixture
image_type = request.param
container_ref, image_type = request.param.split(",")

username = "test"
password = "password"
Expand All @@ -61,7 +58,7 @@ def image_type_fixture(tmpdir_factory, build_container, request, force_aws_uploa
"ami": pathlib.Path(output_path) / "image/disk.raw",
"raw": pathlib.Path(output_path) / "image/disk.raw",
}
assert len(artifact) == len(SUPPORTED_IMAGE_TYPES), \
assert len(artifact) == len(set(t.split(",")[1] for t in gen_testcases("direct-boot"))), \
"please keep artifact mapping and supported images in sync"
generated_img = artifact[image_type]

Expand Down Expand Up @@ -118,7 +115,7 @@ def image_type_fixture(tmpdir_factory, build_container, request, force_aws_uploa
"-v", "/store", # share the cache between builds
*creds_args,
build_container,
container_to_build_ref(),
container_ref,
"--config", "/output/config.json",
"--type", image_type,
*upload_args,
Expand All @@ -143,14 +140,14 @@ def test_container_builds(build_container):
assert build_container in output


@pytest.mark.parametrize("image_type", SUPPORTED_IMAGE_TYPES, indirect=["image_type"])
@pytest.mark.parametrize("image_type", gen_testcases("direct-boot"), indirect=["image_type"])
def test_image_is_generated(image_type):
assert image_type.img_path.exists(), "output file missing, dir "\
f"content: {os.listdir(os.fspath(image_type.img_path))}"


@pytest.mark.skipif(platform.system() != "Linux", reason="boot test only runs on linux right now")
@pytest.mark.parametrize("image_type", SUPPORTED_IMAGE_TYPES, indirect=["image_type"])
@pytest.mark.parametrize("image_type", gen_testcases("direct-boot"), indirect=["image_type"])
def test_image_boots(image_type):
with QEMU(image_type.img_path) as test_vm:
exit_status, _ = test_vm.run("true", user=image_type.username, password=image_type.password)
Expand All @@ -160,7 +157,7 @@ def test_image_boots(image_type):
assert "hello" in output


@pytest.mark.parametrize("image_type", ["ami"], indirect=["image_type"])
@pytest.mark.parametrize("image_type", gen_testcases("ami-boot"), indirect=["image_type"])
def test_ami_boots_in_aws(image_type, force_aws_upload):
if not testutil.write_aws_creds("/dev/null"): # we don't care about the file, just the variables being there
if force_aws_upload:
Expand Down Expand Up @@ -210,7 +207,7 @@ def has_selinux():


@pytest.mark.skipif(not has_selinux(), reason="selinux not enabled")
@pytest.mark.parametrize("image_type", SUPPORTED_IMAGE_TYPES, indirect=["image_type"])
@pytest.mark.parametrize("image_type", gen_testcases("direct-boot"), indirect=["image_type"])
def test_image_build_without_se_linux_denials(image_type):
# the journal always contains logs from the image building
assert image_type.journal_output != ""
Expand Down
10 changes: 7 additions & 3 deletions test/test_manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@
if not testutil.has_executable("podman"):
pytest.skip("no podman, skipping integration tests that required podman", allow_module_level=True)

from containerbuild import build_container_fixture, container_to_build_ref # noqa: F401
from containerbuild import build_container_fixture # noqa: F401
from testcases import gen_testcases


def test_manifest_smoke(build_container):
@pytest.mark.parametrize("image_type", gen_testcases("manifest"))
def test_manifest_smoke(build_container, image_type):
container_ref = image_type.split(",")[0]

output = subprocess.check_output([
"podman", "run", "--rm",
f'--entrypoint=["/usr/bin/bootc-image-builder", "manifest", "{container_to_build_ref()}"]',
f'--entrypoint=["/usr/bin/bootc-image-builder", "manifest", "{container_ref}"]',
build_container,
])
manifest = json.loads(output)
Expand Down
29 changes: 29 additions & 0 deletions test/testcases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import os


def gen_testcases(what):
# supported images that can be directly booted
DIRECT_BOOT_IMAGE_TYPES = ("qcow2", "ami", "raw")

# bootc containers that are tested by default
CONTAINERS_TO_TEST = (
"quay.io/centos-bootc/fedora-bootc:eln",
"quay.io/centos-bootc/centos-bootc:stream9",
)
# allow commandline override
if os.getenv("BIB_TEST_BOOTC_CONTAINER_TAG"):
CONTAINERS_TO_TEST = [os.getenv("BIB_TEST_BOOTC_CONTAINER_TAG")]

if what == "manifest":
return CONTAINERS_TO_TEST
elif what == "ami-boot":
return [cnt + ",ami" for cnt in CONTAINERS_TO_TEST]
elif what == "direct-boot":
test_cases = []
# this is (obviously) many test-cases, we could try to be smarter here
# and only test subsets (e.g. fedora-bootc,qcow2 centos-bootc,raw)
for cnt in CONTAINERS_TO_TEST:
for img_type in DIRECT_BOOT_IMAGE_TYPES:
test_cases.append(f"{cnt},{img_type}")
return test_cases
raise ValueError(f"unknown test-case type {what}")

0 comments on commit 427b747

Please sign in to comment.