|
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 |
}
|