diff --git a/internal/distro/rhel84/distro.go b/internal/distro/rhel84/distro.go index df0de7c06..e596f9d20 100644 --- a/internal/distro/rhel84/distro.go +++ b/internal/distro/rhel84/distro.go @@ -167,6 +167,7 @@ func (a *architecture) addS2ImageTypes(imageTypes ...imageTypeS2) { bootable: it.bootable, rpmOstree: it.rpmOstree, defaultSize: it.defaultSize, + bootISO: it.bootISO, } } } @@ -1254,6 +1255,228 @@ func newDistro(isCentos bool) distro.Distro { }, enabledServices: edgeImgTypeX86_64.enabledServices, rpmOstree: true, + bootISO: false, + } + + edgeBuildPkgs := []string{ + "dnf", + "dosfstools", + "e2fsprogs", + "grub2-pc", + "policycoreutils", + "python36", + "python3-iniparse", + "qemu-img", + "rpm-ostree", + "systemd", + "tar", + "xfsprogs", + "xz", + "selinux-policy-targeted", + "genisoimage", + "isomd5sum", + "xorriso", + "syslinux", + "lorax-templates-generic", + "lorax-templates-rhel", + "syslinux-nonlinux", + "squashfs-tools", + "grub2-pc-modules", + "grub2-tools", + "grub2-efi-x64", + "shim-x64", + "efibootmgr", + "grub2-tools-minimal", + "grub2-tools-extra", + "grub2-tools-efi", + "grub2-efi-x64", + "grub2-efi-x64-cdboot", + "shim-ia32", + "grub2-efi-ia32-cdboot", + } + + edgeInstallerPkgs := []string{ + "anaconda", + "anaconda-widgets", + "kdump-anaconda-addon", + "anaconda-install-env-deps", + "oscap-anaconda-addon", + "redhat-release-eula", + "dnf", + "rpm-ostree", + "ostree", + "ostree", + "pigz", + "kernel", + "kernel-modules", + "kernel-modules-extra", + "grubby", + "iwl100-firmware", + "iwl1000-firmware", + "iwl105-firmware", + "iwl135-firmware", + "iwl2000-firmware", + "iwl2030-firmware", + "iwl3160-firmware", + "iwl3945-firmware", + "iwl4965-firmware", + "iwl5000-firmware", + "iwl5150-firmware", + "iwl6000-firmware", + "iwl6000g2a-firmware", + "iwl6000g2b-firmware", + "iwl6050-firmware", + "iwl7260-firmware", + "libertas-sd8686-firmware", + "libertas-sd8787-firmware", + "libertas-usb8388-firmware", + "libertas-usb8388-olpc-firmware", + "linux-firmware", + "alsa-firmware", + "alsa-tools-firmware", + "glibc-all-langpacks", + "grub2-tools-efi", + "efibootmgr", + "shim-x64", + "grub2-efi-x64-cdboot", + "shim-ia32", + "grub2-efi-ia32-cdboot", + "biosdevname", + "memtest86+", + "syslinux", + "grub2-tools", + "grub2-tools-minimal", + "grub2-tools-extra", + "plymouth", + "anaconda-dracut", + "dracut-network", + "dracut-config-generic", + "initscripts", + "cryptsetup", + "rpcbind", + "kbd", + "kbd-misc", + "tar", + "xz", + "curl", + "bzip2", + "systemd", + "systemd", + "rsyslog", + "xorg-x11-drivers", + "xorg-x11-server-Xorg", + "xorg-x11-server-utils", + "xorg-x11-xauth", + "dbus-x11", + "metacity", + "metacity", + "gsettings-desktop-schemas", + "gsettings-desktop-schemas", + "nm-connection-editor", + "librsvg2", + "librsvg2", + "xfsprogs", + "xfsprogs", + "gfs2-utils", + "system-storage-manager", + "device-mapper-persistent-data", + "xfsdump", + "udisks2", + "udisks2-iscsi", + "hostname", + "libblockdev-lvm-dbus", + "libblockdev-lvm-dbus", + "volume_key", + "nss-tools", + "selinux-policy-targeted", + "audit", + "ethtool", + "openssh-server", + "nfs-utils", + "openssh-clients", + "tigervnc-server-minimal", + "tigervnc-server-module", + "net-tools", + "nmap-ncat", + "prefixdevname", + "pciutils", + "usbutils", + "ipmitool", + "mt-st", + "smartmontools", + "hdparm", + "libibverbs", + "libibverbs", + "rdma-core", + "rdma-core", + "rng-tools", + "dmidecode", + "bitmap-fangsongti-fonts", + "dejavu-sans-fonts", + "dejavu-sans-mono-fonts", + "kacst-farsi-fonts", + "kacst-qurn-fonts", + "lklug-fonts", + "lohit-assamese-fonts", + "lohit-bengali-fonts", + "lohit-devanagari-fonts", + "lohit-gujarati-fonts", + "lohit-gurmukhi-fonts", + "lohit-kannada-fonts", + "lohit-odia-fonts", + "lohit-tamil-fonts", + "lohit-telugu-fonts", + "madan-fonts", + "smc-meera-fonts", + "thai-scalable-waree-fonts", + "sil-abyssinica-fonts", + "xorg-x11-fonts-misc", + "aajohan-comfortaa-fonts", + "abattis-cantarell-fonts", + "sil-scheherazade-fonts", + "jomolhari-fonts", + "khmeros-base-fonts", + "sil-padauk-fonts", + "google-noto-sans-cjk-ttc-fonts", + "gdb-gdbserver", + "libreport-plugin-bugzilla", + "libreport-plugin-reportuploader", + "libreport-rhel-anaconda-bugzilla", + "python3-pyatspi", + "vim-minimal", + "strace", + "lsof", + "dump", + "xz", + "less", + "rsync", + "bind-utils", + "ftp", + "mtr", + "wget", + "spice-vdagent", + "gdisk", + "hexedit", + "sg3_utils", + "perl-interpreter", + } + edgeInstImgTypeX86_64 := imageTypeS2{ + name: "rhel-edge-installer", + filename: "rhel84-boot.iso", + mimeType: "application/x-iso9660-image", + packageSets: map[string]rpmmd.PackageSet{ + "build": { + Include: edgeBuildPkgs, + }, + "packages": { + Include: edgeImgTypeX86_64.packages, + Exclude: edgeImgTypeX86_64.excludedPackages, + }, + "installer": {Include: edgeInstallerPkgs}, + }, + enabledServices: edgeImgTypeX86_64.enabledServices, + rpmOstree: true, + bootISO: true, } edgeOCIImgTypeAarch64 := imageTypeS2{ @@ -1269,6 +1492,7 @@ func newDistro(isCentos bool) distro.Distro { }, enabledServices: edgeImgTypeAarch64.enabledServices, rpmOstree: true, + bootISO: false, } x8664.addImageTypes( @@ -1282,7 +1506,7 @@ func newDistro(isCentos bool) distro.Distro { if !isCentos { x8664.addImageTypes(edgeImgTypeX86_64) - x8664.addS2ImageTypes(edgeOCIImgTypeX86_64) + x8664.addS2ImageTypes(edgeOCIImgTypeX86_64, edgeInstImgTypeX86_64) } aarch64 := architecture{ diff --git a/internal/distro/rhel84/distro_test.go b/internal/distro/rhel84/distro_test.go index e7f412b6c..e1fe95410 100644 --- a/internal/distro/rhel84/distro_test.go +++ b/internal/distro/rhel84/distro_test.go @@ -443,6 +443,8 @@ func TestDistro_ManifestError(t *testing.T) { _, err := imgType.Manifest(bp.Customizations, imgOpts, nil, nil, 0) if imgTypeName == "rhel-edge-commit" || imgTypeName == "rhel-edge-container" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") + } else if imgTypeName == "rhel-edge-installer" { + assert.EqualError(t, err, "boot ISO image type \"rhel-edge-installer\" requires specifying a URL from which to retrieve the OSTree commit") } else { assert.NoError(t, err) } @@ -466,7 +468,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { "vhd", "vmdk", }, - rhelAdditionalImageTypes: []string{"rhel-edge-commit", "rhel-edge-container"}, + rhelAdditionalImageTypes: []string{"rhel-edge-commit", "rhel-edge-container", "rhel-edge-installer"}, }, { arch: "aarch64", diff --git a/internal/distro/rhel84/distro_v2.go b/internal/distro/rhel84/distro_v2.go index 3c5e19bf1..33efd4306 100644 --- a/internal/distro/rhel84/distro_v2.go +++ b/internal/distro/rhel84/distro_v2.go @@ -24,6 +24,7 @@ type imageTypeS2 struct { defaultTarget string kernelOptions string bootable bool + bootISO bool rpmOstree bool defaultSize uint64 } @@ -69,19 +70,18 @@ func (t *imageTypeS2) Packages(bp blueprint.Blueprint) ([]string, []string) { if timezone != nil { packages = append(packages, "chrony") } - if t.bootable { - packages = append(packages, t.arch.bootloaderPackages...) - } - return packages, t.packageSets["packages"].Exclude } func (t *imageTypeS2) BuildPackages() []string { - packages := append(t.arch.distro.buildPackages, t.arch.buildPackages...) + buildPackages := append(t.arch.distro.buildPackages, t.arch.buildPackages...) if t.rpmOstree { - packages = append(packages, "rpm-ostree") + buildPackages = append(buildPackages, "rpm-ostree") } - return packages + if t.bootISO { + buildPackages = append(buildPackages, t.packageSets["build"].Include...) + } + return buildPackages } func (t *imageTypeS2) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { @@ -122,20 +122,32 @@ func (t *imageTypeS2) Manifest(c *blueprint.Customizations, // flatten spec sets for sources allPackageSpecs := make([]rpmmd.PackageSpec, 0) for _, specs := range packageSpecSets { - allPackageSpecs = append(allPackageSpecs, specs...) } + + var commits []ostreeCommit + if options.OSTree.Parent != "" && options.OSTree.URL != "" { + commit := ostreeCommit{Checksum: options.OSTree.Parent, URL: options.OSTree.URL} + commits = []ostreeCommit{commit} + } return json.Marshal( osbuild.Manifest{ Version: "2", Pipelines: pipelines, - Sources: t.sources(allPackageSpecs), + Sources: t.sources(allPackageSpecs, commits), }, ) } -func (t *imageTypeS2) sources(packages []rpmmd.PackageSpec) osbuild.Sources { - source := &osbuild.CurlSource{ +// local type for ostree sommit metadata used to define commit sources +type ostreeCommit struct { + Checksum string + URL string +} + +func (t *imageTypeS2) sources(packages []rpmmd.PackageSpec, ostreeCommits []ostreeCommit) osbuild.Sources { + sources := osbuild.Sources{} + curl := &osbuild.CurlSource{ Items: make(map[string]osbuild.CurlSourceItem), } for _, pkg := range packages { @@ -146,35 +158,69 @@ func (t *imageTypeS2) sources(packages []rpmmd.PackageSpec) osbuild.Sources { Name: "org.osbuild.rhsm", } } - source.Items[pkg.Checksum] = item + curl.Items[pkg.Checksum] = item } - return osbuild.Sources{ - "org.osbuild.curl": source, + if len(curl.Items) > 0 { + sources["org.osbuild.curl"] = curl } + + ostree := &osbuild.OSTreeSource{ + Items: make(map[string]osbuild.OSTreeSourceItem), + } + for _, commit := range ostreeCommits { + item := new(osbuild.OSTreeSourceItem) + item.Remote.URL = commit.URL + ostree.Items[commit.Checksum] = *item + } + if len(ostree.Items) > 0 { + sources["org.osbuild.ostree"] = ostree + } + return sources } -func (t *imageTypeS2) pipelines(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) { - if kernelOpts := c.GetKernel(); kernelOpts.Append != "" && t.rpmOstree { +func (t *imageTypeS2) pipelines(customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) { + + if t.bootISO { + if options.OSTree.Parent == "" { + return nil, fmt.Errorf("boot ISO image type %q requires specifying a URL from which to retrieve the OSTree commit", t.name) + } + if customizations != nil { + return nil, fmt.Errorf("boot ISO image type %q does not support blueprint customizations", t.name) + } + } + + if kernelOpts := customizations.GetKernel(); kernelOpts.Append != "" && t.rpmOstree { return nil, fmt.Errorf("kernel boot parameter customizations are not supported for ostree types") } - pipelines := make([]osbuild.Pipeline, 0, 5) + pipelines := make([]osbuild.Pipeline, 0) pipelines = append(pipelines, *t.buildPipeline(repos, packageSetSpecs["build-packages"])) - if t.rpmOstree { - // NOTE(akoutsou) 1to2t: Currently all images of type imageTypeS2 are ostree - treePipeline, err := t.ostreeTreePipeline(repos, packageSetSpecs["packages"], c) + if t.bootISO { + var kernelPkg rpmmd.PackageSpec + for _, pkg := range packageSetSpecs["installer"] { + if pkg.Name == "kernel" { + kernelPkg = pkg + break + } + } + // TODO: panic if not found + kernelVer := fmt.Sprintf("%s-%s.%s", kernelPkg.Version, kernelPkg.Release, kernelPkg.Arch) + pipelines = append(pipelines, *t.anacondaTreePipeline(repos, packageSetSpecs["installer"], options, kernelVer)) + pipelines = append(pipelines, *t.bootISOTreePipeline(kernelVer)) + pipelines = append(pipelines, *t.bootISOPipeline()) + } else { + treePipeline, err := t.ostreeTreePipeline(repos, packageSetSpecs["packages"], customizations) if err != nil { return nil, err } pipelines = append(pipelines, *treePipeline) pipelines = append(pipelines, *t.ostreeCommitPipeline(options)) + pipelines = append(pipelines, *t.containerTreePipeline(repos, packageSetSpecs["container"], options, customizations)) + pipelines = append(pipelines, *t.containerPipeline()) } - pipelines = append(pipelines, *t.containerTreePipeline(repos, packageSetSpecs["container"], options, c)) - pipelines = append(pipelines, *t.containerPipeline()) - return pipelines, nil } @@ -236,7 +282,9 @@ func (t *imageTypeS2) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rp p.AddStage(osbuild.NewFirewallStage(t.firewallStageOptions(firewall))) } - p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) + if !t.bootISO { + p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) + } // These are the current defaults for the sysconfig stage. This can be changed to be image type exclusive if different configs are needed. p.AddStage(osbuild.NewSysconfigStage(&osbuild.SysconfigStageOptions{ @@ -250,7 +298,7 @@ func (t *imageTypeS2) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rp }, })) - p.AddStage(osbuild.NewRPMOSTreePrepTreeStage(&osbuild.RPMOSTreePrepTreeStageOptions{ + p.AddStage(osbuild.NewOSTreePrepTreeStage(&osbuild.OSTreePrepTreeStageOptions{ EtcGroupMembers: []string{ // NOTE: We may want to make this configurable. "wheel", "docker", @@ -296,7 +344,7 @@ func (t *imageTypeS2) containerTreePipeline(repos []rpmmd.RepoConfig, packages [ p.AddStage(osbuild.NewOSTreePullStage( &osbuild.OSTreePullStageOptions{Repo: "/var/www/html/repo"}, - t.ostreePullStageInputs(options), + t.ostreePullStageInputs("org.osbuild.pipeline", "name:ostree-commit", t.OSTreeRef()), )) return p } @@ -323,6 +371,74 @@ func (t *imageTypeS2) containerPipeline() *osbuild.Pipeline { return p } +func (t *imageTypeS2) anacondaTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, kernelVer string) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "anaconda-tree" + p.Build = "name:build" + p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) + p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: "/ostree/repo"})) + p.AddStage(osbuild.NewOSTreePullStage( + &osbuild.OSTreePullStageOptions{Repo: "/ostree/repo"}, + t.ostreePullStageInputs("org.osbuild.source", options.OSTree.Parent, options.OSTree.Ref), + )) + p.AddStage(osbuild.NewBuildstampStage(t.buildStampStageOptions())) + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"})) + + rootPassword := "" + rootUser := osbuild.UsersStageOptionsUser{ + Password: &rootPassword, + } + + installUID := 0 + installGID := 0 + installHome := "/root" + installShell := "/usr/libexec/anaconda/run-anaconda" + installPassword := "" + installUser := osbuild.UsersStageOptionsUser{ + UID: &installUID, + GID: &installGID, + Home: &installHome, + Shell: &installShell, + Password: &installPassword, + } + usersStageOptions := &osbuild.UsersStageOptions{ + Users: map[string]osbuild.UsersStageOptionsUser{ + "root": rootUser, + "install": installUser, + }, + } + + p.AddStage(osbuild.NewUsersStage(usersStageOptions)) + p.AddStage(osbuild.NewAnacondaStage(t.anacondaStageOptions())) + p.AddStage(osbuild.NewLoraxScriptStage(t.loraxScriptStageOptions())) + p.AddStage(osbuild.NewDracutStage(t.dracutStageOptions(kernelVer))) + p.AddStage(osbuild.NewKickstartStage(t.kickstartStageOptions(options.OSTree.URL))) + + return p +} + +func (t *imageTypeS2) bootISOTreePipeline(kernelVer string) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "bootiso-tree" + p.Build = "name:build" + + p.AddStage(osbuild.NewBootISOMonoStage(t.bootISOMonoStageOptions(kernelVer), t.bootISOMonoStageInputs())) + p.AddStage(osbuild.NewDiscinfoStage(t.discinfoStageOptions())) + + return p +} +func (t *imageTypeS2) bootISOPipeline() *osbuild.Pipeline { + p := new(osbuild.Pipeline) + // NOTE(akoutsou) 1to2t: final pipeline should always be named "assembler" + p.Name = "assembler" + p.Build = "name:build" + + p.AddStage(osbuild.NewXorrisofsStage(t.xorrisofsStageOptions(), t.xorrisofsStageInputs())) + p.AddStage(osbuild.NewImplantisomd5Stage(&osbuild.Implantisomd5StageOptions{Filename: t.Filename()})) + + return p +} + func (t *imageTypeS2) rpmStageInputs(specs []rpmmd.PackageSpec) *osbuild.RPMStageInputs { stageInput := new(osbuild.RPMStageInput) stageInput.Type = "org.osbuild.files" @@ -339,13 +455,13 @@ func pkgRefs(specs []rpmmd.PackageSpec) osbuild.RPMStageReferences { return refs } -func (t *imageTypeS2) ostreePullStageInputs(options distro.ImageOptions) *osbuild.OSTreePullStageInputs { +func (t *imageTypeS2) ostreePullStageInputs(origin, source, commitRef string) *osbuild.OSTreePullStageInputs { pullStageInput := new(osbuild.OSTreePullStageInput) pullStageInput.Type = "org.osbuild.ostree" - pullStageInput.Origin = "org.osbuild.pipeline" + pullStageInput.Origin = origin inputRefs := make(map[string]osbuild.OSTreePullStageReference) - inputRefs["name:ostree-commit"] = osbuild.OSTreePullStageReference{Ref: t.OSTreeRef()} + inputRefs[source] = osbuild.OSTreePullStageReference{Ref: commitRef} pullStageInput.References = inputRefs return &osbuild.OSTreePullStageInputs{Commits: pullStageInput} } @@ -369,9 +485,17 @@ func (t *imageTypeS2) rpmStageOptions(repos []rpmmd.RepoConfig) *osbuild.RPMStag } func (t *imageTypeS2) selinuxStageOptions() *osbuild.SELinuxStageOptions { - return &osbuild.SELinuxStageOptions{ + + options := &osbuild.SELinuxStageOptions{ FileContexts: "etc/selinux/targeted/contexts/files/file_contexts", } + if t.bootISO { + options.Labels = map[string]string{ + "/usr/bin/cp": "system_u:object_r:install_exec_t:s0", + "/usr/bin/tar": "system_u:object_r:install_exec_t:s0", + } + } + return options } func (t *imageTypeS2) userStageOptions(users []blueprint.UserCustomization) (*osbuild.UsersStageOptions, error) { @@ -448,3 +572,173 @@ func (t *imageTypeS2) systemdStageOptions(enabledServices, disabledServices []st DefaultTarget: target, } } + +func (t *imageTypeS2) buildStampStageOptions() *osbuild.BuildstampStageOptions { + return &osbuild.BuildstampStageOptions{ + Arch: t.Arch().Name(), + Product: "Red Hat Enterprise Linux", + Version: "8.4", + Variant: "edge", + Final: true, + } +} + +func (t *imageTypeS2) anacondaStageOptions() *osbuild.AnacondaStageOptions { + return &osbuild.AnacondaStageOptions{ + KickstartModules: []string{ + "org.fedoraproject.Anaconda.Modules.Network", + "org.fedoraproject.Anaconda.Modules.Payloads", + "org.fedoraproject.Anaconda.Modules.Storage", + }, + } +} + +func (t *imageTypeS2) loraxScriptStageOptions() *osbuild.LoraxScriptStageOptions { + return &osbuild.LoraxScriptStageOptions{ + Path: "99-generic/runtime-postinstall.tmpl", + BaseArch: t.Arch().Name(), + } +} + +func (t *imageTypeS2) dracutStageOptions(kernelVer string) *osbuild.DracutStageOptions { + kernel := []string{kernelVer} + modules := []string{ + "bash", + "systemd", + "fips", + "systemd-initrd", + "modsign", + "nss-softokn", + "rdma", + "rngd", + "i18n", + "convertfs", + "network-manager", + "network", + "ifcfg", + "url-lib", + "drm", + "plymouth", + "prefixdevname", + "prefixdevname-tools", + "anaconda", + "crypt", + "dm", + "dmsquash-live", + "kernel-modules", + "kernel-modules-extra", + "kernel-network-modules", + "livenet", + "lvm", + "mdraid", + "multipath", + "qemu", + "qemu-net", + "fcoe", + "fcoe-uefi", + "iscsi", + "lunmask", + "nfs", + "resume", + "rootfs-block", + "terminfo", + "udev-rules", + "biosdevname", + "dracut-systemd", + "pollcdrom", + "usrmount", + "base", + "fs-lib", + "img-lib", + "shutdown", + "uefi-lib", + } + return &osbuild.DracutStageOptions{ + Kernel: kernel, + Modules: modules, + Install: []string{"/.buildstamp"}, + } +} + +func (t *imageTypeS2) kickstartStageOptions(ostreeURL string) *osbuild.KickstartStageOptions { + return &osbuild.KickstartStageOptions{ + Path: "/usr/share/anaconda/interactive-defaults.ks", + OSTree: osbuild.OSTreeOptions{ + OSName: "rhel", + URL: ostreeURL, + Ref: t.OSTreeRef(), + GPG: false, + }, + } +} + +func (t *imageTypeS2) bootISOMonoStageOptions(kernelVer string) *osbuild.BootISOMonoStageOptions { + return &osbuild.BootISOMonoStageOptions{ + Product: osbuild.Product{ + Name: "Red Hat Enterprise Linux", + Version: "8.4", + }, + ISOLabel: fmt.Sprintf("RHEL-8-4-0-BaseOS-%s", t.Arch().Name()), + Kernel: kernelVer, + EFI: osbuild.EFI{ + Architectures: []string{ + "IA32", + "X64", + }, + Vendor: "redhat", + }, + ISOLinux: osbuild.ISOLinux{ + Enabled: true, + Debug: false, + }, + Templates: "80-rhel", + RootFS: osbuild.RootFS{ + Size: 4096, + Compression: osbuild.FSCompression{ + Method: "xz", + Options: osbuild.FSCompressionOptions{ + // TODO: based on image arch + BCJ: "x86", + }, + }, + }, + } +} + +func (t *imageTypeS2) bootISOMonoStageInputs() *osbuild.BootISOMonoStageInputs { + rootfsInput := new(osbuild.BootISOMonoStageInput) + rootfsInput.Type = "org.osbuild.tree" + rootfsInput.Origin = "org.osbuild.pipeline" + rootfsInput.References = osbuild.BootISOMonoStageReferences{"name:anaconda-tree"} + return &osbuild.BootISOMonoStageInputs{ + RootFS: rootfsInput, + } +} + +func (t *imageTypeS2) discinfoStageOptions() *osbuild.DiscinfoStageOptions { + return &osbuild.DiscinfoStageOptions{ + BaseArch: t.Arch().Name(), + Release: "202010217.n.0", + } +} + +func (t *imageTypeS2) xorrisofsStageOptions() *osbuild.XorrisofsStageOptions { + return &osbuild.XorrisofsStageOptions{ + Filename: t.Filename(), + VolID: fmt.Sprintf("RHEL-8-4-0-BaseOS-%s", t.Arch().Name()), + Boot: osbuild.XorrisofsBoot{ + Image: "isolinux/isolinux.bin", + Catalog: "isolinux/boot.cat", + }, + EFI: "images/efiboot.img", + IsohybridMBR: "/usr/share/syslinux/isohdpfx.bin", + } +} + +func (t *imageTypeS2) xorrisofsStageInputs() *osbuild.XorrisofsStageInputs { + input := new(osbuild.XorrisofsStageInput) + input.Type = "org.osbuild.tree" + input.Origin = "org.osbuild.pipeline" + input.References = osbuild.XorrisofsStageReferences{"name:bootiso-tree"} + return &osbuild.XorrisofsStageInputs{Tree: input} +} diff --git a/internal/store/json.go b/internal/store/json.go index db5d5971b..8bfa6c346 100644 --- a/internal/store/json.go +++ b/internal/store/json.go @@ -338,6 +338,7 @@ var imageTypeCompatMapping = map[string]string{ "fedora-iot-commit": "fedora-iot-commit", "rhel-edge-commit": "rhel-edge-commit", "rhel-edge-container": "rhen-edge-container", + "rhel-edge-installer": "rhen-edge-installer", "test_type": "test_type", // used only in json_test.go "test_type_invalid": "test_type_invalid", // used only in json_test.go }