Make "standard" flavor os-release variables optional (#62)

* Make "standard" flavor os-release variables optional

and change ARCH to TARGETARCH to simplify how it's passed down from
Earthly in the kairos repo

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>

* Add SOFTWARE_VERSION_PREFIX in os-release

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>

* Accept SOFTWARE_VERSION_PREFIX in cli

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>

* Fix test

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>

---------

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>
This commit is contained in:
Dimitris Karakasilis
2023-12-14 16:57:03 +02:00
committed by GitHub
parent a8707c113a
commit 74a57eb673
4 changed files with 41 additions and 16 deletions

View File

@@ -28,6 +28,14 @@ const (
unknown = "unknown" unknown = "unknown"
) )
type KeyNotFoundErr struct {
Err error
}
func (err KeyNotFoundErr) Error() string {
return err.Err.Error()
}
func SH(c string) (string, error) { func SH(c string) (string, error) {
cmd := exec.Command("/bin/sh", "-c", c) cmd := exec.Command("/bin/sh", "-c", c)
cmd.Env = os.Environ() cmd.Env = os.Environ()
@@ -83,7 +91,7 @@ func OSRelease(key string, file ...string) (string, error) {
// We try with the old naming without the prefix in case the key wasn't found // We try with the old naming without the prefix in case the key wasn't found
v, exists = release[key] v, exists = release[key]
if !exists { if !exists {
return "", fmt.Errorf("%s key not found", kairosKey) return "", KeyNotFoundErr{Err: fmt.Errorf("%s key not found", kairosKey)}
} }
} }
return v, nil return v, nil

View File

@@ -56,6 +56,13 @@ var (
EnvVars: []string{EnvVarSoftwareVersion}, EnvVars: []string{EnvVarSoftwareVersion},
} }
softwareVersionPrefixFlag *cli.StringFlag = &cli.StringFlag{
Name: "software-version-prefix",
Value: "",
Usage: "the string that separates the Kairos version from the software version (e.g. \"k3s\")",
EnvVars: []string{EnvVarSoftwareVersionPrefix},
}
registryAndOrgFlag *cli.StringFlag = &cli.StringFlag{ registryAndOrgFlag *cli.StringFlag = &cli.StringFlag{
Name: "registry-and-org", Name: "registry-and-org",
Value: "", Value: "",
@@ -99,7 +106,7 @@ func CliCommands() []*cli.Command {
Usage: "generates an artifact name for Kairos OCI images", Usage: "generates an artifact name for Kairos OCI images",
Flags: []cli.Flag{ Flags: []cli.Flag{
flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag, flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag,
versionFlag, softwareVersionFlag, registryAndOrgFlag, versionFlag, softwareVersionFlag, softwareVersionPrefixFlag, registryAndOrgFlag,
}, },
Action: func(cCtx *cli.Context) error { Action: func(cCtx *cli.Context) error {
a := artifactFromFlags(cCtx) a := artifactFromFlags(cCtx)
@@ -118,7 +125,7 @@ func CliCommands() []*cli.Command {
Usage: "generates a name for bootable artifacts (e.g. iso files)", Usage: "generates a name for bootable artifacts (e.g. iso files)",
Flags: []cli.Flag{ Flags: []cli.Flag{
flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag, flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag,
versionFlag, softwareVersionFlag, versionFlag, softwareVersionFlag, softwareVersionPrefixFlag,
}, },
Action: func(cCtx *cli.Context) error { Action: func(cCtx *cli.Context) error {
a := artifactFromFlags(cCtx) a := artifactFromFlags(cCtx)
@@ -157,7 +164,7 @@ func CliCommands() []*cli.Command {
Usage: "generates a set of variables to be appended in the /etc/os-release file", Usage: "generates a set of variables to be appended in the /etc/os-release file",
Flags: []cli.Flag{ Flags: []cli.Flag{
flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag, versionFlag, flavorFlag, flavorReleaseFlag, variantFlag, modelFlag, archFlag, versionFlag,
softwareVersionFlag, registryAndOrgFlag, bugReportURLFlag, projectHomeURLFlag, softwareVersionFlag, softwareVersionPrefixFlag, registryAndOrgFlag, bugReportURLFlag, projectHomeURLFlag,
githubRepoFlag, githubRepoFlag,
}, },
Action: func(cCtx *cli.Context) error { Action: func(cCtx *cli.Context) error {
@@ -189,5 +196,6 @@ func artifactFromFlags(cCtx *cli.Context) Artifact {
Arch: archFlag.Get(cCtx), Arch: archFlag.Get(cCtx),
Version: versionFlag.Get(cCtx), Version: versionFlag.Get(cCtx),
SoftwareVersion: softwareVersionFlag.Get(cCtx), SoftwareVersion: softwareVersionFlag.Get(cCtx),
SoftwareVersionPrefix: softwareVersionPrefixFlag.Get(cCtx),
} }
} }

View File

@@ -20,7 +20,7 @@ var _ = Describe("NewArtifactFromOSRelease", func() {
osReleaseContent = "KAIROS_FLAVOR=opensuse\n" + osReleaseContent = "KAIROS_FLAVOR=opensuse\n" +
"KAIROS_FLAVOR_RELEASE=leap-15.5\n" + "KAIROS_FLAVOR_RELEASE=leap-15.5\n" +
"KAIROS_VARIANT=standard\n" + "KAIROS_VARIANT=standard\n" +
"KAIROS_ARCH=amd64\n" + "KAIROS_TARGETARCH=amd64\n" +
"KAIROS_MODEL=generic\n" + "KAIROS_MODEL=generic\n" +
"KAIROS_RELEASE=v2.4.2\n" + "KAIROS_RELEASE=v2.4.2\n" +
"KAIROS_SOFTWARE_VERSION=v1.26.9+k3s1\n" + "KAIROS_SOFTWARE_VERSION=v1.26.9+k3s1\n" +

View File

@@ -18,7 +18,7 @@ const (
EnvVarFlavorRelease = "FLAVOR_RELEASE" EnvVarFlavorRelease = "FLAVOR_RELEASE"
EnvVarVariant = "VARIANT" EnvVarVariant = "VARIANT"
EnvVarModel = "MODEL" EnvVarModel = "MODEL"
EnvVarArch = "ARCH" EnvVarArch = "TARGETARCH"
EnvVarSoftwareVersion = "SOFTWARE_VERSION" EnvVarSoftwareVersion = "SOFTWARE_VERSION"
EnvVarSoftwareVersionPrefix = "SOFTWARE_VERSION_PREFIX" EnvVarSoftwareVersionPrefix = "SOFTWARE_VERSION_PREFIX"
EnvVarRegistryAndOrg = "REGISTRY_AND_ORG" EnvVarRegistryAndOrg = "REGISTRY_AND_ORG"
@@ -74,10 +74,16 @@ func NewArtifactFromOSRelease(file ...string) (*Artifact, error) {
if result.Version, err = utils.OSRelease(EnvVarVersion, file...); err != nil { if result.Version, err = utils.OSRelease(EnvVarVersion, file...); err != nil {
return nil, err return nil, err
} }
if result.SoftwareVersion, err = utils.OSRelease(EnvVarSoftwareVersion, file...); err != nil {
// Optional, could be missing
result.SoftwareVersion, err = utils.OSRelease(EnvVarSoftwareVersion, file...)
if err != nil && !errors.As(err, &utils.KeyNotFoundErr{}) {
return nil, err return nil, err
} }
if result.SoftwareVersionPrefix, err = utils.OSRelease(EnvVarSoftwareVersionPrefix, file...); err != nil {
// Optional, could be missing
result.SoftwareVersionPrefix, err = utils.OSRelease(EnvVarSoftwareVersionPrefix, file...)
if err != nil && !errors.As(err, &utils.KeyNotFoundErr{}) {
return nil, err return nil, err
} }
@@ -229,7 +235,7 @@ func (a *Artifact) OSReleaseVariables(registryAndOrg, githubRepo, bugURL, homeUR
"KAIROS_FLAVOR_RELEASE": a.FlavorRelease, "KAIROS_FLAVOR_RELEASE": a.FlavorRelease,
"KAIROS_VARIANT": a.Variant, "KAIROS_VARIANT": a.Variant,
"KAIROS_MODEL": a.Model, "KAIROS_MODEL": a.Model,
"KAIROS_ARCH": a.Arch, "KAIROS_TARGETARCH": a.Arch,
"KAIROS_RELEASE": a.Version, "KAIROS_RELEASE": a.Version,
"KAIROS_REGISTRY_AND_ORG": registryAndOrg, "KAIROS_REGISTRY_AND_ORG": registryAndOrg,
} }
@@ -245,6 +251,9 @@ func (a *Artifact) OSReleaseVariables(registryAndOrg, githubRepo, bugURL, homeUR
if a.SoftwareVersion != "" { if a.SoftwareVersion != "" {
vars["KAIROS_SOFTWARE_VERSION"] = a.SoftwareVersion vars["KAIROS_SOFTWARE_VERSION"] = a.SoftwareVersion
} }
if a.SoftwareVersionPrefix != "" {
vars["KAIROS_SOFTWARE_VERSION_PREFIX"] = a.SoftwareVersionPrefix
}
result := "" result := ""
for k, v := range vars { for k, v := range vars {