From faccc4d176cf5cdb8c99b35fcd5dbd7ac72619b7 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Thu, 12 Sep 2024 09:58:20 +0200 Subject: [PATCH] image: add new `gce` pipeline to `BootcDiskImage` There is a request that we provide a new image type that can be imported directly into GCE. This requires a `tar.gz` with a `disk.raw` inside and specific tar options. This commit adds the needed pipeline to generate this. Note that this will require a way to rename files during the tar build as we do not want to hardcode the raw image filename. --- pkg/image/bootc_disk.go | 14 ++++++++++++++ pkg/image/bootc_disk_test.go | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/pkg/image/bootc_disk.go b/pkg/image/bootc_disk.go index a1037e6cc..4e2df937c 100644 --- a/pkg/image/bootc_disk.go +++ b/pkg/image/bootc_disk.go @@ -3,7 +3,9 @@ package image import ( "fmt" "math/rand" + "regexp" + "github.com/osbuild/images/internal/common" "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/customizations/users" "github.com/osbuild/images/pkg/disk" @@ -89,5 +91,17 @@ func (img *BootcDiskImage) InstantiateManifestFromContainers(m *manifest.Manifes fmt.Sprintf("%s.vmdk", fileBasename), fmt.Sprintf("%s.vhd", fileBasename), } + + // XXX: copied from https://github.com/osbuild/images/blob/v0.85.0/pkg/image/disk.go#L102 + gcePipeline := manifest.NewTar(buildPipeline, rawImage, "gce") + gcePipeline.Format = osbuild.TarArchiveFormatOldgnu + gcePipeline.RootNode = osbuild.TarRootNodeOmit + // these are required to successfully import the image to GCP + gcePipeline.ACLs = common.ToPtr(false) + gcePipeline.SELinux = common.ToPtr(false) + gcePipeline.Xattrs = common.ToPtr(false) + gcePipeline.Transform = fmt.Sprintf(`s/%s/disk.raw`, regexp.QuoteMeta(rawImage.Filename())) + gcePipeline.SetFilename("image.tgz") + return nil } diff --git a/pkg/image/bootc_disk_test.go b/pkg/image/bootc_disk_test.go index f0937625e..941e0075a 100644 --- a/pkg/image/bootc_disk_test.go +++ b/pkg/image/bootc_disk_test.go @@ -201,6 +201,10 @@ func TestBootcDiskImageExportPipelines(t *testing.T) { // tar pipeline for ova tarPipeline := findPipelineFromOsbuildManifest(t, osbuildManifest, "archive") require.NotNil(tarPipeline) + + // raw-tgz pipeline + gcePipeline := findPipelineFromOsbuildManifest(t, osbuildManifest, "gce") + require.NotNil(gcePipeline) } func TestBootcDiskImageInstantiateUsers(t *testing.T) {