rhel85: pipeline function separation

The single `pipelines()` function is now replaced by multiple functions
for different purposes:
- `edgeCorePipelines()` defines the pipelines that create an edge
  commit. This is used by both the `edge-commit` and `edge-container`
  images.
- `edgeCommitPipelines()` and `edgeContainerPipelines()` define the
  pipelines for `edge-commit` and `edge-container` respectively. They
  share the core pipelines but differ in their final pipeline for
  assembling the image into either a tarball or a container.
- `edgeInstallerPipeline()` shares almost no common parts with other
  pipelines (only the `buildPipeline()`).

The `pipelines` function for each image type is set during creation of
the instance.

Individual pipeline functions are no longer methods of the image type.
This commit is contained in:
Achilleas Koutsou 2021-04-09 11:17:25 +02:00 committed by Ondřej Budai
parent 68a81c15fe
commit 95947f60c7

View file

@ -94,21 +94,10 @@ func (a *architecture) addImageTypes(imageTypes ...imageType) {
if a.imageTypes == nil { if a.imageTypes == nil {
a.imageTypes = map[string]distro.ImageType{} a.imageTypes = map[string]distro.ImageType{}
} }
for _, it := range imageTypes { for idx := range imageTypes {
a.imageTypes[it.name] = &imageType{ it := imageTypes[idx]
arch: a, it.arch = a
name: it.name, a.imageTypes[it.name] = &it
filename: it.filename,
mimeType: it.mimeType,
packageSets: it.packageSets,
enabledServices: it.enabledServices,
disabledServices: it.disabledServices,
defaultTarget: it.defaultTarget,
bootISO: it.bootISO,
rpmOstree: it.rpmOstree,
defaultSize: it.defaultSize,
exports: it.exports,
}
} }
} }
@ -116,6 +105,8 @@ func (a *architecture) Distro() distro.Distro {
return a.distro return a.distro
} }
type pipelinesFunc func(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error)
type imageType struct { type imageType struct {
arch *architecture arch *architecture
name string name string
@ -129,6 +120,7 @@ type imageType struct {
rpmOstree bool rpmOstree bool
defaultSize uint64 defaultSize uint64
exports []string exports []string
pipelines pipelinesFunc
} }
func (t *imageType) Name() string { func (t *imageType) Name() string {
@ -202,9 +194,14 @@ func (t *imageType) Manifest(customizations *blueprint.Customizations,
packageSpecSets map[string][]rpmmd.PackageSpec, packageSpecSets map[string][]rpmmd.PackageSpec,
seed int64) (distro.Manifest, error) { seed int64) (distro.Manifest, error) {
if err := t.checkOptions(customizations, options); err != nil {
return distro.Manifest{}, err
}
source := rand.NewSource(seed) source := rand.NewSource(seed)
rng := rand.New(source) rng := rand.New(source)
pipelines, err := t.pipelines(customizations, options, repos, packageSpecSets, rng)
pipelines, err := t.pipelines(t, customizations, options, repos, packageSpecSets, rng)
if err != nil { if err != nil {
return distro.Manifest{}, err return distro.Manifest{}, err
} }
@ -246,8 +243,11 @@ func (t *imageType) checkOptions(customizations *blueprint.Customizations, optio
return nil return nil
} }
func (t *imageType) installerPipelines(options distro.ImageOptions, repos []rpmmd.RepoConfig, installerPackages []rpmmd.PackageSpec) ([]osbuild.Pipeline, error) { func edgeInstallerPipelines(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["build"]))
kernelPkg := new(rpmmd.PackageSpec) kernelPkg := new(rpmmd.PackageSpec)
installerPackages := packageSetSpecs["installer"]
for _, pkg := range installerPackages { for _, pkg := range installerPackages {
if pkg.Name == "kernel" { if pkg.Name == "kernel" {
kernelPkg = &pkg kernelPkg = &pkg
@ -258,16 +258,44 @@ func (t *imageType) installerPipelines(options distro.ImageOptions, repos []rpmm
return nil, fmt.Errorf("kernel package not found in installer package set") return nil, fmt.Errorf("kernel package not found in installer package set")
} }
kernelVer := fmt.Sprintf("%s-%s.%s", kernelPkg.Version, kernelPkg.Release, kernelPkg.Arch) kernelVer := fmt.Sprintf("%s-%s.%s", kernelPkg.Version, kernelPkg.Release, kernelPkg.Arch)
pipelines := make([]osbuild.Pipeline, 0) pipelines = append(pipelines, *anacondaTreePipeline(repos, installerPackages, options, kernelVer, t.Arch().Name()))
pipelines = append(pipelines, *t.anacondaTreePipeline(repos, installerPackages, options, kernelVer)) pipelines = append(pipelines, *bootISOTreePipeline(kernelVer, t.Arch().Name()))
pipelines = append(pipelines, *t.bootISOTreePipeline(kernelVer)) pipelines = append(pipelines, *bootISOPipeline(t.Filename(), t.Arch().Name()))
pipelines = append(pipelines, *t.bootISOPipeline())
return pipelines, nil return pipelines, nil
} }
func (t *imageType) pipelines(customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) { func edgeCorePipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec) ([]osbuild.Pipeline, error) {
return nil, fmt.Errorf("not implemented") pipelines := make([]osbuild.Pipeline, 0)
pipelines = append(pipelines, *buildPipeline(repos, packageSetSpecs["build"]))
treePipeline, err := ostreeTreePipeline(t, repos, packageSetSpecs["packages"], customizations)
if err != nil {
return nil, err
}
pipelines = append(pipelines, *treePipeline)
pipelines = append(pipelines, *ostreeCommitPipeline(options))
return pipelines, nil
}
func edgeCommitPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines, err := edgeCorePipelines(t, customizations, options, repos, packageSetSpecs)
if err != nil {
return nil, err
}
pipelines = append(pipelines, *commitTarPipeline(t.Filename()))
return pipelines, nil
}
func edgeContainerPipelines(t *imageType, customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) {
pipelines, err := edgeCorePipelines(t, customizations, options, repos, packageSetSpecs)
if err != nil {
return nil, err
}
pipelines = append(pipelines, *containerTreePipeline(repos, packageSetSpecs["container"], options, customizations))
pipelines = append(pipelines, *containerPipeline(t))
return pipelines, nil
} }
func (t *imageType) sources(packages []rpmmd.PackageSpec, ostreeCommits []ostreeCommit) osbuild.Sources { func (t *imageType) sources(packages []rpmmd.PackageSpec, ostreeCommits []ostreeCommit) osbuild.Sources {
@ -303,20 +331,20 @@ func (t *imageType) sources(packages []rpmmd.PackageSpec, ostreeCommits []ostree
return sources return sources
} }
func (t *imageType) buildPipeline(repos []rpmmd.RepoConfig, buildPackageSpecs []rpmmd.PackageSpec) *osbuild.Pipeline { func buildPipeline(repos []rpmmd.RepoConfig, buildPackageSpecs []rpmmd.PackageSpec) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "build" p.Name = "build"
p.Runner = "org.osbuild.rhel85" p.Runner = "org.osbuild.rhel85"
p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(buildPackageSpecs))) p.AddStage(osbuild.NewRPMStage(rpmStageOptions(repos), rpmStageInputs(buildPackageSpecs)))
p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) p.AddStage(osbuild.NewSELinuxStage(selinuxStageOptions(false)))
return p return p
} }
func (t *imageType) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, c *blueprint.Customizations) (*osbuild.Pipeline, error) { func ostreeTreePipeline(t *imageType, repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, c *blueprint.Customizations) (*osbuild.Pipeline, error) {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "ostree-tree" p.Name = "ostree-tree"
p.Build = "name:build" p.Build = "name:build"
p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) p.AddStage(osbuild.NewRPMStage(rpmStageOptions(repos), rpmStageInputs(packages)))
language, keyboard := c.GetPrimaryLocale() language, keyboard := c.GetPrimaryLocale()
if language != nil { if language != nil {
p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language})) p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language}))
@ -342,28 +370,28 @@ func (t *imageType) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rpmm
} }
if groups := c.GetGroups(); len(groups) > 0 { if groups := c.GetGroups(); len(groups) > 0 {
p.AddStage(osbuild.NewGroupsStage(t.groupStageOptions(groups))) p.AddStage(osbuild.NewGroupsStage(groupStageOptions(groups)))
} }
if users := c.GetUsers(); len(users) > 0 { if users := c.GetUsers(); len(users) > 0 {
options, err := t.userStageOptions(users) options, err := userStageOptions(users)
if err != nil { if err != nil {
return nil, err return nil, err
} }
p.AddStage(osbuild.NewUsersStage(options)) p.AddStage(osbuild.NewUsersStage(options))
p.AddStage(osbuild.NewFirstBootStage(t.usersFirstBootOptions(options))) p.AddStage(osbuild.NewFirstBootStage(usersFirstBootOptions(options)))
} }
if services := c.GetServices(); services != nil || t.enabledServices != nil || t.disabledServices != nil || t.defaultTarget != "" { if services := c.GetServices(); services != nil || t.enabledServices != nil || t.disabledServices != nil || t.defaultTarget != "" {
p.AddStage(osbuild.NewSystemdStage(t.systemdStageOptions(t.enabledServices, t.disabledServices, services, t.defaultTarget))) p.AddStage(osbuild.NewSystemdStage(systemdStageOptions(t.enabledServices, t.disabledServices, services, t.defaultTarget)))
} }
if firewall := c.GetFirewall(); firewall != nil { if firewall := c.GetFirewall(); firewall != nil {
p.AddStage(osbuild.NewFirewallStage(t.firewallStageOptions(firewall))) p.AddStage(osbuild.NewFirewallStage(firewallStageOptions(firewall)))
} }
if !t.bootISO { if !t.bootISO {
p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) p.AddStage(osbuild.NewSELinuxStage(selinuxStageOptions(false)))
} }
// These are the current defaults for the sysconfig stage. This can be changed to be image type exclusive if different configs are needed. // These are the current defaults for the sysconfig stage. This can be changed to be image type exclusive if different configs are needed.
@ -386,7 +414,7 @@ func (t *imageType) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rpmm
})) }))
return p, nil return p, nil
} }
func (t *imageType) ostreeCommitPipeline(options distro.ImageOptions) *osbuild.Pipeline { func ostreeCommitPipeline(options distro.ImageOptions) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "ostree-commit" p.Name = "ostree-commit"
p.Build = "name:build" p.Build = "name:build"
@ -422,11 +450,11 @@ func (t *imageType) tarPipeline(reference string) *osbuild.Pipeline {
return p return p
} }
func (t *imageType) containerTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, c *blueprint.Customizations) *osbuild.Pipeline { func containerTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, c *blueprint.Customizations) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "container-tree" p.Name = "container-tree"
p.Build = "name:build" p.Build = "name:build"
p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) p.AddStage(osbuild.NewRPMStage(rpmStageOptions(repos), rpmStageInputs(packages)))
language, _ := c.GetPrimaryLocale() language, _ := c.GetPrimaryLocale()
if language != nil { if language != nil {
p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language})) p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language}))
@ -437,12 +465,12 @@ func (t *imageType) containerTreePipeline(repos []rpmmd.RepoConfig, packages []r
p.AddStage(osbuild.NewOSTreePullStage( p.AddStage(osbuild.NewOSTreePullStage(
&osbuild.OSTreePullStageOptions{Repo: "/var/www/html/repo"}, &osbuild.OSTreePullStageOptions{Repo: "/var/www/html/repo"},
t.ostreePullStageInputs("org.osbuild.pipeline", "name:ostree-commit", options.OSTree.Ref), ostreePullStageInputs("org.osbuild.pipeline", "name:ostree-commit", options.OSTree.Ref),
)) ))
return p return p
} }
func (t *imageType) containerPipeline() *osbuild.Pipeline { func containerPipeline(t *imageType) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "container" p.Name = "container"
p.Build = "name:build" p.Build = "name:build"
@ -463,18 +491,18 @@ func (t *imageType) containerPipeline() *osbuild.Pipeline {
return p return p
} }
func (t *imageType) anacondaTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, kernelVer string) *osbuild.Pipeline { func anacondaTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, kernelVer string, arch string) *osbuild.Pipeline {
ostreeRepoPath := "/ostree/repo" ostreeRepoPath := "/ostree/repo"
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "anaconda-tree" p.Name = "anaconda-tree"
p.Build = "name:build" p.Build = "name:build"
p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) p.AddStage(osbuild.NewRPMStage(rpmStageOptions(repos), rpmStageInputs(packages)))
p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: ostreeRepoPath})) p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: ostreeRepoPath}))
p.AddStage(osbuild.NewOSTreePullStage( p.AddStage(osbuild.NewOSTreePullStage(
&osbuild.OSTreePullStageOptions{Repo: ostreeRepoPath}, &osbuild.OSTreePullStageOptions{Repo: ostreeRepoPath},
t.ostreePullStageInputs("org.osbuild.source", options.OSTree.Parent, options.OSTree.Ref), ostreePullStageInputs("org.osbuild.source", options.OSTree.Parent, options.OSTree.Ref),
)) ))
p.AddStage(osbuild.NewBuildstampStage(t.buildStampStageOptions())) p.AddStage(osbuild.NewBuildstampStage(buildStampStageOptions(arch)))
p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"})) p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"}))
rootPassword := "" rootPassword := ""
@ -502,36 +530,36 @@ func (t *imageType) anacondaTreePipeline(repos []rpmmd.RepoConfig, packages []rp
} }
p.AddStage(osbuild.NewUsersStage(usersStageOptions)) p.AddStage(osbuild.NewUsersStage(usersStageOptions))
p.AddStage(osbuild.NewAnacondaStage(t.anacondaStageOptions())) p.AddStage(osbuild.NewAnacondaStage(anacondaStageOptions()))
p.AddStage(osbuild.NewLoraxScriptStage(t.loraxScriptStageOptions())) p.AddStage(osbuild.NewLoraxScriptStage(loraxScriptStageOptions(arch)))
p.AddStage(osbuild.NewDracutStage(t.dracutStageOptions(kernelVer))) p.AddStage(osbuild.NewDracutStage(dracutStageOptions(kernelVer)))
p.AddStage(osbuild.NewKickstartStage(t.kickstartStageOptions(fmt.Sprintf("file://%s", ostreeRepoPath), options.OSTree.Ref))) p.AddStage(osbuild.NewKickstartStage(kickstartStageOptions(fmt.Sprintf("file://%s", ostreeRepoPath), options.OSTree.Ref)))
return p return p
} }
func (t *imageType) bootISOTreePipeline(kernelVer string) *osbuild.Pipeline { func bootISOTreePipeline(kernelVer string, arch string) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "bootiso-tree" p.Name = "bootiso-tree"
p.Build = "name:build" p.Build = "name:build"
p.AddStage(osbuild.NewBootISOMonoStage(t.bootISOMonoStageOptions(kernelVer), t.bootISOMonoStageInputs())) p.AddStage(osbuild.NewBootISOMonoStage(bootISOMonoStageOptions(kernelVer, arch), bootISOMonoStageInputs()))
p.AddStage(osbuild.NewDiscinfoStage(t.discinfoStageOptions())) p.AddStage(osbuild.NewDiscinfoStage(discinfoStageOptions(arch)))
return p return p
} }
func (t *imageType) bootISOPipeline() *osbuild.Pipeline { func bootISOPipeline(filename string, arch string) *osbuild.Pipeline {
p := new(osbuild.Pipeline) p := new(osbuild.Pipeline)
p.Name = "bootiso" p.Name = "bootiso"
p.Build = "name:build" p.Build = "name:build"
p.AddStage(osbuild.NewXorrisofsStage(t.xorrisofsStageOptions(), t.xorrisofsStageInputs())) p.AddStage(osbuild.NewXorrisofsStage(xorrisofsStageOptions(filename, arch), xorrisofsStageInputs()))
p.AddStage(osbuild.NewImplantisomd5Stage(&osbuild.Implantisomd5StageOptions{Filename: t.Filename()})) p.AddStage(osbuild.NewImplantisomd5Stage(&osbuild.Implantisomd5StageOptions{Filename: filename}))
return p return p
} }
func (t *imageType) rpmStageInputs(specs []rpmmd.PackageSpec) *osbuild.RPMStageInputs { func rpmStageInputs(specs []rpmmd.PackageSpec) *osbuild.RPMStageInputs {
stageInput := new(osbuild.RPMStageInput) stageInput := new(osbuild.RPMStageInput)
stageInput.Type = "org.osbuild.files" stageInput.Type = "org.osbuild.files"
stageInput.Origin = "org.osbuild.source" stageInput.Origin = "org.osbuild.source"
@ -547,7 +575,7 @@ func pkgRefs(specs []rpmmd.PackageSpec) osbuild.RPMStageReferences {
return refs return refs
} }
func (t *imageType) ostreePullStageInputs(origin, source, commitRef string) *osbuild.OSTreePullStageInputs { func ostreePullStageInputs(origin, source, commitRef string) *osbuild.OSTreePullStageInputs {
pullStageInput := new(osbuild.OSTreePullStageInput) pullStageInput := new(osbuild.OSTreePullStageInput)
pullStageInput.Type = "org.osbuild.ostree" pullStageInput.Type = "org.osbuild.ostree"
pullStageInput.Origin = origin pullStageInput.Origin = origin
@ -558,7 +586,7 @@ func (t *imageType) ostreePullStageInputs(origin, source, commitRef string) *osb
return &osbuild.OSTreePullStageInputs{Commits: pullStageInput} return &osbuild.OSTreePullStageInputs{Commits: pullStageInput}
} }
func (t *imageType) rpmStageOptions(repos []rpmmd.RepoConfig) *osbuild.RPMStageOptions { func rpmStageOptions(repos []rpmmd.RepoConfig) *osbuild.RPMStageOptions {
var gpgKeys []string var gpgKeys []string
for _, repo := range repos { for _, repo := range repos {
if repo.GPGKey == "" { if repo.GPGKey == "" {
@ -576,12 +604,12 @@ func (t *imageType) rpmStageOptions(repos []rpmmd.RepoConfig) *osbuild.RPMStageO
} }
} }
func (t *imageType) selinuxStageOptions() *osbuild.SELinuxStageOptions { func selinuxStageOptions(bootISO bool) *osbuild.SELinuxStageOptions {
options := &osbuild.SELinuxStageOptions{ options := &osbuild.SELinuxStageOptions{
FileContexts: "etc/selinux/targeted/contexts/files/file_contexts", FileContexts: "etc/selinux/targeted/contexts/files/file_contexts",
} }
if t.bootISO { if bootISO {
options.Labels = map[string]string{ options.Labels = map[string]string{
"/usr/bin/cp": "system_u:object_r:install_exec_t:s0", "/usr/bin/cp": "system_u:object_r:install_exec_t:s0",
"/usr/bin/tar": "system_u:object_r:install_exec_t:s0", "/usr/bin/tar": "system_u:object_r:install_exec_t:s0",
@ -590,7 +618,7 @@ func (t *imageType) selinuxStageOptions() *osbuild.SELinuxStageOptions {
return options return options
} }
func (t *imageType) userStageOptions(users []blueprint.UserCustomization) (*osbuild.UsersStageOptions, error) { func userStageOptions(users []blueprint.UserCustomization) (*osbuild.UsersStageOptions, error) {
options := osbuild.UsersStageOptions{ options := osbuild.UsersStageOptions{
Users: make(map[string]osbuild.UsersStageOptionsUser), Users: make(map[string]osbuild.UsersStageOptionsUser),
} }
@ -623,7 +651,7 @@ func (t *imageType) userStageOptions(users []blueprint.UserCustomization) (*osbu
return &options, nil return &options, nil
} }
func (t *imageType) usersFirstBootOptions(usersStageOptions *osbuild.UsersStageOptions) *osbuild.FirstBootStageOptions { func usersFirstBootOptions(usersStageOptions *osbuild.UsersStageOptions) *osbuild.FirstBootStageOptions {
cmds := make([]string, 0, 3*len(usersStageOptions.Users)+1) cmds := make([]string, 0, 3*len(usersStageOptions.Users)+1)
// workaround for creating authorized_keys file for user // workaround for creating authorized_keys file for user
varhome := filepath.Join("/var", "home") varhome := filepath.Join("/var", "home")
@ -644,7 +672,7 @@ func (t *imageType) usersFirstBootOptions(usersStageOptions *osbuild.UsersStageO
return options return options
} }
func (t *imageType) groupStageOptions(groups []blueprint.GroupCustomization) *osbuild.GroupsStageOptions { func groupStageOptions(groups []blueprint.GroupCustomization) *osbuild.GroupsStageOptions {
options := osbuild.GroupsStageOptions{ options := osbuild.GroupsStageOptions{
Groups: map[string]osbuild.GroupsStageOptionsGroup{}, Groups: map[string]osbuild.GroupsStageOptionsGroup{},
} }
@ -661,7 +689,7 @@ func (t *imageType) groupStageOptions(groups []blueprint.GroupCustomization) *os
return &options return &options
} }
func (t *imageType) firewallStageOptions(firewall *blueprint.FirewallCustomization) *osbuild.FirewallStageOptions { func firewallStageOptions(firewall *blueprint.FirewallCustomization) *osbuild.FirewallStageOptions {
options := osbuild.FirewallStageOptions{ options := osbuild.FirewallStageOptions{
Ports: firewall.Ports, Ports: firewall.Ports,
} }
@ -674,7 +702,7 @@ func (t *imageType) firewallStageOptions(firewall *blueprint.FirewallCustomizati
return &options return &options
} }
func (t *imageType) systemdStageOptions(enabledServices, disabledServices []string, s *blueprint.ServicesCustomization, target string) *osbuild.SystemdStageOptions { func systemdStageOptions(enabledServices, disabledServices []string, s *blueprint.ServicesCustomization, target string) *osbuild.SystemdStageOptions {
if s != nil { if s != nil {
enabledServices = append(enabledServices, s.Enabled...) enabledServices = append(enabledServices, s.Enabled...)
disabledServices = append(disabledServices, s.Disabled...) disabledServices = append(disabledServices, s.Disabled...)
@ -686,9 +714,9 @@ func (t *imageType) systemdStageOptions(enabledServices, disabledServices []stri
} }
} }
func (t *imageType) buildStampStageOptions() *osbuild.BuildstampStageOptions { func buildStampStageOptions(arch string) *osbuild.BuildstampStageOptions {
return &osbuild.BuildstampStageOptions{ return &osbuild.BuildstampStageOptions{
Arch: t.Arch().Name(), Arch: arch,
Product: "Red Hat Enterprise Linux", Product: "Red Hat Enterprise Linux",
Version: osVersion, Version: osVersion,
Variant: "edge", Variant: "edge",
@ -696,7 +724,7 @@ func (t *imageType) buildStampStageOptions() *osbuild.BuildstampStageOptions {
} }
} }
func (t *imageType) anacondaStageOptions() *osbuild.AnacondaStageOptions { func anacondaStageOptions() *osbuild.AnacondaStageOptions {
return &osbuild.AnacondaStageOptions{ return &osbuild.AnacondaStageOptions{
KickstartModules: []string{ KickstartModules: []string{
"org.fedoraproject.Anaconda.Modules.Network", "org.fedoraproject.Anaconda.Modules.Network",
@ -706,14 +734,14 @@ func (t *imageType) anacondaStageOptions() *osbuild.AnacondaStageOptions {
} }
} }
func (t *imageType) loraxScriptStageOptions() *osbuild.LoraxScriptStageOptions { func loraxScriptStageOptions(arch string) *osbuild.LoraxScriptStageOptions {
return &osbuild.LoraxScriptStageOptions{ return &osbuild.LoraxScriptStageOptions{
Path: "99-generic/runtime-postinstall.tmpl", Path: "99-generic/runtime-postinstall.tmpl",
BaseArch: t.Arch().Name(), BaseArch: arch,
} }
} }
func (t *imageType) dracutStageOptions(kernelVer string) *osbuild.DracutStageOptions { func dracutStageOptions(kernelVer string) *osbuild.DracutStageOptions {
kernel := []string{kernelVer} kernel := []string{kernelVer}
modules := []string{ modules := []string{
"bash", "bash",
@ -773,7 +801,7 @@ func (t *imageType) dracutStageOptions(kernelVer string) *osbuild.DracutStageOpt
} }
} }
func (t *imageType) kickstartStageOptions(ostreeURL, ostreeRef string) *osbuild.KickstartStageOptions { func kickstartStageOptions(ostreeURL, ostreeRef string) *osbuild.KickstartStageOptions {
return &osbuild.KickstartStageOptions{ return &osbuild.KickstartStageOptions{
Path: "/usr/share/anaconda/interactive-defaults.ks", Path: "/usr/share/anaconda/interactive-defaults.ks",
OSTree: osbuild.OSTreeOptions{ OSTree: osbuild.OSTreeOptions{
@ -785,9 +813,9 @@ func (t *imageType) kickstartStageOptions(ostreeURL, ostreeRef string) *osbuild.
} }
} }
func (t *imageType) bootISOMonoStageOptions(kernelVer string) *osbuild.BootISOMonoStageOptions { func bootISOMonoStageOptions(kernelVer string, arch string) *osbuild.BootISOMonoStageOptions {
comprOptions := new(osbuild.FSCompressionOptions) comprOptions := new(osbuild.FSCompressionOptions)
if bcj := osbuild.BCJOption(t.arch.Name()); bcj != "" { if bcj := osbuild.BCJOption(arch); bcj != "" {
comprOptions.BCJ = bcj comprOptions.BCJ = bcj
} }
return &osbuild.BootISOMonoStageOptions{ return &osbuild.BootISOMonoStageOptions{
@ -795,7 +823,7 @@ func (t *imageType) bootISOMonoStageOptions(kernelVer string) *osbuild.BootISOMo
Name: "Red Hat Enterprise Linux", Name: "Red Hat Enterprise Linux",
Version: osVersion, Version: osVersion,
}, },
ISOLabel: fmt.Sprintf("RHEL-8-5-0-BaseOS-%s", t.Arch().Name()), ISOLabel: fmt.Sprintf("RHEL-8-5-0-BaseOS-%s", arch),
Kernel: kernelVer, Kernel: kernelVer,
EFI: osbuild.EFI{ EFI: osbuild.EFI{
Architectures: []string{ Architectures: []string{
@ -819,7 +847,7 @@ func (t *imageType) bootISOMonoStageOptions(kernelVer string) *osbuild.BootISOMo
} }
} }
func (t *imageType) bootISOMonoStageInputs() *osbuild.BootISOMonoStageInputs { func bootISOMonoStageInputs() *osbuild.BootISOMonoStageInputs {
rootfsInput := new(osbuild.BootISOMonoStageInput) rootfsInput := new(osbuild.BootISOMonoStageInput)
rootfsInput.Type = "org.osbuild.tree" rootfsInput.Type = "org.osbuild.tree"
rootfsInput.Origin = "org.osbuild.pipeline" rootfsInput.Origin = "org.osbuild.pipeline"
@ -829,17 +857,17 @@ func (t *imageType) bootISOMonoStageInputs() *osbuild.BootISOMonoStageInputs {
} }
} }
func (t *imageType) discinfoStageOptions() *osbuild.DiscinfoStageOptions { func discinfoStageOptions(arch string) *osbuild.DiscinfoStageOptions {
return &osbuild.DiscinfoStageOptions{ return &osbuild.DiscinfoStageOptions{
BaseArch: t.Arch().Name(), BaseArch: arch,
Release: "202010217.n.0", Release: "202010217.n.0",
} }
} }
func (t *imageType) xorrisofsStageOptions() *osbuild.XorrisofsStageOptions { func xorrisofsStageOptions(filename string, arch string) *osbuild.XorrisofsStageOptions {
return &osbuild.XorrisofsStageOptions{ return &osbuild.XorrisofsStageOptions{
Filename: t.Filename(), Filename: filename,
VolID: fmt.Sprintf("RHEL-8-5-0-BaseOS-%s", t.Arch().Name()), VolID: fmt.Sprintf("RHEL-8-5-0-BaseOS-%s", arch),
SysID: "LINUX", SysID: "LINUX",
Boot: osbuild.XorrisofsBoot{ Boot: osbuild.XorrisofsBoot{
Image: "isolinux/isolinux.bin", Image: "isolinux/isolinux.bin",
@ -850,7 +878,7 @@ func (t *imageType) xorrisofsStageOptions() *osbuild.XorrisofsStageOptions {
} }
} }
func (t *imageType) xorrisofsStageInputs() *osbuild.XorrisofsStageInputs { func xorrisofsStageInputs() *osbuild.XorrisofsStageInputs {
input := new(osbuild.XorrisofsStageInput) input := new(osbuild.XorrisofsStageInput)
input.Type = "org.osbuild.tree" input.Type = "org.osbuild.tree"
input.Origin = "org.osbuild.pipeline" input.Origin = "org.osbuild.pipeline"