Skip to content
Merged
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
118 changes: 51 additions & 67 deletions mantle/platform/metal.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,21 +78,21 @@ func (inst *Install) PXE(kargs []string, ignition string) (*InstalledMachine, er
if inst.CosaBuild.BuildArtifacts.Kernel == nil {
return nil, fmt.Errorf("build %s has no legacy installer kernel", inst.CosaBuild.OstreeVersion)
}
mach, err = inst.runLegacy(&kernelSetup{
mach, err = inst.runPXE(&kernelSetup{
kernel: inst.CosaBuild.BuildArtifacts.Kernel.Path,
initramfs: inst.CosaBuild.BuildArtifacts.Initramfs.Path,
})
}, true)
if err != nil {
return nil, errors.Wrapf(err, "legacy installer")
}
} else {
if inst.CosaBuild.BuildArtifacts.LiveKernel == nil {
return nil, fmt.Errorf("build %s has no live installer kernel", inst.CosaBuild.Name)
}
mach, err = inst.runLive(&kernelSetup{
mach, err = inst.runPXE(&kernelSetup{
kernel: inst.CosaBuild.BuildArtifacts.LiveKernel.Path,
initramfs: inst.CosaBuild.BuildArtifacts.LiveInitramfs.Path,
})
}, false)
if err != nil {
return nil, errors.Wrapf(err, "testing live installer")
}
Expand Down Expand Up @@ -148,59 +148,43 @@ func absSymlink(src, dest string) error {
return os.Symlink(src, dest)
}

func (inst *Install) setupTftpDir(builddir, tftpdir, metalimg string, kern *kernelSetup) error {
serializedConfig := []byte(inst.ignition)
if err := ioutil.WriteFile(filepath.Join(tftpdir, "config.ign"), serializedConfig, 0644); err != nil {
return err
}

// setupMetalImage handles compressing the metal image if necessary,
// or just creating a symlink to it.
func setupMetalImage(builddir, metalimg, destdir string) (string, error) {
metalIsCompressed := !strings.HasSuffix(metalimg, ".raw")
metalname := metalimg
if !metalIsCompressed {
fmt.Println("Compressing metal image")
metalimgpath := filepath.Join(builddir, metalimg)
srcf, err := os.Open(metalimgpath)
if err != nil {
return err
return "", err
}
defer srcf.Close()
metalname = metalname + ".gz"
destf, err := os.OpenFile(filepath.Join(tftpdir, metalname), os.O_RDWR|os.O_CREATE, 0755)
destf, err := os.OpenFile(filepath.Join(destdir, metalname), os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
return err
return "", err
}
defer destf.Close()
cmd := exec.Command("gzip", "-1")
cmd.Stdin = srcf
cmd.Stdout = destf
if err := cmd.Run(); err != nil {
return errors.Wrapf(err, "running gzip")
return "", errors.Wrapf(err, "running gzip")
}
return metalname, nil
} else {
if err := absSymlink(filepath.Join(builddir, metalimg), filepath.Join(tftpdir, metalimg)); err != nil {
return err
if err := absSymlink(filepath.Join(builddir, metalimg), filepath.Join(destdir, metalimg)); err != nil {
return "", err
}
return metalimg, nil
}

for _, name := range []string{kern.kernel, kern.initramfs} {
if err := absSymlink(filepath.Join(builddir, name), filepath.Join(tftpdir, name)); err != nil {
return err
}
}

return nil
}

func (inst *Install) setup(kern *kernelSetup) (*installerRun, error) {
if kern.kernel == "" {
return nil, fmt.Errorf("Missing kernel artifact")
}
if kern.initramfs == "" {
return nil, fmt.Errorf("Missing initramfs artifact")
}

func newQemuBuilder(firmware string) *QemuBuilder {
builder := NewBuilder("", false)
builder.Firmware = inst.Firmware
builder.Firmware = firmware
builder.AddDisk(&Disk{
Size: "12G", // Arbitrary
})
Expand All @@ -215,6 +199,19 @@ func (inst *Install) setup(kern *kernelSetup) (*installerRun, error) {
// For now, but in the future we should rely on log capture
builder.InheritConsole = true

return builder
}

func (inst *Install) setup(kern *kernelSetup) (*installerRun, error) {
if kern.kernel == "" {
return nil, fmt.Errorf("Missing kernel artifact")
}
if kern.initramfs == "" {
return nil, fmt.Errorf("Missing initramfs artifact")
}

builder := newQemuBuilder(inst.Firmware)

tempdir, err := ioutil.TempDir("", "kola-testiso")
if err != nil {
return nil, err
Expand All @@ -232,15 +229,21 @@ func (inst *Install) setup(kern *kernelSetup) (*installerRun, error) {
}

builddir := filepath.Dir(inst.CosaBuildDir)
metalimg := inst.CosaBuild.BuildArtifacts.Metal.Path
metalname := metalimg
// Yeah this is duplicated with setupTftpDir
if strings.HasSuffix(metalimg, ".raw") {
metalname = metalimg + ".gz"
serializedConfig := []byte(inst.ignition)
if err := ioutil.WriteFile(filepath.Join(tftpdir, "config.ign"), serializedConfig, 0644); err != nil {
return nil, err
}

if err := inst.setupTftpDir(builddir, tftpdir, metalimg, kern); err != nil {
return nil, err
for _, name := range []string{kern.kernel, kern.initramfs} {
if err := absSymlink(filepath.Join(builddir, name), filepath.Join(tftpdir, name)); err != nil {
return nil, err
}
}

metalimg := inst.CosaBuild.BuildArtifacts.Metal.Path
metalname, err := setupMetalImage(builddir, metalimg, tftpdir)
if err != nil {
return nil, errors.Wrapf(err, "setting up metal image")
}

pxe := pxeSetup{}
Expand Down Expand Up @@ -296,7 +299,7 @@ func (inst *Install) setup(kern *kernelSetup) (*installerRun, error) {
}, nil
}

func renderBaseKargs(t *installerRun) []string {
func renderBaseKargs() []string {
return append(baseKargs, fmt.Sprintf("console=%s", consoleKernelArgument[system.RpmArch()]))
}

Expand Down Expand Up @@ -411,40 +414,21 @@ func (t *installerRun) run() (*QemuInstance, error) {
return inst, nil
}

func (inst *Install) runLegacy(kern *kernelSetup) (*InstalledMachine, error) {
func (inst *Install) runPXE(kern *kernelSetup, legacy bool) (*InstalledMachine, error) {
t, err := inst.setup(kern)
if err != nil {
return nil, err
}
defer t.destroy()

kargs := append(renderBaseKargs(t), renderInstallKargs(t)...)
if err := t.completePxeSetup(kargs); err != nil {
return nil, err
kargs := renderBaseKargs()
if !legacy {
// https://github.com/coreos/fedora-coreos-tracker/issues/388
// https://github.com/coreos/fedora-coreos-docs/pull/46
t.builder.Memory = int(math.Max(float64(t.builder.Memory), 4096))
kargs = append(kargs, liveKargs...)
}
qinst, err := t.run()
if err != nil {
return nil, err
}
t.tempdir = "" // Transfer ownership
return &InstalledMachine{
QemuInst: qinst,
tempdir: t.tempdir,
}, nil
}

func (inst *Install) runLive(kern *kernelSetup) (*InstalledMachine, error) {
t, err := inst.setup(kern)
if err != nil {
return nil, err
}
defer t.destroy()

// https://github.com/coreos/fedora-coreos-tracker/issues/388
// https://github.com/coreos/fedora-coreos-docs/pull/46
t.builder.Memory = int(math.Max(float64(t.builder.Memory), 4096))

kargs := append(renderBaseKargs(t), liveKargs...)
kargs = append(kargs, renderInstallKargs(t)...)
if err := t.completePxeSetup(kargs); err != nil {
return nil, err
Expand Down