From 11fa3425077625e4999bfbac1b0c942972b3054a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Tue, 16 Aug 2022 14:25:43 +0200 Subject: [PATCH] createiso: Make ISO level more granular MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make it possible to set the level separately for each variant and architecture. JIRA: RHELCMP-9341 Signed-off-by: Lubomír Sedlář --- doc/configuration.rst | 4 +++- pungi/checks.py | 6 ++++-- pungi/phases/createiso.py | 14 +++++++++++++- pungi/phases/extra_isos.py | 3 ++- tests/data/dummy-pungi.conf | 6 ++++++ tests/test_createiso_phase.py | 35 +++++++++++++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 5 deletions(-) diff --git a/doc/configuration.rst b/doc/configuration.rst index 697784b8..4bf64ade 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -1286,7 +1286,9 @@ Options suffix (using multiples of 1024). **iso_level** - (*int*) [optional] -- Set the ISO9660 conformance level. Valid numbers are 1 to 4. + (*int|list*) [optional] -- Set the ISO9660 conformance level. This is + either a global single value (a number from 1 to 4), or a variant/arch + mapping. **split_iso_reserve** = 10MiB (*int|str*) -- how much free space should be left on each disk. The format diff --git a/pungi/checks.py b/pungi/checks.py index 6d4465ed..14ad674e 100644 --- a/pungi/checks.py +++ b/pungi/checks.py @@ -760,8 +760,10 @@ def make_schema(): "createiso_break_hardlinks": {"type": "boolean", "default": False}, "createiso_use_xorrisofs": {"type": "boolean", "default": False}, "iso_level": { - "type": "number", - "enum": [1, 2, 3, 4], + "anyOf": [ + {"type": "number", "enum": [1, 2, 3, 4]}, + _variant_arch_mapping({"type": "number", "enum": [1, 2, 3, 4]}), + ], }, "iso_hfs_ppc64le_compatible": {"type": "boolean", "default": True}, "multilib": _variant_arch_mapping( diff --git a/pungi/phases/createiso.py b/pungi/phases/createiso.py index 722cfb04..481d38fb 100644 --- a/pungi/phases/createiso.py +++ b/pungi/phases/createiso.py @@ -338,7 +338,7 @@ class CreateisoPhase(PhaseLoggerMixin, PhaseBase): supported=self.compose.supported, hfs_compat=self.compose.conf["iso_hfs_ppc64le_compatible"], use_xorrisofs=self.compose.conf.get("createiso_use_xorrisofs"), - iso_level=self.compose.conf.get("iso_level"), + iso_level=get_iso_level_config(self.compose, variant, arch), ) if bootable: @@ -821,3 +821,15 @@ class OldFileLinker(object): """Clean up all files created by this instance.""" for f in self.linked_files: os.unlink(f) + + +def get_iso_level_config(compose, variant, arch): + """ + Get configured ISO level for this variant and architecture. + """ + level = compose.conf.get("iso_level") + if isinstance(level, list): + level = None + for c in get_arch_variant_data(compose.conf, "iso_level", arch, variant): + level = c + return level diff --git a/pungi/phases/extra_isos.py b/pungi/phases/extra_isos.py index 45d06b63..2f1d9964 100644 --- a/pungi/phases/extra_isos.py +++ b/pungi/phases/extra_isos.py @@ -32,6 +32,7 @@ from pungi.phases.createiso import ( load_and_tweak_treeinfo, compare_packages, OldFileLinker, + get_iso_level_config, ) from pungi.util import ( failable, @@ -130,7 +131,7 @@ class ExtraIsosThread(WorkerThread): supported=compose.supported, hfs_compat=compose.conf["iso_hfs_ppc64le_compatible"], use_xorrisofs=compose.conf.get("createiso_use_xorrisofs"), - iso_level=compose.conf.get("iso_level"), + iso_level=get_iso_level_config(compose, variant, arch), ) os_tree = compose.paths.compose.os_tree(arch, variant) if compose.conf["create_jigdo"]: diff --git a/tests/data/dummy-pungi.conf b/tests/data/dummy-pungi.conf index d27423d4..f7e56388 100644 --- a/tests/data/dummy-pungi.conf +++ b/tests/data/dummy-pungi.conf @@ -109,3 +109,9 @@ extra_isos = { 'filename': 'extra-{filename}', }] } + +iso_level = [ + (".*", { + "src": 3, + }), +] diff --git a/tests/test_createiso_phase.py b/tests/test_createiso_phase.py index 538cfb2e..f71a45c0 100644 --- a/tests/test_createiso_phase.py +++ b/tests/test_createiso_phase.py @@ -1554,3 +1554,38 @@ class CreateisoPerformReusePhaseTest(helpers.PungiTestCase): mock.call.abort(), ], ) + + +class ComposeConfGetIsoLevelTest(helpers.PungiTestCase): + def test_global_config(self): + compose = helpers.DummyCompose(self.topdir, {"iso_level": 3}) + + self.assertEqual( + createiso.get_iso_level_config( + compose, compose.variants["Server"], "x86_64" + ), + 3, + ) + + def test_src_only_config(self): + compose = helpers.DummyCompose( + self.topdir, + {"iso_level": [(".*", {"src": 4})]}, + ) + + self.assertEqual( + createiso.get_iso_level_config(compose, compose.variants["Server"], "src"), + 4, + ) + + def test_no_match(self): + compose = helpers.DummyCompose( + self.topdir, + {"iso_level": [("^Server$", {"*": 4})]}, + ) + + self.assertIsNone( + createiso.get_iso_level_config( + compose, compose.variants["Client"], "x86_64" + ), + )