distro/rhel9: update distribution implementation

Update the implementation of the distro.Distro interface to match the
one in Fedora.  The main change is that the runner is a runner.Runner
and not a string.

The distroMap is replaced by two functions that initialise a
distribution struct from a template (one for CentOS and one for RHEL).
This commit is contained in:
Achilleas Koutsou 2022-10-12 19:52:40 +02:00 committed by Christian Kellner
parent 310578757a
commit 7bcbab0ba5
4 changed files with 79 additions and 79 deletions

View file

@ -237,7 +237,7 @@ var azureRhuiBasePartitionTables = distro.BasePartitionTableMap{
func vhdPipelines(compress bool) pipelinesFunc { func vhdPipelines(compress bool) pipelinesFunc {
return func(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { return func(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {

View file

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"sort" "sort"
"strconv"
"strings" "strings"
"github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/blueprint"
@ -17,6 +18,7 @@ import (
"github.com/osbuild/osbuild-composer/internal/oscap" "github.com/osbuild/osbuild-composer/internal/oscap"
"github.com/osbuild/osbuild-composer/internal/ostree" "github.com/osbuild/osbuild-composer/internal/ostree"
"github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/rpmmd"
"github.com/osbuild/osbuild-composer/internal/runner"
) )
const ( const (
@ -71,12 +73,12 @@ type distribution struct {
vendor string vendor string
ostreeRefTmpl string ostreeRefTmpl string
isolabelTmpl string isolabelTmpl string
runner string runner runner.Runner
arches map[string]distro.Arch arches map[string]distro.Arch
defaultImageConfig *distro.ImageConfig defaultImageConfig *distro.ImageConfig
} }
// RHEL-based OS image configuration defaults // CentOS- and RHEL-based OS image configuration defaults
var defaultDistroImageConfig = &distro.ImageConfig{ var defaultDistroImageConfig = &distro.ImageConfig{
Timezone: common.StringToPtr("America/New_York"), Timezone: common.StringToPtr("America/New_York"),
Locale: common.StringToPtr("C.UTF-8"), Locale: common.StringToPtr("C.UTF-8"),
@ -94,56 +96,34 @@ var defaultDistroImageConfig = &distro.ImageConfig{
}, },
} }
// distribution objects without the arches > image types func getCentOSDistro(version int) distribution {
var distroMap = map[string]distribution{ return distribution{
"rhel-90": { name: fmt.Sprintf("centos-%d", version),
name: "rhel-90",
product: "Red Hat Enterprise Linux",
osVersion: "9.0",
releaseVersion: "9",
modulePlatformID: "platform:el9",
vendor: "redhat",
ostreeRefTmpl: "rhel/9/%s/edge",
isolabelTmpl: "RHEL-9-0-0-BaseOS-%s",
runner: "org.osbuild.rhel90",
defaultImageConfig: defaultDistroImageConfig,
},
"rhel-91": {
name: "rhel-91",
product: "Red Hat Enterprise Linux",
osVersion: "9.1",
releaseVersion: "9",
modulePlatformID: "platform:el9",
vendor: "redhat",
ostreeRefTmpl: "rhel/9/%s/edge",
isolabelTmpl: "RHEL-9-1-0-BaseOS-%s",
runner: "org.osbuild.rhel91",
defaultImageConfig: defaultDistroImageConfig,
},
"rhel-92": {
name: "rhel-92",
product: "Red Hat Enterprise Linux",
osVersion: "9.2",
releaseVersion: "9",
modulePlatformID: "platform:el9",
vendor: "redhat",
ostreeRefTmpl: "rhel/9/%s/edge",
isolabelTmpl: "RHEL-9-2-0-BaseOS-%s",
runner: "org.osbuild.rhel92",
defaultImageConfig: defaultDistroImageConfig,
},
"centos-9": {
name: "centos-9",
product: "CentOS Stream", product: "CentOS Stream",
osVersion: "9-stream", osVersion: fmt.Sprintf("%d-stream", version),
releaseVersion: "9", releaseVersion: strconv.Itoa(version),
modulePlatformID: "platform:el9", modulePlatformID: fmt.Sprintf("platform:el%d", version),
vendor: "centos", vendor: "centos",
ostreeRefTmpl: "centos/9/%s/edge", ostreeRefTmpl: fmt.Sprintf("centos/%d/%%s/edge", version),
isolabelTmpl: "CentOS-Stream-9-BaseOS-%s", isolabelTmpl: fmt.Sprintf("CentOS-Stream-%d-BaseOS-%%s", version),
runner: "org.osbuild.centos9", runner: &runner.CentOS{Version: uint64(version)},
defaultImageConfig: defaultDistroImageConfig, defaultImageConfig: defaultDistroImageConfig,
}, }
}
func getRHELDistro(major, minor int) distribution {
return distribution{
name: fmt.Sprintf("rhel-%d%d", major, minor),
product: "Red Hat Enterprise Linux",
osVersion: fmt.Sprintf("%d.%d", major, minor),
releaseVersion: strconv.Itoa(major),
modulePlatformID: fmt.Sprintf("platform:el%d", major),
vendor: "redhat",
ostreeRefTmpl: fmt.Sprintf("rhel/%d/%%s/edge", major),
isolabelTmpl: fmt.Sprintf("RHEL-%d-%d-0-BaseOS-%%s", major, minor),
runner: &runner.RHEL{Major: uint64(major), Minor: uint64(minor)},
defaultImageConfig: defaultDistroImageConfig,
}
} }
func (d *distribution) Name() string { func (d *distribution) Name() string {
@ -640,41 +620,61 @@ func (t *imageType) checkOptions(customizations *blueprint.Customizations, optio
return nil return nil
} }
// New creates a new distro object, defining the supported architectures and image types
func New() distro.Distro { func New() distro.Distro {
return newDistro("rhel-90") return NewRHEL90()
} }
func NewHostDistro(name, modulePlatformID, ostreeRef string) distro.Distro { func NewHostDistro(name, modulePlatformID, ostreeRef string) distro.Distro {
return newDistro("rhel-90") // NOTE: args are ignored - host distro constructors are deprecated
return NewRHEL90()
}
func NewCentOS9() distro.Distro {
return newDistro("centos", 9, 0)
}
func NewCentOS9HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro {
// NOTE: args are ignored - host distro constructors are deprecated
return NewCentOS9()
}
func NewRHEL90() distro.Distro {
return newDistro("rhel", 9, 0)
}
func NewRHEL90HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro {
// NOTE: args are ignored - host distro constructors are deprecated
return NewRHEL90()
} }
func NewRHEL91() distro.Distro { func NewRHEL91() distro.Distro {
return newDistro("rhel-91") return newDistro("rhel", 9, 1)
} }
func NewRHEL91HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro { func NewRHEL91HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro {
return newDistro("rhel-91") // NOTE: args are ignored - host distro constructors are deprecated
return NewRHEL91()
} }
func NewRHEL92() distro.Distro { func NewRHEL92() distro.Distro {
return newDistro("rhel-92") return newDistro("rhel", 9, 2)
} }
func NewRHEL92HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro { func NewRHEL92HostDistro(name, modulePlatformID, ostreeRef string) distro.Distro {
return newDistro("rhel-92") // NOTE: args are ignored - host distro constructors are deprecated
return NewRHEL92()
} }
func NewCentos() distro.Distro { func newDistro(name string, major, minor int) distro.Distro {
return newDistro("centos-9") var rd distribution
} switch name {
case "rhel":
func NewCentosHostDistro(name, modulePlatformID, ostreeRef string) distro.Distro { rd = getRHELDistro(major, minor)
return newDistro("centos-9") case "centos":
} rd = getCentOSDistro(major)
default:
func newDistro(distroName string) distro.Distro { panic(fmt.Sprintf("unknown distro name: %s", name))
rd := distroMap[distroName] }
// Architecture definitions // Architecture definitions
x86_64 := architecture{ x86_64 := architecture{

View file

@ -19,7 +19,7 @@ import (
func qcow2Pipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func qcow2Pipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {
@ -56,7 +56,7 @@ func prependKernelCmdlineStage(pipeline *osbuild.Pipeline, kernelOptions string,
func vmdkPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func vmdkPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {
@ -81,7 +81,7 @@ func vmdkPipelines(t *imageType, customizations *blueprint.Customizations, optio
func openstackPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func openstackPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {
@ -108,7 +108,7 @@ func ec2CommonPipelines(t *imageType, customizations *blueprint.Customizations,
repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec,
rng *rand.Rand, diskfile string) ([]osbuild.Pipeline, error) { rng *rand.Rand, diskfile string) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {
@ -149,7 +149,7 @@ func rhelEc2Pipelines(t *imageType, customizations *blueprint.Customizations, op
func gcePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func gcePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng) partitionTable, err := t.getPartitionTable(customizations.GetFilesystems(), options, rng)
if err != nil { if err != nil {
@ -183,7 +183,7 @@ func gcePipelines(t *imageType, customizations *blueprint.Customizations, option
func tarPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func tarPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil) treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil)
if err != nil { if err != nil {
@ -204,7 +204,7 @@ func makeISORootPath(p string) string {
func edgeInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func edgeInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
installerPackages := packageSetSpecs[installerPkgsKey] installerPackages := packageSetSpecs[installerPkgsKey]
d := t.arch.distro d := t.arch.distro
archName := t.Arch().Name() archName := t.Arch().Name()
@ -225,7 +225,7 @@ func edgeInstallerPipelines(t *imageType, customizations *blueprint.Customizatio
func imageInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func imageInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil) treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil)
if err != nil { if err != nil {
@ -265,7 +265,7 @@ func imageInstallerPipelines(t *imageType, customizations *blueprint.Customizati
func edgeCorePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec) ([]osbuild.Pipeline, error) { func edgeCorePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil) treePipeline, err := osPipeline(t, repos, packageSetSpecs[osPkgsKey], containers, customizations, options, nil)
if err != nil { if err != nil {
@ -328,7 +328,7 @@ func edgeImagePipelines(t *imageType, customizations *blueprint.Customizations,
func edgeRawImagePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func edgeRawImagePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
imgName := t.filename imgName := t.filename
@ -758,7 +758,7 @@ func ostreePayloadStages(options distro.ImageOptions, ostreeRepoPath string) []*
func edgeSimplifiedInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func edgeSimplifiedInstallerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, containers []container.Spec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines := make([]osbuild.Pipeline, 0) pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner)) pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs[buildPkgsKey], t.arch.distro.runner.String()))
installerPackages := packageSetSpecs[installerPkgsKey] installerPackages := packageSetSpecs[installerPkgsKey]
kernelVer := rpmmd.GetVerStrFromPackageSpecListPanic(installerPackages, "kernel") kernelVer := rpmmd.GetVerStrFromPackageSpecListPanic(installerPackages, "kernel")
imgName := "disk.img.xz" imgName := "disk.img.xz"

View file

@ -31,7 +31,7 @@ var supportedDistros = []supportedDistro{
{rhel9.New, rhel9.NewHostDistro}, {rhel9.New, rhel9.NewHostDistro},
{rhel9.NewRHEL91, rhel9.NewRHEL91HostDistro}, {rhel9.NewRHEL91, rhel9.NewRHEL91HostDistro},
{rhel9.NewRHEL92, rhel9.NewRHEL92HostDistro}, {rhel9.NewRHEL92, rhel9.NewRHEL92HostDistro},
{rhel9.NewCentos, rhel9.NewCentosHostDistro}, {rhel9.NewCentOS9, rhel9.NewCentOS9HostDistro},
} }
type supportedDistro struct { type supportedDistro struct {