Commit forgotten patch

(cherry picked from commit d672d5b724891363bf4f793e21e1993c6be07153)
This commit is contained in:
Lubomír Sedlář 2024-08-29 10:20:50 +02:00 committed by Stepan Oksanichenko
parent dac4df2438
commit b3b4b894c7

286
1782.patch Normal file
View File

@ -0,0 +1,286 @@
From d9d21d3cf4eaad5cc7f2959a4abdafed781bb9cf Mon Sep 17 00:00:00 2001
From: Lubomír Sedlář <lsedlar@redhat.com>
Date: Aug 28 2024 11:07:12 +0000
Subject: [PATCH 1/2] kiwibuild: Fix location and metadata for ISOs
When Kiwi builds an ISO, it is always supposed to be bootable and should
be located in the iso/ subdirectory.
Any other kind of image should still land in images/ and be listed as
not bootable in the metadata.
Relates: https://pagure.io/pungi-fedora/issue/1342
Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
---
diff --git a/pungi/phases/kiwibuild.py b/pungi/phases/kiwibuild.py
index 7ce3a54..12ec26d 100644
--- a/pungi/phases/kiwibuild.py
+++ b/pungi/phases/kiwibuild.py
@@ -184,10 +184,20 @@ class RunKiwiBuildThread(WorkerThread):
# image_dir is absolute path to which the image should be copied.
# We also need the same path as relative to compose directory for
# including in the metadata.
- image_dir = compose.paths.compose.image_dir(variant) % {"arch": arch}
- rel_image_dir = compose.paths.compose.image_dir(
- variant, relative=True
- ) % {"arch": arch}
+ if format_ == "iso":
+ # If the produced image is actually an ISO, it should go to
+ # iso/ subdirectory.
+ image_dir = compose.paths.compose.iso_dir(arch, variant)
+ rel_image_dir = compose.paths.compose.iso_dir(
+ arch, variant, relative=True
+ )
+ else:
+ image_dir = compose.paths.compose.image_dir(variant) % {
+ "arch": arch
+ }
+ rel_image_dir = compose.paths.compose.image_dir(
+ variant, relative=True
+ ) % {"arch": arch}
util.makedirs(image_dir)
filename = os.path.basename(path)
@@ -211,7 +221,8 @@ class RunKiwiBuildThread(WorkerThread):
img.arch = arch
img.disc_number = 1 # We don't expect multiple disks
img.disc_count = 1
- img.bootable = False
+ # Kiwi produces only bootable ISOs. Other kinds of images are
+ img.bootable = format_ == "iso"
img.subvariant = config.get("subvariant", variant.uid)
setattr(img, "can_fail", arch in self.failable_arches)
setattr(img, "deliverable", "kiwibuild")
diff --git a/tests/test_kiwibuildphase.py b/tests/test_kiwibuildphase.py
index 50116a2..491dbf3 100644
--- a/tests/test_kiwibuildphase.py
+++ b/tests/test_kiwibuildphase.py
@@ -242,13 +242,14 @@ class TestKiwiBuildPhase(PungiTestCase):
@mock.patch("pungi.util.get_file_size")
@mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
class TestKiwiBuildThread(PungiTestCase):
- def _img_path(self, arch, filename=None):
- path = self.topdir + "/compose/Server/%s/images" % arch
+ def _img_path(self, arch, filename=None, dir=None):
+ dir = dir or "images"
+ path = self.topdir + "/compose/Server/%s/%s" % (arch, dir)
if filename:
path += "/" + filename
return path
- def test_process(self, KojiWrapper, get_file_size, get_mtime, Linker):
+ def test_process_vagrant_box(self, KojiWrapper, get_file_size, get_mtime, Linker):
img_name = "FCBG.{arch}-Rawhide-1.6.vagrant.libvirt.box"
self.repo = self.topdir + "/compose/Server/$arch/os"
compose = DummyCompose(
@@ -353,6 +354,114 @@ class TestKiwiBuildThread(PungiTestCase):
assert "vagrant-libvirt.box" == image.format
assert "vagrant-libvirt" == image.type
assert "Test" == image.subvariant
+ assert not image.bootable
+
+ def test_process_iso(self, KojiWrapper, get_file_size, get_mtime, Linker):
+ img_name = "FCBG.{arch}-Rawhide-1.6.iso"
+ self.repo = self.topdir + "/compose/Server/$arch/os"
+ compose = DummyCompose(
+ self.topdir,
+ {
+ "koji_profile": "koji",
+ "kiwibuild_bundle_format": "%N-%P-40_Beta-%I.%A.%T",
+ },
+ )
+ config = _merge({"subvariant": "Test"}, MINIMAL_CONF)
+ pool = mock.Mock()
+
+ get_image_paths = KojiWrapper.return_value.get_image_paths
+ get_image_paths.return_value = {
+ "x86_64": [
+ "/koji/task/1234/FCBG.x86_64-Rawhide-1.6.packages",
+ "/koji/task/1234/%s" % img_name.format(arch="x86_64"),
+ ],
+ "amd64": [
+ "/koji/task/1234/FCBG.amd64-Rawhide-1.6.packages",
+ "/koji/task/1234/%s" % img_name.format(arch="amd64"),
+ ],
+ }
+
+ KojiWrapper.return_value.koji_proxy.kiwiBuild.return_value = 1234
+ KojiWrapper.return_value.watch_task.return_value = 0
+
+ t = RunKiwiBuildThread(pool)
+ get_file_size.return_value = 1024
+ get_mtime.return_value = 13579
+ t.process(
+ (
+ compose,
+ compose.variants["Server"],
+ config,
+ ["amd64", "x86_64"],
+ {
+ "release": "1.6",
+ "target": "f40",
+ "descscm": MINIMAL_CONF["description_scm"],
+ "descpath": MINIMAL_CONF["description_path"],
+ "type": "t",
+ "type_attr": ["ta"],
+ "bundle_name_format": "fmt",
+ "version": "v",
+ "repo_releasever": "r",
+ },
+ [self.repo],
+ [],
+ ),
+ 1,
+ )
+
+ assert KojiWrapper.return_value.koji_proxy.kiwiBuild.mock_calls == [
+ mock.call(
+ "f40",
+ ["amd64", "x86_64"],
+ MINIMAL_CONF["description_scm"],
+ MINIMAL_CONF["description_path"],
+ profile=MINIMAL_CONF["kiwi_profile"],
+ release="1.6",
+ repos=[self.repo],
+ type="t",
+ type_attr=["ta"],
+ result_bundle_name_format="fmt",
+ optional_arches=[],
+ version="v",
+ repo_releasever="r",
+ )
+ ]
+
+ assert get_image_paths.mock_calls == [mock.call(1234)]
+ assert os.path.isdir(self._img_path("x86_64", dir="iso"))
+ assert os.path.isdir(self._img_path("amd64", dir="iso"))
+ Linker.return_value.link.assert_has_calls(
+ [
+ mock.call(
+ "/koji/task/1234/FCBG.amd64-Rawhide-1.6.iso",
+ self._img_path("amd64", img_name.format(arch="amd64"), dir="iso"),
+ link_type="hardlink-or-copy",
+ ),
+ mock.call(
+ "/koji/task/1234/FCBG.x86_64-Rawhide-1.6.iso",
+ self._img_path("x86_64", img_name.format(arch="x86_64"), dir="iso"),
+ link_type="hardlink-or-copy",
+ ),
+ ],
+ any_order=True,
+ )
+
+ assert len(compose.im.add.call_args_list) == 2
+ for call in compose.im.add.call_args_list:
+ _, kwargs = call
+ image = kwargs["image"]
+ expected_path = "Server/{0.arch}/iso/{1}".format(
+ image, img_name.format(arch=image.arch)
+ )
+ assert kwargs["variant"] == "Server"
+ assert kwargs["arch"] in ("amd64", "x86_64")
+ assert kwargs["arch"] == image.arch
+ assert image.path == expected_path
+ assert "iso" == image.format
+ assert "iso" == image.type
+ assert image.bootable
+ assert "Test" == image.subvariant
def test_handle_koji_fail(self, KojiWrapper, get_file_size, get_mtime, Linker):
self.repo = self.topdir + "/compose/Server/$arch/os"
From cd2ae81e3c63316997b9617ff2e30e3148af14f2 Mon Sep 17 00:00:00 2001
From: Lubomír Sedlář <lsedlar@redhat.com>
Date: Aug 29 2024 06:46:10 +0000
Subject: [PATCH 2/2] kiwibuild: Allow setting metadata type explicitly
It is not possible to reliably detect what the type for an image should
be in the metadata. This commit adds an option for user to explicitly
provide it.
It can only be configured on the specific image, not globally.
Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
---
diff --git a/doc/configuration.rst b/doc/configuration.rst
index c6f936a..ded479e 100644
--- a/doc/configuration.rst
+++ b/doc/configuration.rst
@@ -1574,6 +1574,9 @@ KiwiBuild Settings
described in :ref:`automatic versioning <auto-version>`.
* ``repo_releasever`` -- (*str*) Override default releasever of the output
image.
+ * ``manifest_type`` -- the image type that is put into the manifest by
+ pungi. If not supplied, an autodetected value will be provided. It may or
+ may not make sense.
The options can be set either for the specific image, or at the phase level
(see below). Version also falls back to ``global_version``.
diff --git a/pungi/checks.py b/pungi/checks.py
index bcf23e5..cc16d12 100644
--- a/pungi/checks.py
+++ b/pungi/checks.py
@@ -1214,6 +1214,7 @@ def make_schema():
"bundle_name_format": {"type": "string"},
"version": {"type": "string"},
"repo_releasever": {"type": "string"},
+ "manifest_type": {"type": "string"},
},
"required": [
# description_scm and description_path
diff --git a/pungi/phases/kiwibuild.py b/pungi/phases/kiwibuild.py
index 12ec26d..bb26812 100644
--- a/pungi/phases/kiwibuild.py
+++ b/pungi/phases/kiwibuild.py
@@ -211,9 +211,9 @@ class RunKiwiBuildThread(WorkerThread):
# Update image manifest
img = Image(compose.im)
- # Get the manifest type from the config if supplied, otherwise we
- # determine the manifest type based on the koji output
- img.type = type_
+ # If user configured exact type, use it, otherwise try to
+ # figure it out based on the koji output.
+ img.type = config.get("manifest_type", type_)
img.format = format_
img.path = os.path.join(rel_image_dir, filename)
img.mtime = util.get_mtime(image_dest)
diff --git a/tests/test_kiwibuildphase.py b/tests/test_kiwibuildphase.py
index 491dbf3..e3ccdb7 100644
--- a/tests/test_kiwibuildphase.py
+++ b/tests/test_kiwibuildphase.py
@@ -73,6 +73,7 @@ class TestKiwiBuildPhase(PungiTestCase):
"bundle_name_format": "fmt",
"version": "Rawhide",
"repo_releasever": "41",
+ "manifest_type": "live-kiwi",
},
MINIMAL_CONF,
)
@@ -366,7 +367,9 @@ class TestKiwiBuildThread(PungiTestCase):
"kiwibuild_bundle_format": "%N-%P-40_Beta-%I.%A.%T",
},
)
- config = _merge({"subvariant": "Test"}, MINIMAL_CONF)
+ config = _merge(
+ {"subvariant": "Test", "manifest_type": "live-kiwi"}, MINIMAL_CONF
+ )
pool = mock.Mock()
get_image_paths = KojiWrapper.return_value.get_image_paths
@@ -459,7 +462,7 @@ class TestKiwiBuildThread(PungiTestCase):
assert kwargs["arch"] == image.arch
assert image.path == expected_path
assert "iso" == image.format
- assert "iso" == image.type
+ assert "live-kiwi" == image.type
assert image.bootable
assert "Test" == image.subvariant