Blame internal/osbuild/stage.go

Packit 63bb0d
package osbuild
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"encoding/json"
Packit 63bb0d
	"fmt"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// A Stage transforms a filesystem tree.
Packit 63bb0d
type Stage struct {
Packit 63bb0d
	// Well-known name in reverse domain-name notation, uniquely identifying
Packit 63bb0d
	// the stage type.
Packit 63bb0d
	Name string `json:"name"`
Packit 63bb0d
	// Stage-type specific options fully determining the operations of the
Packit 63bb0d
	// stage.
Packit 63bb0d
	Options StageOptions `json:"options"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// StageOptions specify the operations of a given stage-type.
Packit 63bb0d
type StageOptions interface {
Packit 63bb0d
	isStageOptions()
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type rawStage struct {
Packit 63bb0d
	Name    string          `json:"name"`
Packit 63bb0d
	Options json.RawMessage `json:"options"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// UnmarshalJSON unmarshals JSON into a Stage object. Each type of stage has
Packit 63bb0d
// a custom unmarshaller for its options, selected based on the stage name.
Packit 63bb0d
func (stage *Stage) UnmarshalJSON(data []byte) error {
Packit 63bb0d
	var rawStage rawStage
Packit 63bb0d
	err := json.Unmarshal(data, &rawStage)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
	var options StageOptions
Packit 63bb0d
	switch rawStage.Name {
Packit 63bb0d
	case "org.osbuild.fix-bls":
Packit 63bb0d
		// TODO: verify that we can unmarshall this also if "options" is omitted
Packit 63bb0d
		options = new(FixBLSStageOptions)
Packit 63bb0d
	case "org.osbuild.fstab":
Packit 63bb0d
		options = new(FSTabStageOptions)
Packit 63bb0d
	case "org.osbuild.grub2":
Packit 63bb0d
		options = new(GRUB2StageOptions)
Packit 63bb0d
	case "org.osbuild.locale":
Packit 63bb0d
		options = new(LocaleStageOptions)
Packit 63bb0d
	case "org.osbuild.selinux":
Packit 63bb0d
		options = new(SELinuxStageOptions)
Packit 63bb0d
	case "org.osbuild.hostname":
Packit 63bb0d
		options = new(HostnameStageOptions)
Packit 63bb0d
	case "org.osbuild.users":
Packit 63bb0d
		options = new(UsersStageOptions)
Packit 63bb0d
	case "org.osbuild.groups":
Packit 63bb0d
		options = new(GroupsStageOptions)
Packit 63bb0d
	case "org.osbuild.timezone":
Packit 63bb0d
		options = new(TimezoneStageOptions)
Packit 63bb0d
	case "org.osbuild.chrony":
Packit 63bb0d
		options = new(ChronyStageOptions)
Packit 63bb0d
	case "org.osbuild.keymap":
Packit 63bb0d
		options = new(KeymapStageOptions)
Packit 63bb0d
	case "org.osbuild.firewall":
Packit 63bb0d
		options = new(FirewallStageOptions)
Packit Service bcdfb1
	case "org.osbuild.rhsm":
Packit Service bcdfb1
		options = new(RHSMStageOptions)
Packit 63bb0d
	case "org.osbuild.rpm":
Packit 63bb0d
		options = new(RPMStageOptions)
Packit 63bb0d
	case "org.osbuild.rpm-ostree":
Packit 63bb0d
		options = new(RPMOSTreeStageOptions)
Packit 63bb0d
	case "org.osbuild.systemd":
Packit 63bb0d
		options = new(SystemdStageOptions)
Packit 63bb0d
	case "org.osbuild.script":
Packit 63bb0d
		options = new(ScriptStageOptions)
Packit 63bb0d
	default:
Packit 63bb0d
		return fmt.Errorf("unexpected stage name: %s", rawStage.Name)
Packit 63bb0d
	}
Packit 63bb0d
	err = json.Unmarshal(rawStage.Options, options)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	stage.Name = rawStage.Name
Packit 63bb0d
	stage.Options = options
Packit 63bb0d
Packit 63bb0d
	return nil
Packit 63bb0d
}