Add "--all" flag to list-releases to print older releases too

This will allow us to fix the broken test in master and also allow
people to downgrade to older releases.

Signed-off-by: Dimitris Karakasilis <dimitris@karakasilis.me>
This commit is contained in:
Dimitris Karakasilis
2024-01-11 10:05:34 +02:00
parent 53f49169b1
commit 9a8c404cfa
2 changed files with 80 additions and 9 deletions

View File

@@ -34,18 +34,24 @@ func CurrentImage() (string, error) {
return artifact.ContainerName(registryAndOrg) return artifact.ContainerName(registryAndOrg)
} }
func ListReleases(includePrereleases bool) ([]string, error) { func ListAllReleases(includePrereleases bool) ([]string, error) {
var err error var err error
providerTags, err := getReleasesFromProvider(includePrereleases) tagList, err := allReleases()
if err != nil { if err != nil {
fmt.Printf("warn: %s", err.Error()) return []string{}, err
} }
if len(providerTags) != 0 { if !includePrereleases {
return providerTags, nil tagList = tagList.NoPrereleases()
} }
return tagList.FullImages()
}
func ListNewerReleases(includePrereleases bool) ([]string, error) {
var err error
tagList, err := newerReleases() tagList, err := newerReleases()
if err != nil { if err != nil {
return []string{}, err return []string{}, err
@@ -98,6 +104,25 @@ func upgrade(source string, force, strictValidations bool, dirs []string, preRel
return hook.Run(*c, upgradeSpec, hook.AfterUpgrade...) return hook.Run(*c, upgradeSpec, hook.AfterUpgrade...)
} }
func allReleases() (versioneer.TagList, error) {
artifact, err := versioneer.NewArtifactFromOSRelease()
if err != nil {
return versioneer.TagList{}, err
}
registryAndOrg, err := utils.OSRelease("REGISTRY_AND_ORG")
if err != nil {
return versioneer.TagList{}, err
}
tagList, err := artifact.TagList(registryAndOrg)
if err != nil {
return tagList, err
}
return tagList.OtherAnyVersion().RSorted(), nil
}
func newerReleases() (versioneer.TagList, error) { func newerReleases() (versioneer.TagList, error) {
artifact, err := versioneer.NewArtifactFromOSRelease() artifact, err := versioneer.NewArtifactFromOSRelease()
if err != nil { if err != nil {

54
main.go
View File

@@ -13,6 +13,7 @@ import (
"github.com/kairos-io/kairos-agent/v2/pkg/action" "github.com/kairos-io/kairos-agent/v2/pkg/action"
"github.com/kairos-io/kairos-agent/v2/pkg/utils" "github.com/kairos-io/kairos-agent/v2/pkg/utils"
"github.com/mudler/go-pluggable"
"github.com/kairos-io/kairos-agent/v2/internal/agent" "github.com/kairos-io/kairos-agent/v2/internal/agent"
"github.com/kairos-io/kairos-agent/v2/internal/bus" "github.com/kairos-io/kairos-agent/v2/internal/bus"
@@ -21,6 +22,7 @@ import (
agentConfig "github.com/kairos-io/kairos-agent/v2/pkg/config" agentConfig "github.com/kairos-io/kairos-agent/v2/pkg/config"
v1 "github.com/kairos-io/kairos-agent/v2/pkg/types/v1" v1 "github.com/kairos-io/kairos-agent/v2/pkg/types/v1"
"github.com/kairos-io/kairos-sdk/bundles" "github.com/kairos-io/kairos-sdk/bundles"
events "github.com/kairos-io/kairos-sdk/bus"
"github.com/kairos-io/kairos-sdk/collector" "github.com/kairos-io/kairos-sdk/collector"
"github.com/kairos-io/kairos-sdk/machine" "github.com/kairos-io/kairos-sdk/machine"
"github.com/kairos-io/kairos-sdk/schema" "github.com/kairos-io/kairos-sdk/schema"
@@ -95,6 +97,7 @@ See https://kairos.io/docs/upgrade/manual/ for documentation.
Usage: "Output format (json|yaml|terminal)", Usage: "Output format (json|yaml|terminal)",
}, },
&cli.BoolFlag{Name: "pre", Usage: "Include pre-releases (rc, beta, alpha)"}, &cli.BoolFlag{Name: "pre", Usage: "Include pre-releases (rc, beta, alpha)"},
&cli.BoolFlag{Name: "all", Usage: "Include older releases"},
}, },
Name: "list-releases", Name: "list-releases",
Description: `List all available releases versions`, Description: `List all available releases versions`,
@@ -105,18 +108,41 @@ See https://kairos.io/docs/upgrade/manual/ for documentation.
} }
fmt.Printf("Current image:\n%s\n\n", currentImage) fmt.Printf("Current image:\n%s\n\n", currentImage)
fmt.Println("Available releases with higher versions:") var tags []string
releases, err := agent.ListReleases(c.Bool("pre")) tags, err = getReleasesFromProvider(c.Bool("pre"))
if err != nil { if err != nil {
return err return err
} }
if len(releases) == 0 { // Provider returns tags. Print and return.
if len(tags) > 0 {
fmt.Println("Available releases from provider:")
for _, r := range tags {
fmt.Println(r)
return nil
}
}
if c.Bool("all") {
fmt.Println("Available releases (all):")
tags, err = agent.ListAllReleases(c.Bool("pre"))
if err != nil {
return err
}
} else {
fmt.Println("Available releases with higher version:")
tags, err = agent.ListNewerReleases(c.Bool("pre"))
if err != nil {
return err
}
}
if len(tags) == 0 {
fmt.Println("No newer releases found") fmt.Println("No newer releases found")
return nil return nil
} }
for _, r := range releases { for _, r := range tags {
fmt.Println(r) fmt.Println(r)
} }
@@ -779,3 +805,23 @@ func validateSource(source string) error {
return nil return nil
} }
func getReleasesFromProvider(includePrereleases bool) ([]string, error) {
var tags []string
bus.Manager.Response(events.EventAvailableReleases, func(p *pluggable.Plugin, r *pluggable.EventResponse) {
if r.Data == "" {
return
}
if err := json.Unmarshal([]byte(r.Data), &tags); err != nil {
fmt.Printf("warn: failed unmarshalling data: '%s'\n", err.Error())
}
})
configYAML := fmt.Sprintf("IncludePreReleases: %t", includePrereleases)
_, err := bus.Manager.Publish(events.EventAvailableReleases, events.EventPayload{Config: configYAML})
if err != nil {
return tags, fmt.Errorf("failed publishing event: %w", err)
}
return tags, nil
}