From 5d951a7fd8100d7b53c6def8a01e741deed41992 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 1 Dec 2023 17:22:42 +0100 Subject: [PATCH] many: add new (optional) manifest.BuildOptions to manifest.NewBuild() --- cmd/osbuild-playground/my-container.go | 2 +- cmd/osbuild-playground/my-image.go | 2 +- pkg/image/anaconda_live_installer.go | 2 +- pkg/image/anaconda_ostree_installer.go | 2 +- pkg/image/anaconda_tar_installer.go | 2 +- pkg/image/archive.go | 2 +- pkg/image/container.go | 2 +- pkg/image/disk.go | 2 +- pkg/image/export_test.go | 2 +- pkg/image/ostree_archive.go | 2 +- pkg/image/ostree_container.go | 2 +- pkg/image/ostree_disk.go | 3 +-- pkg/image/ostree_disk_test.go | 14 ++++++++------ pkg/image/ostree_simplified_installer.go | 2 +- pkg/manifest/build.go | 17 +++++++++++++---- pkg/manifest/build_test.go | 4 ++-- pkg/manifest/os_test.go | 2 +- 17 files changed, 37 insertions(+), 27 deletions(-) diff --git a/cmd/osbuild-playground/my-container.go b/cmd/osbuild-playground/my-container.go index f59527d8cb..d8c22c7af7 100644 --- a/cmd/osbuild-playground/my-container.go +++ b/cmd/osbuild-playground/my-container.go @@ -46,7 +46,7 @@ func (img *MyContainer) InstantiateManifest(m *manifest.Manifest, // Let's create a simple OCI container! // configure a build pipeline - build := manifest.NewBuild(m, runner, repos) + build := manifest.NewBuild(m, runner, repos, nil) build.Checkpoint() // create a minimal non-bootable OS tree diff --git a/cmd/osbuild-playground/my-image.go b/cmd/osbuild-playground/my-image.go index de8a0b4e02..f2e2d7c52a 100644 --- a/cmd/osbuild-playground/my-image.go +++ b/cmd/osbuild-playground/my-image.go @@ -30,7 +30,7 @@ func (img *MyImage) InstantiateManifest(m *manifest.Manifest, // Let's create a simple raw image! // configure a build pipeline - build := manifest.NewBuild(m, runner, repos) + build := manifest.NewBuild(m, runner, repos, nil) build.Checkpoint() // create an x86_64 platform with bios boot diff --git a/pkg/image/anaconda_live_installer.go b/pkg/image/anaconda_live_installer.go index 2487e16b69..97bcea7420 100644 --- a/pkg/image/anaconda_live_installer.go +++ b/pkg/image/anaconda_live_installer.go @@ -46,7 +46,7 @@ func (img *AnacondaLiveInstaller) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() livePipeline := manifest.NewAnacondaInstaller(m, diff --git a/pkg/image/anaconda_ostree_installer.go b/pkg/image/anaconda_ostree_installer.go index 8c848d5e2a..bea9c13a7c 100644 --- a/pkg/image/anaconda_ostree_installer.go +++ b/pkg/image/anaconda_ostree_installer.go @@ -53,7 +53,7 @@ func (img *AnacondaOSTreeInstaller) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() anacondaPipeline := manifest.NewAnacondaInstaller(m, diff --git a/pkg/image/anaconda_tar_installer.go b/pkg/image/anaconda_tar_installer.go index 1af4df360a..83c073e927 100644 --- a/pkg/image/anaconda_tar_installer.go +++ b/pkg/image/anaconda_tar_installer.go @@ -63,7 +63,7 @@ func (img *AnacondaTarInstaller) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() anacondaPipeline := manifest.NewAnacondaInstaller(m, diff --git a/pkg/image/archive.go b/pkg/image/archive.go index edf30a0a9d..85767c05de 100644 --- a/pkg/image/archive.go +++ b/pkg/image/archive.go @@ -31,7 +31,7 @@ func (img *Archive) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() osPipeline := manifest.NewOS(m, buildPipeline, img.Platform, repos) diff --git a/pkg/image/container.go b/pkg/image/container.go index c967ea5967..977feab520 100644 --- a/pkg/image/container.go +++ b/pkg/image/container.go @@ -31,7 +31,7 @@ func (img *BaseContainer) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() osPipeline := manifest.NewOS(m, buildPipeline, img.Platform, repos) diff --git a/pkg/image/disk.go b/pkg/image/disk.go index 2669ed1287..45f5b30790 100644 --- a/pkg/image/disk.go +++ b/pkg/image/disk.go @@ -49,7 +49,7 @@ func (img *DiskImage) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() osPipeline := manifest.NewOS(m, buildPipeline, img.Platform, repos) diff --git a/pkg/image/export_test.go b/pkg/image/export_test.go index dfef80edc4..93365875cb 100644 --- a/pkg/image/export_test.go +++ b/pkg/image/export_test.go @@ -6,7 +6,7 @@ import ( "github.com/osbuild/images/pkg/runner" ) -func MockManifestNewBuild(new func(m *manifest.Manifest, runner runner.Runner, repos []rpmmd.RepoConfig) *manifest.Build) (restore func()) { +func MockManifestNewBuild(new func(m *manifest.Manifest, runner runner.Runner, repos []rpmmd.RepoConfig, opts *manifest.BuildOptions) *manifest.Build) (restore func()) { saved := manifestNewBuild manifestNewBuild = new return func() { diff --git a/pkg/image/ostree_archive.go b/pkg/image/ostree_archive.go index d0deff6ee5..5cd02dddcf 100644 --- a/pkg/image/ostree_archive.go +++ b/pkg/image/ostree_archive.go @@ -47,7 +47,7 @@ func (img *OSTreeArchive) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() osPipeline := manifest.NewOS(m, buildPipeline, img.Platform, repos) diff --git a/pkg/image/ostree_container.go b/pkg/image/ostree_container.go index 75373e31f2..16e2f7ef23 100644 --- a/pkg/image/ostree_container.go +++ b/pkg/image/ostree_container.go @@ -44,7 +44,7 @@ func (img *OSTreeContainer) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() osPipeline := manifest.NewOS(m, buildPipeline, img.Platform, repos) diff --git a/pkg/image/ostree_disk.go b/pkg/image/ostree_disk.go index e14a021c42..ca418a3139 100644 --- a/pkg/image/ostree_disk.go +++ b/pkg/image/ostree_disk.go @@ -113,8 +113,7 @@ func (img *OSTreeDiskImage) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifestNewBuild(m, runner, repos) - buildPipeline.ContainerBuildable = img.ContainerBuildable + buildPipeline := manifestNewBuild(m, runner, repos, &manifest.BuildOptions{ContainerBuildable: img.ContainerBuildable}) buildPipeline.Checkpoint() // don't support compressing non-raw images diff --git a/pkg/image/ostree_disk_test.go b/pkg/image/ostree_disk_test.go index 332bcf9321..3e2ba379b7 100644 --- a/pkg/image/ostree_disk_test.go +++ b/pkg/image/ostree_disk_test.go @@ -27,14 +27,16 @@ func TestOSTreeDiskImageManifestSetsContainerBuildable(t *testing.T) { Name: "name", } - var buildPipeline *manifest.Build - restore := image.MockManifestNewBuild(func(m *manifest.Manifest, r runner.Runner, repos []rpmmd.RepoConfig) *manifest.Build { - buildPipeline = manifest.NewBuild(m, r, repos) - return buildPipeline + var buildOpts []*manifest.BuildOptions + restore := image.MockManifestNewBuild(func(m *manifest.Manifest, r runner.Runner, repos []rpmmd.RepoConfig, opts *manifest.BuildOptions) *manifest.Build { + buildOpts = append(buildOpts, opts) + return manifest.NewBuild(m, r, repos, opts) }) defer restore() for _, containerBuildable := range []bool{true, false} { + buildOpts = nil + mf := manifest.New() img := image.NewOSTreeDiskImageFromContainer(containerSource, ref) require.NotNil(t, img) @@ -52,8 +54,8 @@ func TestOSTreeDiskImageManifestSetsContainerBuildable(t *testing.T) { _, err := img.InstantiateManifest(&mf, repos, r, rng) require.Nil(t, err) require.NotNil(t, img) - require.NotNil(t, buildPipeline) - require.Equal(t, buildPipeline.ContainerBuildable, containerBuildable) + require.Equal(t, len(buildOpts), 1) + require.Equal(t, buildOpts[0].ContainerBuildable, containerBuildable) } } diff --git a/pkg/image/ostree_simplified_installer.go b/pkg/image/ostree_simplified_installer.go index 619197f217..9d1b9699e2 100644 --- a/pkg/image/ostree_simplified_installer.go +++ b/pkg/image/ostree_simplified_installer.go @@ -73,7 +73,7 @@ func (img *OSTreeSimplifiedInstaller) InstantiateManifest(m *manifest.Manifest, repos []rpmmd.RepoConfig, runner runner.Runner, rng *rand.Rand) (*artifact.Artifact, error) { - buildPipeline := manifest.NewBuild(m, runner, repos) + buildPipeline := manifest.NewBuild(m, runner, repos, nil) buildPipeline.Checkpoint() imageFilename := "image.raw.xz" diff --git a/pkg/manifest/build.go b/pkg/manifest/build.go index b0437252a7..05b532f5f5 100644 --- a/pkg/manifest/build.go +++ b/pkg/manifest/build.go @@ -23,21 +23,30 @@ type Build struct { repos []rpmmd.RepoConfig packageSpecs []rpmmd.PackageSpec - // TODO: make private? - // Container buildable tweaks the buildroot to be container friendly, + containerBuildable bool +} + +type BuildOptions struct { + // ContainerBuildable tweaks the buildroot to be container friendly, // i.e. to not rely on an installed osbuild-selinux ContainerBuildable bool } // NewBuild creates a new build pipeline from the repositories in repos // and the specified packages. -func NewBuild(m *Manifest, runner runner.Runner, repos []rpmmd.RepoConfig) *Build { +func NewBuild(m *Manifest, runner runner.Runner, repos []rpmmd.RepoConfig, opts *BuildOptions) *Build { + if opts == nil { + opts = &BuildOptions{} + } + name := "build" pipeline := &Build{ Base: NewBase(m, name, nil), runner: runner, dependents: make([]Pipeline, 0), repos: filterRepos(repos, name), + + containerBuildable: opts.ContainerBuildable, } m.addPipeline(pipeline) return pipeline @@ -114,7 +123,7 @@ func (p *Build) getSELinuxLabels() map[string]string { switch pkg.Name { case "coreutils": labels["/usr/bin/cp"] = "system_u:object_r:install_exec_t:s0" - if p.ContainerBuildable { + if p.containerBuildable { labels["/usr/bin/mount"] = "system_u:object_r:install_exec_t:s0" labels["/usr/bin/umount"] = "system_u:object_r:install_exec_t:s0" } diff --git a/pkg/manifest/build_test.go b/pkg/manifest/build_test.go index 5b74b071bc..4b97c31b13 100644 --- a/pkg/manifest/build_test.go +++ b/pkg/manifest/build_test.go @@ -14,7 +14,7 @@ func TestBuildContainerBuildableNo(t *testing.T) { mf := New() runner := &runner.Fedora{Version: 39} - build := NewBuild(&mf, runner, repos) + build := NewBuild(&mf, runner, repos, nil) require.NotNil(t, build) for _, tc := range []struct { @@ -76,7 +76,7 @@ func TestBuildContainerBuildableNo(t *testing.T) { }, } { build.packageSpecs = tc.packageSpec - build.ContainerBuildable = tc.containerBuildable + build.containerBuildable = tc.containerBuildable labels := build.getSELinuxLabels() require.Equal(t, labels, tc.expectedSELinuxLabels) diff --git a/pkg/manifest/os_test.go b/pkg/manifest/os_test.go index 93d2a145df..68ce1d5757 100644 --- a/pkg/manifest/os_test.go +++ b/pkg/manifest/os_test.go @@ -18,7 +18,7 @@ func NewTestOS() *OS { repos := []rpmmd.RepoConfig{} manifest := New() runner := &runner.Fedora{Version: 37} - build := NewBuild(&manifest, runner, repos) + build := NewBuild(&manifest, runner, repos, nil) build.Checkpoint() // create an x86_64 platform with bios boot