Blame internal/blueprint/blueprint.go

Packit 63bb0d
// Package blueprint contains primitives for representing weldr blueprints
Packit 63bb0d
package blueprint
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"encoding/json"
Packit 63bb0d
	"fmt"
Packit 63bb0d
Packit 63bb0d
	"github.com/coreos/go-semver/semver"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// A Blueprint is a high-level description of an image.
Packit 63bb0d
type Blueprint struct {
Packit 63bb0d
	Name           string          `json:"name" toml:"name"`
Packit 63bb0d
	Description    string          `json:"description" toml:"description"`
Packit 63bb0d
	Version        string          `json:"version,omitempty" toml:"version,omitempty"`
Packit 63bb0d
	Packages       []Package       `json:"packages" toml:"packages"`
Packit 63bb0d
	Modules        []Package       `json:"modules" toml:"modules"`
Packit 63bb0d
	Groups         []Group         `json:"groups" toml:"groups"`
Packit 63bb0d
	Customizations *Customizations `json:"customizations,omitempty" toml:"customizations,omitempty"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Change struct {
Packit 63bb0d
	Commit    string    `json:"commit" toml:"commit"`
Packit 63bb0d
	Message   string    `json:"message" toml:"message"`
Packit 63bb0d
	Revision  *int      `json:"revision" toml:"revision"`
Packit 63bb0d
	Timestamp string    `json:"timestamp" toml:"timestamp"`
Packit 63bb0d
	Blueprint Blueprint `json:"-" toml:"-"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// A Package specifies an RPM package.
Packit 63bb0d
type Package struct {
Packit 63bb0d
	Name    string `json:"name" toml:"name"`
Packit 63bb0d
	Version string `json:"version,omitempty" toml:"version,omitempty"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// A group specifies an package group.
Packit 63bb0d
type Group struct {
Packit 63bb0d
	Name string `json:"name" toml:"name"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// DeepCopy returns a deep copy of the blueprint
Packit 63bb0d
// This uses json.Marshal and Unmarshal which are not very efficient
Packit 63bb0d
func (b *Blueprint) DeepCopy() Blueprint {
Packit 63bb0d
	bpJSON, err := json.Marshal(b)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic(err)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var bp Blueprint
Packit 63bb0d
	err = json.Unmarshal(bpJSON, &bp)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic(err)
Packit 63bb0d
	}
Packit 63bb0d
	return bp
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Initialize ensures that the blueprint has sane defaults for any missing fields
Packit 63bb0d
func (b *Blueprint) Initialize() error {
Packit 63bb0d
	if b.Packages == nil {
Packit 63bb0d
		b.Packages = []Package{}
Packit 63bb0d
	}
Packit 63bb0d
	if b.Modules == nil {
Packit 63bb0d
		b.Modules = []Package{}
Packit 63bb0d
	}
Packit 63bb0d
	if b.Groups == nil {
Packit 63bb0d
		b.Groups = []Group{}
Packit 63bb0d
	}
Packit 63bb0d
	if b.Version == "" {
Packit 63bb0d
		b.Version = "0.0.0"
Packit 63bb0d
	}
Packit 63bb0d
	// Return an error if the version is not valid
Packit 63bb0d
	_, err := semver.NewVersion(b.Version)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return fmt.Errorf("Invalid 'version', must use Semantic Versioning: %s", err.Error())
Packit 63bb0d
	}
Packit 63bb0d
	return nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// BumpVersion increments the previous blueprint's version
Packit 63bb0d
// If the old version string is not vaild semver it will use the new version as-is
Packit 63bb0d
// This assumes that the new blueprint's version has already been validated via Initialize
Packit 63bb0d
func (b *Blueprint) BumpVersion(old string) {
Packit 63bb0d
	var ver *semver.Version
Packit 63bb0d
	ver, err := semver.NewVersion(old)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	ver.BumpPatch()
Packit 63bb0d
	b.Version = ver.String()
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// packages, modules, and groups all resolve to rpm packages right now. This
Packit 63bb0d
// function returns a combined list of "name-version" strings.
Packit 63bb0d
func (b *Blueprint) GetPackages() []string {
Packit 63bb0d
	packages := []string{}
Packit 63bb0d
	for _, pkg := range b.Packages {
Packit 63bb0d
		packages = append(packages, pkg.ToNameVersion())
Packit 63bb0d
	}
Packit 63bb0d
	for _, pkg := range b.Modules {
Packit 63bb0d
		packages = append(packages, pkg.ToNameVersion())
Packit 63bb0d
	}
Packit 63bb0d
	for _, group := range b.Groups {
Packit 63bb0d
		packages = append(packages, "@"+group.Name)
Packit 63bb0d
	}
Packit Service bcdfb1
Packit Service bcdfb1
	if kc := b.Customizations.GetKernel(); kc != nil && kc.Name != "" {
Packit Service bcdfb1
		kpkg := Package{Name: b.Customizations.Kernel.Name}
Packit Service bcdfb1
		packages = append(packages, kpkg.ToNameVersion())
Packit Service bcdfb1
	} else { // no Kernel specified; add default
Packit Service bcdfb1
		kpkg := Package{Name: "kernel"}
Packit Service bcdfb1
		packages = append(packages, kpkg.ToNameVersion())
Packit Service bcdfb1
	}
Packit 63bb0d
	return packages
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (p Package) ToNameVersion() string {
Packit 63bb0d
	// Omit version to prevent all packages with prefix of name to be installed
Packit 63bb0d
	if p.Version == "*" || p.Version == "" {
Packit 63bb0d
		return p.Name
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return p.Name + "-" + p.Version
Packit 63bb0d
}