debian-forge-composer/internal/manifest/raw_ostree.go
Achilleas Koutsou 3d772b6846 osbuild: simplify and unify tree stage inputs
- Remove stage-specific input types when they are org.osbuild.tree input
  types.
- Use PipelineTreeInputs when stage requires a single tree input
  reference with an arbitrary key.
- For Stages that require a specific key with a tree input, make the key
  part of the NewXStage() function and only allow specifying the name of
  the pipeline from which to copy the tree as part of the function
  arguments.
2022-09-29 18:09:38 +02:00

81 lines
2.3 KiB
Go

package manifest
import (
"github.com/osbuild/osbuild-composer/internal/artifact"
"github.com/osbuild/osbuild-composer/internal/osbuild"
"github.com/osbuild/osbuild-composer/internal/platform"
)
// A RawOSTreeImage represents a raw ostree image file which can be booted in a
// hypervisor. It is created from an existing OSTreeDeployment.
type RawOSTreeImage struct {
Base
treePipeline *OSTreeDeployment
Filename string
platform platform.Platform
}
func NewRawOStreeImage(m *Manifest,
buildPipeline *Build,
platform platform.Platform,
treePipeline *OSTreeDeployment) *RawOSTreeImage {
p := &RawOSTreeImage{
Base: NewBase(m, "image", buildPipeline),
treePipeline: treePipeline,
Filename: "disk.img",
platform: platform,
}
buildPipeline.addDependent(p)
if treePipeline.Base.manifest != m {
panic("tree pipeline from different manifest")
}
m.addPipeline(p)
return p
}
func (p *RawOSTreeImage) getBuildPackages() []string {
packages := p.platform.GetBuildPackages()
packages = append(packages, p.platform.GetPackages()...)
packages = append(packages, p.treePipeline.PartitionTable.GetBuildPackages()...)
packages = append(packages,
"rpm-ostree",
// these should be defined on the platform
"dracut-config-generic",
"efibootmgr",
)
return packages
}
func (p *RawOSTreeImage) serialize() osbuild.Pipeline {
pipeline := p.Base.serialize()
pt := p.treePipeline.PartitionTable
if pt == nil {
panic("no partition table in live image")
}
for _, stage := range osbuild.GenImagePrepareStages(pt, p.Filename, osbuild.PTSfdisk) {
pipeline.AddStage(stage)
}
inputName := "root-tree"
copyOptions, copyDevices, copyMounts := osbuild.GenCopyFSTreeOptions(inputName, p.treePipeline.Name(), p.Filename, pt)
copyInputs := osbuild.NewPipelineTreeInputs(inputName, p.treePipeline.Name())
pipeline.AddStage(osbuild.NewCopyStage(copyOptions, copyInputs, copyDevices, copyMounts))
for _, stage := range osbuild.GenImageFinishStages(pt, p.Filename) {
pipeline.AddStage(stage)
}
if grubLegacy := p.treePipeline.platform.GetBIOSPlatform(); grubLegacy != "" {
pipeline.AddStage(osbuild.NewGrub2InstStage(osbuild.NewGrub2InstStageOption(p.Filename, pt, grubLegacy)))
}
return pipeline
}
func (p *RawOSTreeImage) Export() *artifact.Artifact {
p.Base.export = true
return artifact.New(p.Name(), p.Filename, nil)
}