Skip to content
Merged
Show file tree
Hide file tree
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
106 changes: 34 additions & 72 deletions pkg/distro/defs/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ type DistroYAML struct {
// based on the distro, ideally it would not have this but
// here we are.
DistroLike manifest.Distro `yaml:"distro_like"`

// set by the loader
ID distro.ID
}

func (d *DistroYAML) ImageTypes() map[string]ImageTypeYAML {
Expand All @@ -118,23 +121,16 @@ func (d *DistroYAML) ImageConfig() *distro.ImageConfig {
}

func (d *DistroYAML) SkipImageType(imgTypeName, archName string) bool {
id := common.Must(distro.ParseID(d.Name))

for _, cond := range d.Conditions {
if cond.When.Eval(id, archName) && slices.Contains(cond.IgnoreImageTypes, imgTypeName) {
if cond.When.Eval(d.ID, archName) && slices.Contains(cond.IgnoreImageTypes, imgTypeName) {
return true
}
}

return false
}

func (d *DistroYAML) runTemplates(nameVer string) error {
id, err := distro.ParseID(nameVer)
if err != nil {
return err
}

func (d *DistroYAML) runTemplates(id distro.ID) error {
var errs []error
subs := func(inp string) string {
var buf bytes.Buffer
Expand Down Expand Up @@ -193,11 +189,6 @@ func NewDistroYAML(nameVer string) (*DistroYAML, error) {
return nil, err
}

// ParseID will also canonicalize the name
if id, err := ParseID(nameVer); err == nil && id != nil {
nameVer = id.String()
}

var foundDistro *DistroYAML
for _, distro := range distros.Distros {
if distro.Name == nameVer {
Expand All @@ -219,7 +210,13 @@ func NewDistroYAML(nameVer string) (*DistroYAML, error) {
if foundDistro == nil {
return nil, nil
}
if err := foundDistro.runTemplates(nameVer); err != nil {
// having "foundDistro.id" avoid re-parsing this in the various helpers
id, err := distro.ParseID(nameVer)
if err != nil {
return nil, err
}
foundDistro.ID = *id
if err := foundDistro.runTemplates(*id); err != nil {
return nil, err
}

Expand Down Expand Up @@ -247,10 +244,7 @@ func NewDistroYAML(nameVer string) (*DistroYAML, error) {
foundDistro.imageTypes[name] = v
}
}
foundDistro.imageConfig, err = toplevel.ImageConfig.For(nameVer)
if err != nil {
return nil, err
}
foundDistro.imageConfig = toplevel.ImageConfig.For(foundDistro.ID)

return foundDistro, nil
}
Expand Down Expand Up @@ -279,7 +273,7 @@ type whenCondition struct {
VersionEqual string `yaml:"version_equal,omitempty"`
}

func (wc *whenCondition) Eval(id *distro.ID, archStr string) bool {
func (wc *whenCondition) Eval(id distro.ID, archStr string) bool {
match := true

if wc.DistroName != "" {
Expand All @@ -292,10 +286,10 @@ func (wc *whenCondition) Eval(id *distro.ID, archStr string) bool {
match = match && (wc.Architecture == archStr)
}
if wc.VersionLessThan != "" {
match = match && (common.VersionLessThan(versionStringForVerCmp(*id), wc.VersionLessThan))
match = match && (common.VersionLessThan(versionStringForVerCmp(id), wc.VersionLessThan))
}
if wc.VersionGreaterOrEqual != "" {
match = match && (common.VersionGreaterThanOrEqual(versionStringForVerCmp(*id), wc.VersionGreaterOrEqual))
match = match && (common.VersionGreaterThanOrEqual(versionStringForVerCmp(id), wc.VersionGreaterOrEqual))
}
if wc.VersionEqual != "" {
match = match && (id.VersionString() == wc.VersionEqual)
Expand All @@ -304,14 +298,10 @@ func (wc *whenCondition) Eval(id *distro.ID, archStr string) bool {
return match
}

func (di *distroImageConfig) For(nameVer string) (*distro.ImageConfig, error) {
func (di *distroImageConfig) For(id distro.ID) *distro.ImageConfig {
imgConfig := di.Default

if di.Conditions != nil {
id, err := distro.ParseID(nameVer)
if err != nil {
return nil, err
}
for _, cond := range di.Conditions {
// distro image config cannot have architecure
// specific conditions
Expand All @@ -322,7 +312,7 @@ func (di *distroImageConfig) For(nameVer string) (*distro.ImageConfig, error) {
}
}

return imgConfig, nil
return imgConfig
}

type distroImageConfigConditions struct {
Expand Down Expand Up @@ -409,13 +399,9 @@ func (it *ImageTypeYAML) Name() string {
return it.name
}

func (it *ImageTypeYAML) PlatformsFor(distroNameVer string) ([]platform.PlatformConf, error) {
func (it *ImageTypeYAML) PlatformsFor(id distro.ID) ([]platform.PlatformConf, error) {
pl := it.InternalPlatforms
if it.PlatformsOverride != nil {
id, err := distro.ParseID(distroNameVer)
if err != nil {
return nil, err
}
var nMatches int
for _, cond := range it.PlatformsOverride.Conditions {
// arch does not make sense for platform overrides
Expand Down Expand Up @@ -548,7 +534,7 @@ func versionStringForVerCmp(u distro.ID) string {

// PackageSets loads the PackageSets from the yaml source file
// discovered via the imagetype.
func (imgType *ImageTypeYAML) PackageSets(distroNameVer, archName string) (map[string]rpmmd.PackageSet, error) {
func (imgType *ImageTypeYAML) PackageSets(id distro.ID, archName string) map[string]rpmmd.PackageSet {
res := make(map[string]rpmmd.PackageSet)
for key, pkgSets := range imgType.PackageSetsYAML {
var rpmmdPkgSet rpmmd.PackageSet
Expand All @@ -559,11 +545,6 @@ func (imgType *ImageTypeYAML) PackageSets(distroNameVer, archName string) (map[s
})

if pkgSet.Conditions != nil {
id, err := distro.ParseID(distroNameVer)
if err != nil {
return nil, err
}

for _, cond := range pkgSet.Conditions {
if cond.When.Eval(id, archName) {
rpmmdPkgSet = rpmmdPkgSet.Append(rpmmd.PackageSet{
Expand All @@ -580,24 +561,20 @@ func (imgType *ImageTypeYAML) PackageSets(distroNameVer, archName string) (map[s
res[key] = rpmmdPkgSet
}

return res, nil
return res
}

// PartitionTable returns the partionTable for the given distro/imgType.
func (imgType *ImageTypeYAML) PartitionTable(distroNameVer, archName string) (*disk.PartitionTable, error) {
func (imgType *ImageTypeYAML) PartitionTable(id distro.ID, archName string) (*disk.PartitionTable, error) {
if imgType.PartitionTables == nil {
return nil, fmt.Errorf("%w: %q", ErrNoPartitionTableForImgType, distroNameVer)
return nil, fmt.Errorf("%w: %q", ErrNoPartitionTableForImgType, id)
}
pt, ok := imgType.PartitionTables[archName]
if !ok {
return nil, fmt.Errorf("%w (%q): %q", ErrNoPartitionTableForArch, distroNameVer, archName)
return nil, fmt.Errorf("%w (%q): %q", ErrNoPartitionTableForArch, id, archName)
}

if imgType.PartitionTablesOverrides != nil {
id, err := distro.ParseID(distroNameVer)
if err != nil {
return nil, err
}
for _, cond := range imgType.PartitionTablesOverrides.Conditions {
if cond.When.Eval(id, archName) {
pt = cond.Override[archName]
Expand All @@ -609,43 +586,28 @@ func (imgType *ImageTypeYAML) PartitionTable(distroNameVer, archName string) (*d
}

// ImageConfig returns the image type specific ImageConfig
func (imgType *ImageTypeYAML) ImageConfig(distroNameVer, archName string) (*distro.ImageConfig, error) {
func (imgType *ImageTypeYAML) ImageConfig(id distro.ID, archName string) *distro.ImageConfig {
imgConfig := imgType.ImageConfigYAML.ImageConfig
condMap := imgType.ImageConfigYAML.Conditions
if condMap != nil {
id, err := distro.ParseID(distroNameVer)
if err != nil {
return nil, err
}
for _, cond := range imgType.ImageConfigYAML.Conditions {
if cond.When.Eval(id, archName) {
imgConfig = cond.ShallowMerge.InheritFrom(imgConfig)

for _, cond := range condMap {
if cond.When.Eval(id, archName) {
imgConfig = cond.ShallowMerge.InheritFrom(imgConfig)
}
}
}

return imgConfig, nil
return imgConfig
}

// InstallerConfig returns the InstallerConfig for the given imgType
// Note that on conditions the InstallerConfig is fully replaced, do
// any merging in YAML
func (imgType *ImageTypeYAML) InstallerConfig(distroNameVer, archName string) (*distro.InstallerConfig, error) {
func (imgType *ImageTypeYAML) InstallerConfig(id distro.ID, archName string) *distro.InstallerConfig {
installerConfig := imgType.InstallerConfigYAML.InstallerConfig
condMap := imgType.InstallerConfigYAML.Conditions
if condMap != nil {
id, err := distro.ParseID(distroNameVer)
if err != nil {
return nil, err
}

for _, cond := range condMap {
if cond.When.Eval(id, archName) {
installerConfig = cond.ShallowMerge.InheritFrom(installerConfig)
}
for _, cond := range imgType.InstallerConfigYAML.Conditions {
if cond.When.Eval(id, archName) {
installerConfig = cond.ShallowMerge.InheritFrom(installerConfig)
}
}

return installerConfig, nil
return installerConfig
}
Loading