From 1a063680b5f326896b6bdc5608ad8bfb950134fe Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Mon, 23 Aug 2021 16:02:16 +0000 Subject: [PATCH] distro/rhel85: add support for edge raw images OSBuild Composer can now build the RHEL 8.5 Raw Images. This images are compressed raw images, i.e. a file that has a partition layout with an deployed OSTree commit in it. It can be used to flash onto a hard drive or booted in a virtual machine. An existing OSTree commit needs to be provided. The following image new types are supported: edge-raw-image. --- .../unreleased/rhel8.5-edge-raw-images.md | 10 +++++++ internal/distro/rhel85/distro.go | 29 +++++++++++++++++-- internal/distro/rhel85/distro_test.go | 14 +++++---- internal/distro/rhel85/package_sets.go | 6 ++++ internal/distro/rhel85/pipelines.go | 17 +++++++++++ internal/store/json.go | 3 ++ 6 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 docs/news/unreleased/rhel8.5-edge-raw-images.md diff --git a/docs/news/unreleased/rhel8.5-edge-raw-images.md b/docs/news/unreleased/rhel8.5-edge-raw-images.md new file mode 100644 index 000000000..d8d40f3e5 --- /dev/null +++ b/docs/news/unreleased/rhel8.5-edge-raw-images.md @@ -0,0 +1,10 @@ +# Add RHEL for Edge Raw Images for 8.5 + +OSBuild Composer can now build the RHEL 8.5 Raw Images. This images are +compressed raw images, i.e. a file that has a partition layout with an +deployed OSTree commit in it. It can be used to flash onto a hard drive +or booted in a virtual machine. An existing OSTree commit needs to +be provided. +The following image new types are supported: edge-raw-image. + +Relevant PR: https://github.com/osbuild/osbuild-composer/pull/1667 diff --git a/internal/distro/rhel85/distro.go b/internal/distro/rhel85/distro.go index cd883b42b..be1a00eaf 100644 --- a/internal/distro/rhel85/distro.go +++ b/internal/distro/rhel85/distro.go @@ -420,7 +420,11 @@ func (t *imageType) checkOptions(customizations *blueprint.Customizations, optio } } - if kernelOpts := customizations.GetKernel(); kernelOpts.Append != "" && t.rpmOstree { + if t.name == "edge-raw-image" && options.OSTree.Parent == "" { + return fmt.Errorf("edge raw images require specifying a URL from which to retrieve the OSTree commit") + } + + if kernelOpts := customizations.GetKernel(); kernelOpts.Append != "" && t.rpmOstree && (!t.bootable || t.bootISO) { return fmt.Errorf("kernel boot parameter customizations are not supported for ostree types") } @@ -515,6 +519,7 @@ func newDistro(name, modulePlatformID, ostreeRef string) distro.Distro { pipelines: edgeCommitPipelines, exports: []string{"commit-archive"}, } + edgeOCIImgType := imageType{ name: "edge-container", nameAliases: []string{"rhel-edge-container"}, @@ -535,6 +540,24 @@ func newDistro(name, modulePlatformID, ostreeRef string) distro.Distro { pipelines: edgeContainerPipelines, exports: []string{"container"}, } + + edgeRawImgType := imageType{ + name: "edge-raw-image", + nameAliases: []string{"rhel-edge-raw-image"}, + filename: "image.raw.xz", + mimeType: "application/xz", + packageSets: map[string]packageSetFunc{ + buildPkgsKey: edgeRawImageBuildPackageSet, + }, + defaultSize: 10 * GigaByte, + rpmOstree: true, + bootable: true, + bootISO: false, + pipelines: edgeRawImagePipelines, + exports: []string{"archive"}, + basePartitionTables: edgeBasePartitionTables, + } + edgeInstallerImgType := imageType{ name: "edge-installer", nameAliases: []string{"rhel-edge-installer"}, @@ -793,8 +816,8 @@ func newDistro(name, modulePlatformID, ostreeRef string) distro.Distro { exports: []string{"bootiso"}, } - x86_64.addImageTypes(qcow2ImgType, vhdImgType, vmdkImgType, openstackImgType, amiImgTypeX86_64, ec2ImgTypeX86_64, ec2HaImgTypeX86_64, tarImgType, tarInstallerImgTypeX86_64, edgeCommitImgType, edgeInstallerImgType, edgeOCIImgType, edgeSimplifiedInstallerImgType) - aarch64.addImageTypes(qcow2ImgType, openstackImgType, amiImgTypeAarch64, ec2ImgTypeAarch64, tarImgType, edgeCommitImgType, edgeInstallerImgType, edgeOCIImgType, edgeSimplifiedInstallerImgType) + x86_64.addImageTypes(qcow2ImgType, vhdImgType, vmdkImgType, openstackImgType, amiImgTypeX86_64, ec2ImgTypeX86_64, ec2HaImgTypeX86_64, tarImgType, tarInstallerImgTypeX86_64, edgeCommitImgType, edgeInstallerImgType, edgeOCIImgType, edgeRawImgType, edgeSimplifiedInstallerImgType) + aarch64.addImageTypes(qcow2ImgType, openstackImgType, amiImgTypeAarch64, ec2ImgTypeAarch64, tarImgType, edgeCommitImgType, edgeInstallerImgType, edgeOCIImgType, edgeRawImgType, edgeSimplifiedInstallerImgType) ppc64le.addImageTypes(qcow2ImgType, tarImgType) s390x.addImageTypes(qcow2ImgType, tarImgType) diff --git a/internal/distro/rhel85/distro_test.go b/internal/distro/rhel85/distro_test.go index 5eb8298ef..cc03e6d69 100644 --- a/internal/distro/rhel85/distro_test.go +++ b/internal/distro/rhel85/distro_test.go @@ -417,6 +417,8 @@ func TestDistro_ManifestError(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, imgOpts, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") + } else if imgTypeName == "edge-raw-image" { + assert.EqualError(t, err, "edge raw images require specifying a URL from which to retrieve the OSTree commit") } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { assert.EqualError(t, err, fmt.Sprintf("boot ISO image type \"%s\" requires specifying a URL from which to retrieve the OSTree commit", imgTypeName)) } else { @@ -445,6 +447,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { "edge-commit", "edge-container", "edge-installer", + "edge-raw-image", "edge-simplified-installer", "tar", "image-installer", @@ -461,6 +464,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { "edge-container", "edge-installer", "edge-simplified-installer", + "edge-raw-image", "tar", }, }, @@ -577,7 +581,7 @@ func TestDistro_CustomFileSystemManifestError(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { + } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" || imgTypeName == "edge-raw-image" { continue } else { assert.EqualError(t, err, "The following custom mountpoints are not supported [\"/boot\"]") @@ -605,7 +609,7 @@ func TestDistro_TestRootMountPoint(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { + } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" || imgTypeName == "edge-raw-image" { continue } else { assert.NoError(t, err) @@ -633,7 +637,7 @@ func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { + } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" || imgTypeName == "edge-raw-image" { continue } else { assert.NoError(t, err) @@ -661,7 +665,7 @@ func TestDistro_CustomFileSystemPatternMatching(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { + } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" || imgTypeName == "edge-raw-image" { continue } else { assert.EqualError(t, err, "The following custom mountpoints are not supported [\"/variable\"]") @@ -689,7 +693,7 @@ func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "edge-commit" || imgTypeName == "edge-container" { assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" { + } else if imgTypeName == "edge-installer" || imgTypeName == "edge-simplified-installer" || imgTypeName == "edge-raw-image" { continue } else { assert.NoError(t, err) diff --git a/internal/distro/rhel85/package_sets.go b/internal/distro/rhel85/package_sets.go index 04a0d308a..b7bd76723 100644 --- a/internal/distro/rhel85/package_sets.go +++ b/internal/distro/rhel85/package_sets.go @@ -65,6 +65,12 @@ func edgeBuildPackageSet(t *imageType) rpmmd.PackageSet { }) } +func edgeRawImageBuildPackageSet(t *imageType) rpmmd.PackageSet { + return edgeBuildPackageSet(t).Append( + bootPackageSet(t), + ) +} + // installer boot package sets, needed for booting and // also in the build host diff --git a/internal/distro/rhel85/pipelines.go b/internal/distro/rhel85/pipelines.go index ad87e7ff7..db817f921 100644 --- a/internal/distro/rhel85/pipelines.go +++ b/internal/distro/rhel85/pipelines.go @@ -593,6 +593,23 @@ func edgeImagePipelines(t *imageType, filename string, options distro.ImageOptio return pipelines, xzPipeline.Name, nil } +func edgeRawImagePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) { + pipelines := make([]osbuild.Pipeline, 0) + pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey])) + + imgName := t.filename + + // create the raw image + imagePipelines, _, err := edgeImagePipelines(t, imgName, options, rng) + if err != nil { + return nil, err + } + + pipelines = append(pipelines, imagePipelines...) + + return pipelines, nil +} + func buildPipeline(repos []rpmmd.RepoConfig, buildPackageSpecs []rpmmd.PackageSpec) *osbuild.Pipeline { p := new(osbuild.Pipeline) p.Name = "build" diff --git a/internal/store/json.go b/internal/store/json.go index c36d7a44e..7c84277ff 100644 --- a/internal/store/json.go +++ b/internal/store/json.go @@ -353,10 +353,13 @@ var imageTypeCompatMapping = map[string]string{ "rhel-edge-commit": "rhel-edge-commit", "rhel-edge-container": "rhel-edge-container", "rhel-edge-installer": "rhel-edge-installer", + "rhel-raw-image": "rhel-raw-image", + "rhel-edge-raw-image": "rhel-edge-raw-image", "rhel-edge-simplified-installer": "rhel-edge-simplified-installer", "edge-commit": "edge-commit", "edge-container": "edge-container", "edge-installer": "edge-installer", + "edge-raw-image": "edge-raw-image", "edge-simplified-installer": "edge-simplified-installer", "image-installer": "image-installer", "test_type": "test_type", // used only in json_test.go