Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions data/distrodefs/bootc-generic/imagetypes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,9 @@ image_types:
filename: "image.ova"
mime_type: "application/ovf"
exports: ["archive"]

bootc-installer:
mime_type: "application/x-iso9660-image"
exports: ["bootiso"]
filename: "install.iso"
boot_iso: true
156 changes: 149 additions & 7 deletions pkg/distro/bootc/bootc.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ import (
bibcontainer "github.com/osbuild/images/pkg/bib/container"
"github.com/osbuild/images/pkg/bib/osinfo"
"github.com/osbuild/images/pkg/container"
"github.com/osbuild/images/pkg/customizations/anaconda"
"github.com/osbuild/images/pkg/customizations/kickstart"
"github.com/osbuild/images/pkg/customizations/users"
"github.com/osbuild/images/pkg/disk"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/distro/defs"
"github.com/osbuild/images/pkg/image"
"github.com/osbuild/images/pkg/manifest"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/platform"
"github.com/osbuild/images/pkg/policies"
"github.com/osbuild/images/pkg/rpmmd"
Expand Down Expand Up @@ -272,6 +275,17 @@ func (t *BootcImageType) Exports() []string {
}

func (t *BootcImageType) SupportedBlueprintOptions() []string {
if t.BootISO {
// XXX: this is probably too minimal but lets start small
// and expand
return []string{
"customizations.fips",
"customizations.group",
"customizations.installer",
"customizations.kernel.append",
"customizations.user",
}
}
return []string{
"customizations.directories",
"customizations.disk",
Expand All @@ -287,6 +301,13 @@ func (t *BootcImageType) RequiredBlueprintOptions() []string {
}

func (t *BootcImageType) Manifest(bp *blueprint.Blueprint, options distro.ImageOptions, repos []rpmmd.RepoConfig, seedp *int64) (*manifest.Manifest, []string, error) {
if t.BootISO {
return t.manifestForISO(bp, options, repos, seedp)
}
return t.manifestForDisk(bp, options, repos, seedp)
}

func (t *BootcImageType) manifestForDisk(bp *blueprint.Blueprint, options distro.ImageOptions, repos []rpmmd.RepoConfig, seedp *int64) (*manifest.Manifest, []string, error) {
if t.arch.distro.imgref == "" {
return nil, nil, fmt.Errorf("internal error: no base image defined")
}
Expand Down Expand Up @@ -330,7 +351,9 @@ func (t *BootcImageType) Manifest(bp *blueprint.Blueprint, options distro.ImageO
}

imageConfig := t.ImageTypeYAML.ImageConfig(t.arch.distro.id, t.arch.Name())
img.OSCustomizations.KernelOptionsAppend = imageConfig.KernelOptions
if imageConfig != nil {
img.OSCustomizations.KernelOptionsAppend = imageConfig.KernelOptions
}
if kopts := customizations.GetKernel(); kopts != nil && kopts.Append != "" {
img.OSCustomizations.KernelOptionsAppend = append(img.OSCustomizations.KernelOptionsAppend, kopts.Append)
}
Expand Down Expand Up @@ -375,6 +398,131 @@ func (t *BootcImageType) Manifest(bp *blueprint.Blueprint, options distro.ImageO
return &mf, nil, nil
}

func (t *BootcImageType) manifestForISO(bp *blueprint.Blueprint, options distro.ImageOptions, repos []rpmmd.RepoConfig, seedp *int64) (*manifest.Manifest, []string, error) {
if t.arch.distro.imgref == "" {
return nil, nil, fmt.Errorf("internal error: no base image defined")
}
if options.Bootc == nil || options.Bootc.InstallerPayloadRef == "" {
return nil, nil, fmt.Errorf("no installer payload bootc ref set")
}
payloadRef := options.Bootc.InstallerPayloadRef

containerSource := container.SourceSpec{
Source: t.arch.distro.imgref,
Name: t.arch.distro.imgref,
Local: true,
}
// XXX: keep it simple for now, we may allow this in the future
if t.arch.distro.buildImgref != t.arch.distro.imgref {
return nil, nil, fmt.Errorf("cannot use build-containers with anaconda installer images")
}

var customizations *blueprint.Customizations
if bp != nil {
customizations = bp.Customizations
}
seed, err := cmdutil.SeedArgFor(nil, t.Name(), t.arch.Name(), t.arch.distro.Name())
if err != nil {
return nil, nil, err
}
//nolint:gosec
rng := rand.New(rand.NewSource(seed))

platformi := PlatformFor(t.arch.Name(), t.arch.distro.sourceInfo.UEFIVendor)
platformi.ImageFormat = platform.FORMAT_ISO

// XXX: tons of copied code from
// bootc-image-builder:‎bib/cmd/bootc-image-builder/legacy_iso.go
// but sharing is hard because AnacondaContainerInstaller and
// AnacondaContainerInstallerLegacy are different types so
// a shared helper to set the fields won't work (unless
// reflection urgh).

// The ref is not needed and will be removed from the ctor later
// in time
img := image.NewAnacondaContainerInstaller(platformi, t.Filename(), containerSource, "")
img.ContainerRemoveSignatures = true
img.RootfsCompression = "zstd"
// kernelVer is used by dracut
img.KernelVer = t.arch.distro.sourceInfo.KernelInfo.Version
img.KernelPath = fmt.Sprintf("lib/modules/%s/vmlinuz", t.arch.distro.sourceInfo.KernelInfo.Version)
img.InitramfsPath = fmt.Sprintf("lib/modules/%s/initramfs.img", t.arch.distro.sourceInfo.KernelInfo.Version)
img.InstallerHome = "/var/roothome"
payloadSource := container.SourceSpec{
Source: payloadRef,
Name: payloadRef,
Local: true,
}
img.InstallerPayload = payloadSource

if t.arch.Name() == arch.ARCH_X86_64.String() {
img.InstallerCustomizations.ISOBoot = manifest.Grub2ISOBoot
}

img.InstallerCustomizations.Product = t.arch.distro.sourceInfo.OSRelease.Name
img.InstallerCustomizations.OSVersion = t.arch.distro.sourceInfo.OSRelease.VersionID
img.InstallerCustomizations.ISOLabel = LabelForISO(&t.arch.distro.sourceInfo.OSRelease, t.arch.Name())

img.InstallerCustomizations.FIPS = customizations.GetFIPS()
img.Kickstart, err = kickstart.New(customizations)
if err != nil {
return nil, nil, err
}
img.Kickstart.Path = osbuild.KickstartPathOSBuild
if kopts := customizations.GetKernel(); kopts != nil && kopts.Append != "" {
img.Kickstart.KernelOptionsAppend = append(img.Kickstart.KernelOptionsAppend, kopts.Append)
}
img.Kickstart.NetworkOnBoot = true

instCust, err := customizations.GetInstaller()
if err != nil {
return nil, nil, err
}
if instCust != nil && instCust.Modules != nil {
img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules, instCust.Modules.Enable...)
img.InstallerCustomizations.DisabledAnacondaModules = append(img.InstallerCustomizations.DisabledAnacondaModules, instCust.Modules.Disable...)
}
img.InstallerCustomizations.EnabledAnacondaModules = append(img.InstallerCustomizations.EnabledAnacondaModules,
anaconda.ModuleUsers,
anaconda.ModuleServices,
anaconda.ModuleSecurity,
// XXX: get from the imagedefs
anaconda.ModuleNetwork,
anaconda.ModulePayloads,
anaconda.ModuleRuntime,
anaconda.ModuleStorage,
)
if bpKernel := customizations.GetKernel(); bpKernel.Append != "" {
img.InstallerCustomizations.KernelOptionsAppend = append(img.InstallerCustomizations.KernelOptionsAppend, bpKernel.Append)
}

img.Kickstart.OSTree = &kickstart.OSTree{
OSName: "default",
}
img.InstallerCustomizations.LoraxTemplates = LoraxTemplates(t.arch.distro.sourceInfo.OSRelease)
img.InstallerCustomizations.LoraxTemplatePackage = LoraxTemplatePackage(t.arch.distro.sourceInfo.OSRelease)

// see https://github.com/osbuild/bootc-image-builder/issues/733
img.InstallerCustomizations.ISORootfsType = manifest.SquashfsRootfs

installRootfsType, err := disk.NewFSType(t.arch.distro.defaultFs)
if err != nil {
return nil, nil, err
}
img.InstallRootfsType = installRootfsType

mf := manifest.New()

foundDistro, foundRunner, err := GetDistroAndRunner(t.arch.distro.sourceInfo.OSRelease)
if err != nil {
return nil, nil, fmt.Errorf("failed to infer distro and runner: %w", err)
}
mf.Distro = foundDistro

_, err = img.InstantiateManifestFromContainer(&mf, []container.SourceSpec{containerSource}, foundRunner, rng)
return &mf, nil, err
}

// newBootcDistro returns a new instance of BootcDistro
// from the given url
func NewBootcDistro(imgref string) (*BootcDistro, error) {
Expand Down Expand Up @@ -447,12 +595,6 @@ func newBootcDistroAfterIntrospect(archStr string, info *osinfo.Info, imgref, de
ImageTypeYAML: imgTypeYaml,
})
}
// XXX: move into YAML as well
ba.imageTypes["bootc-installer"] = &BootcAnacondaInstaller{
arch: ba,
name: "bootc-installer",
export: "bootiso",
}
bd.addArches(ba)

return bd, nil
Expand Down
Loading
Loading