The gceX86 platform embeds the X86 platform and overrides the
GetPackages() method to exclude the grub2-pc package.
The gce image is built as UEFI only, does not include 'grub2-pc', but we
enable BIOS in the platform config for all the other side-effects: grub
config options and grub2.inst stage.
See the image type documentation for more information:
d12d9674d6/image-types/rhel8/google-gce.md (rhel-8-byosrhui--rhel-9-byos-image-differences-compared-to-googles-image)
476 lines
10 KiB
Go
476 lines
10 KiB
Go
package rhel8
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/osbuild/osbuild-composer/internal/common"
|
|
"github.com/osbuild/osbuild-composer/internal/distro"
|
|
"github.com/osbuild/osbuild-composer/internal/osbuild"
|
|
"github.com/osbuild/osbuild-composer/internal/oscap"
|
|
"github.com/osbuild/osbuild-composer/internal/platform"
|
|
"github.com/osbuild/osbuild-composer/internal/runner"
|
|
)
|
|
|
|
var (
|
|
// rhel8 allow all
|
|
oscapProfileAllowList = []oscap.Profile{
|
|
oscap.AnssiBp28Enhanced,
|
|
oscap.AnssiBp28High,
|
|
oscap.AnssiBp28Intermediary,
|
|
oscap.AnssiBp28Minimal,
|
|
oscap.Cis,
|
|
oscap.CisServerL1,
|
|
oscap.CisWorkstationL1,
|
|
oscap.CisWorkstationL2,
|
|
oscap.Cui,
|
|
oscap.E8,
|
|
oscap.Hippa,
|
|
oscap.IsmO,
|
|
oscap.Ospp,
|
|
oscap.PciDss,
|
|
oscap.Stig,
|
|
oscap.StigGui,
|
|
}
|
|
)
|
|
|
|
type distribution struct {
|
|
name string
|
|
product string
|
|
osVersion string
|
|
releaseVersion string
|
|
modulePlatformID string
|
|
vendor string
|
|
ostreeRefTmpl string
|
|
isolabelTmpl string
|
|
runner runner.Runner
|
|
arches map[string]distro.Arch
|
|
defaultImageConfig *distro.ImageConfig
|
|
}
|
|
|
|
// RHEL-based OS image configuration defaults
|
|
var defaultDistroImageConfig = &distro.ImageConfig{
|
|
Timezone: common.ToPtr("America/New_York"),
|
|
Locale: common.ToPtr("en_US.UTF-8"),
|
|
Sysconfig: []*osbuild.SysconfigStageOptions{
|
|
{
|
|
Kernel: &osbuild.SysconfigKernelOptions{
|
|
UpdateDefault: true,
|
|
DefaultKernel: "kernel",
|
|
},
|
|
Network: &osbuild.SysconfigNetworkOptions{
|
|
Networking: true,
|
|
NoZeroConf: true,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
func (d *distribution) Name() string {
|
|
return d.name
|
|
}
|
|
|
|
func (d *distribution) Releasever() string {
|
|
return d.releaseVersion
|
|
}
|
|
|
|
func (d *distribution) ModulePlatformID() string {
|
|
return d.modulePlatformID
|
|
}
|
|
|
|
func (d *distribution) OSTreeRef() string {
|
|
return d.ostreeRefTmpl
|
|
}
|
|
|
|
func (d *distribution) ListArches() []string {
|
|
archNames := make([]string, 0, len(d.arches))
|
|
for name := range d.arches {
|
|
archNames = append(archNames, name)
|
|
}
|
|
sort.Strings(archNames)
|
|
return archNames
|
|
}
|
|
|
|
func (d *distribution) GetArch(name string) (distro.Arch, error) {
|
|
arch, exists := d.arches[name]
|
|
if !exists {
|
|
return nil, errors.New("invalid architecture: " + name)
|
|
}
|
|
return arch, nil
|
|
}
|
|
|
|
func (d *distribution) addArches(arches ...architecture) {
|
|
if d.arches == nil {
|
|
d.arches = map[string]distro.Arch{}
|
|
}
|
|
|
|
// Do not make copies of architectures, as opposed to image types,
|
|
// because architecture definitions are not used by more than a single
|
|
// distro definition.
|
|
for idx := range arches {
|
|
d.arches[arches[idx].name] = &arches[idx]
|
|
}
|
|
}
|
|
|
|
func (d *distribution) isRHEL() bool {
|
|
return strings.HasPrefix(d.name, "rhel")
|
|
}
|
|
|
|
func (d *distribution) getDefaultImageConfig() *distro.ImageConfig {
|
|
return d.defaultImageConfig
|
|
}
|
|
|
|
// New creates a new distro object, defining the supported architectures and image types
|
|
func New() distro.Distro {
|
|
// default minor: create default minor version (current GA) and rename it
|
|
d := newDistro("rhel", 6)
|
|
d.name = "rhel-8"
|
|
return d
|
|
|
|
}
|
|
|
|
func NewRHEL84() distro.Distro {
|
|
return newDistro("rhel", 4)
|
|
}
|
|
|
|
func NewRHEL85() distro.Distro {
|
|
return newDistro("rhel", 5)
|
|
}
|
|
|
|
func NewRHEL86() distro.Distro {
|
|
return newDistro("rhel", 6)
|
|
}
|
|
|
|
func NewRHEL87() distro.Distro {
|
|
return newDistro("rhel", 7)
|
|
}
|
|
|
|
func NewRHEL88() distro.Distro {
|
|
return newDistro("rhel", 8)
|
|
}
|
|
|
|
func NewCentos() distro.Distro {
|
|
return newDistro("centos", 0)
|
|
}
|
|
|
|
func newDistro(name string, minor int) *distribution {
|
|
var rd distribution
|
|
switch name {
|
|
case "rhel":
|
|
rd = distribution{
|
|
name: fmt.Sprintf("rhel-8%d", minor),
|
|
product: "Red Hat Enterprise Linux",
|
|
osVersion: fmt.Sprintf("8.%d", minor),
|
|
releaseVersion: "8",
|
|
modulePlatformID: "platform:el8",
|
|
vendor: "redhat",
|
|
ostreeRefTmpl: "rhel/8/%s/edge",
|
|
isolabelTmpl: fmt.Sprintf("RHEL-8-%d-0-BaseOS-%%s", minor),
|
|
runner: &runner.RHEL{Major: uint64(8), Minor: uint64(minor)},
|
|
defaultImageConfig: defaultDistroImageConfig,
|
|
}
|
|
case "centos":
|
|
rd = distribution{
|
|
name: "centos-8",
|
|
product: "CentOS Stream",
|
|
osVersion: "8-stream",
|
|
releaseVersion: "8",
|
|
modulePlatformID: "platform:el8",
|
|
vendor: "centos",
|
|
ostreeRefTmpl: "centos/8/%s/edge",
|
|
isolabelTmpl: "CentOS-Stream-8-%s-dvd",
|
|
runner: &runner.CentOS{Version: uint64(8)},
|
|
defaultImageConfig: defaultDistroImageConfig,
|
|
}
|
|
default:
|
|
panic(fmt.Sprintf("unknown distro name: %s", name))
|
|
}
|
|
|
|
// Architecture definitions
|
|
x86_64 := architecture{
|
|
name: distro.X86_64ArchName,
|
|
distro: &rd,
|
|
legacy: "i386-pc",
|
|
bootType: distro.HybridBootType,
|
|
}
|
|
|
|
aarch64 := architecture{
|
|
name: distro.Aarch64ArchName,
|
|
distro: &rd,
|
|
bootType: distro.UEFIBootType,
|
|
}
|
|
|
|
ppc64le := architecture{
|
|
distro: &rd,
|
|
name: distro.Ppc64leArchName,
|
|
legacy: "powerpc-ieee1275",
|
|
bootType: distro.LegacyBootType,
|
|
}
|
|
s390x := architecture{
|
|
distro: &rd,
|
|
name: distro.S390xArchName,
|
|
bootType: distro.LegacyBootType,
|
|
}
|
|
|
|
ociImgType := qcow2ImgType(rd)
|
|
ociImgType.name = "oci"
|
|
|
|
x86_64.addImageTypes(
|
|
&platform.X86{
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
QCOW2Compat: "0.10",
|
|
},
|
|
},
|
|
qcow2ImgType(rd),
|
|
ociImgType,
|
|
)
|
|
|
|
x86_64.addImageTypes(
|
|
&platform.X86{
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
},
|
|
},
|
|
openstackImgType(),
|
|
)
|
|
|
|
rawX86Platform := &platform.X86{
|
|
BIOS: true,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_RAW,
|
|
},
|
|
}
|
|
|
|
x86_64.addImageTypes(
|
|
rawX86Platform,
|
|
amiImgTypeX86_64(rd),
|
|
)
|
|
|
|
bareMetalX86Platform := &platform.X86{
|
|
BasePlatform: platform.BasePlatform{
|
|
FirmwarePackages: []string{
|
|
"microcode_ctl", // ??
|
|
"iwl1000-firmware",
|
|
"iwl100-firmware",
|
|
"iwl105-firmware",
|
|
"iwl135-firmware",
|
|
"iwl2000-firmware",
|
|
"iwl2030-firmware",
|
|
"iwl3160-firmware",
|
|
"iwl5000-firmware",
|
|
"iwl5150-firmware",
|
|
"iwl6050-firmware",
|
|
},
|
|
},
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
}
|
|
|
|
x86_64.addImageTypes(
|
|
bareMetalX86Platform,
|
|
edgeOCIImgType(rd),
|
|
edgeCommitImgType(rd),
|
|
edgeInstallerImgType(rd),
|
|
imageInstaller(),
|
|
)
|
|
|
|
// TODO: review requirement for platform with overridden packages for GCE
|
|
gceX86Platform := &gceX86{
|
|
X86: platform.X86{
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_GCE,
|
|
},
|
|
},
|
|
}
|
|
|
|
x86_64.addImageTypes(
|
|
gceX86Platform,
|
|
gceImgType(rd),
|
|
)
|
|
|
|
x86_64.addImageTypes(
|
|
&platform.X86{
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_VMDK,
|
|
},
|
|
},
|
|
vmdkImgType(),
|
|
)
|
|
|
|
x86_64.addImageTypes(
|
|
&platform.X86{},
|
|
tarImgType(),
|
|
)
|
|
|
|
aarch64.addImageTypes(
|
|
&platform.Aarch64{
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
QCOW2Compat: "0.10",
|
|
},
|
|
},
|
|
qcow2ImgType(rd),
|
|
)
|
|
|
|
aarch64.addImageTypes(
|
|
&platform.Aarch64{
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
},
|
|
},
|
|
openstackImgType(),
|
|
)
|
|
|
|
aarch64.addImageTypes(
|
|
&platform.Aarch64{},
|
|
tarImgType(),
|
|
)
|
|
|
|
bareMetalAarch64Platform := &platform.Aarch64{
|
|
BasePlatform: platform.BasePlatform{},
|
|
UEFIVendor: rd.vendor,
|
|
}
|
|
|
|
aarch64.addImageTypes(
|
|
bareMetalAarch64Platform,
|
|
edgeOCIImgType(rd),
|
|
edgeCommitImgType(rd),
|
|
edgeInstallerImgType(rd),
|
|
imageInstaller(),
|
|
)
|
|
|
|
rawAarch64Platform := &platform.Aarch64{
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_RAW,
|
|
},
|
|
}
|
|
|
|
aarch64.addImageTypes(
|
|
rawAarch64Platform,
|
|
amiImgTypeAarch64(rd),
|
|
)
|
|
|
|
ppc64le.addImageTypes(
|
|
&platform.PPC64LE{
|
|
BIOS: true,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
QCOW2Compat: "0.10",
|
|
},
|
|
},
|
|
qcow2ImgType(rd),
|
|
)
|
|
|
|
ppc64le.addImageTypes(
|
|
&platform.PPC64LE{},
|
|
tarImgType(),
|
|
)
|
|
|
|
s390x.addImageTypes(
|
|
&platform.S390X{
|
|
BIOS: true,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_QCOW2,
|
|
QCOW2Compat: "0.10",
|
|
},
|
|
},
|
|
qcow2ImgType(rd),
|
|
)
|
|
|
|
s390x.addImageTypes(
|
|
&platform.S390X{},
|
|
tarImgType(),
|
|
)
|
|
|
|
azureX64Platform := &platform.X86{
|
|
BIOS: true,
|
|
UEFIVendor: rd.vendor,
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_VHD,
|
|
},
|
|
}
|
|
|
|
rawUEFIx86Platform := &platform.X86{
|
|
BasePlatform: platform.BasePlatform{
|
|
ImageFormat: platform.FORMAT_RAW,
|
|
},
|
|
BIOS: false,
|
|
UEFIVendor: rd.vendor,
|
|
}
|
|
|
|
if rd.isRHEL() {
|
|
if !common.VersionLessThan(rd.osVersion, "8.6") {
|
|
// image types only available on 8.6 and later on RHEL
|
|
// These edge image types require FDO which aren't available on older versions
|
|
x86_64.addImageTypes(
|
|
bareMetalX86Platform,
|
|
edgeRawImgType(),
|
|
)
|
|
|
|
x86_64.addImageTypes(
|
|
rawUEFIx86Platform,
|
|
edgeSimplifiedInstallerImgType(rd),
|
|
)
|
|
|
|
aarch64.addImageTypes(
|
|
rawAarch64Platform,
|
|
edgeRawImgType(),
|
|
edgeSimplifiedInstallerImgType(rd),
|
|
)
|
|
}
|
|
|
|
// add azure to RHEL distro only
|
|
x86_64.addImageTypes(azureX64Platform, azureRhuiImgType(), azureByosImgType(), azureSapImgType(rd))
|
|
|
|
// add ec2 image types to RHEL distro only
|
|
x86_64.addImageTypes(rawX86Platform, ec2ImgTypeX86_64(rd), ec2HaImgTypeX86_64(rd))
|
|
aarch64.addImageTypes(rawAarch64Platform, ec2ImgTypeAarch64(rd))
|
|
|
|
if rd.osVersion != "8.5" {
|
|
// NOTE: RHEL 8.5 is going away and these image types require some
|
|
// work to get working, so we just disable them here until the
|
|
// whole distro gets deleted
|
|
x86_64.addImageTypes(rawX86Platform, ec2SapImgTypeX86_64(rd))
|
|
}
|
|
|
|
// add GCE RHUI image to RHEL only
|
|
x86_64.addImageTypes(gceX86Platform, gceRhuiImgType(rd))
|
|
|
|
// add s390x to RHEL distro only
|
|
rd.addArches(s390x)
|
|
} else {
|
|
x86_64.addImageTypes(
|
|
bareMetalX86Platform,
|
|
edgeRawImgType(),
|
|
)
|
|
|
|
x86_64.addImageTypes(
|
|
rawUEFIx86Platform,
|
|
edgeSimplifiedInstallerImgType(rd),
|
|
)
|
|
|
|
x86_64.addImageTypes(azureX64Platform, azureImgType())
|
|
|
|
aarch64.addImageTypes(
|
|
rawAarch64Platform,
|
|
edgeRawImgType(),
|
|
edgeSimplifiedInstallerImgType(rd),
|
|
)
|
|
}
|
|
rd.addArches(x86_64, aarch64, ppc64le)
|
|
return &rd
|
|
}
|