From 3a2e116f76240b5948ba08fe44df46945cad8c3a Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 17 Feb 2025 17:21:24 +0100 Subject: [PATCH] bib: add support for file/directory customizations This commit adds support for files/directories in blueprint customizations. This needs https://github.com/osbuild/images/pull/1227 Closes: https://github.com/osbuild/bootc-image-builder/issues/834 --- bib/cmd/bootc-image-builder/image.go | 22 +++++++++++++++ test/test_manifest.py | 40 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/bib/cmd/bootc-image-builder/image.go b/bib/cmd/bootc-image-builder/image.go index 91f53ebc..60188bda 100644 --- a/bib/cmd/bootc-image-builder/image.go +++ b/bib/cmd/bootc-image-builder/image.go @@ -22,6 +22,7 @@ import ( "github.com/osbuild/images/pkg/osbuild" "github.com/osbuild/images/pkg/pathpolicy" "github.com/osbuild/images/pkg/platform" + "github.com/osbuild/images/pkg/policies" "github.com/osbuild/images/pkg/rpmmd" "github.com/osbuild/images/pkg/runner" "github.com/sirupsen/logrus" @@ -379,6 +380,27 @@ func manifestForDiskImage(c *ManifestConfig, rng *rand.Rand) (*manifest.Manifest } img.PartitionTable = pt + // Check Directory/File Customizations are valid + dc := customizations.GetDirectories() + fc := customizations.GetFiles() + if err := blueprint.ValidateDirFileCustomizations(dc, fc); err != nil { + return nil, err + } + if err := blueprint.CheckDirectoryCustomizationsPolicy(dc, policies.OstreeCustomDirectoriesPolicies); err != nil { + return nil, err + } + if err := blueprint.CheckFileCustomizationsPolicy(fc, policies.OstreeCustomFilesPolicies); err != nil { + return nil, err + } + img.Files, err = blueprint.FileCustomizationsToFsNodeFiles(fc) + if err != nil { + return nil, err + } + img.Directories, err = blueprint.DirectoryCustomizationsToFsNodeDirectories(dc) + if err != nil { + return nil, err + } + // For the bootc-disk image, the filename is the basename and the extension // is added automatically for each disk format img.Filename = "disk" diff --git a/test/test_manifest.py b/test/test_manifest.py index 32fb90ef..1cb77337 100644 --- a/test/test_manifest.py +++ b/test/test_manifest.py @@ -779,3 +779,43 @@ def test_iso_manifest_use_librepo(build_container, use_librepo): assert "org.osbuild.librepo" in manifest["sources"] else: assert "org.osbuild.curl" in manifest["sources"] + + +def test_manifest_customization_custom_file_smoke(tmp_path, build_container): + # no need to parameterize this test, toml is the same for all containers + container_ref = "quay.io/centos-bootc/centos-bootc:stream9" + testutil.pull_container(container_ref) + + cfg = { + "blueprint": { + "customizations": { + "files": [ + { + "path": "/etc/custom_file", + "data": "hello world" + }, + ], + "directories": [ + { + "path": "/etc/custom_dir", + }, + ], + }, + }, + } + + output_path = tmp_path / "output" + output_path.mkdir(exist_ok=True) + config_json_path = output_path / "config.json" + config_json_path.write_text(json.dumps(cfg), encoding="utf-8") + + output = subprocess.check_output([ + *testutil.podman_run_common, + "-v", f"{output_path}:/output", + build_container, + "manifest", f"{container_ref}", + "--config", "/output/config.json", + ], stderr=subprocess.PIPE, encoding="utf8") + osbuild_manifest = json.loads(output) + assert '"to":"tree:///etc/custom_file"' in output + assert '{"type":"org.osbuild.mkdir","options":{"paths":[{"path":"/etc/custom_dir","exist_ok":true}]}}' in output