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
No known key found for this signature in database
GPG Key ID: 286DCAFD2C97DDE3
2 changed files with 80 additions and 9 deletions

View File

@ -34,18 +34,24 @@ func CurrentImage() (string, error) {
return artifact.ContainerName(registryAndOrg)
}
func ListReleases(includePrereleases bool) ([]string, error) {
func ListAllReleases(includePrereleases bool) ([]string, error) {
var err error
providerTags, err := getReleasesFromProvider(includePrereleases)
tagList, err := allReleases()
if err != nil {
fmt.Printf("warn: %s", err.Error())
return []string{}, err
}
if len(providerTags) != 0 {
return providerTags, nil
if !includePrereleases {
tagList = tagList.NoPrereleases()
}
return tagList.FullImages()
}
func ListNewerReleases(includePrereleases bool) ([]string, error) {
var err error
tagList, err := newerReleases()
if err != nil {
return []string{}, err
@ -98,6 +104,25 @@ func upgrade(source string, force, strictValidations bool, dirs []string, preRel
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) {
artifact, err := versioneer.NewArtifactFromOSRelease()
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/utils"
"github.com/mudler/go-pluggable"
"github.com/kairos-io/kairos-agent/v2/internal/agent"
"github.com/kairos-io/kairos-agent/v2/internal/bus"
@ -21,6 +22,7 @@ import (
agentConfig "github.com/kairos-io/kairos-agent/v2/pkg/config"
v1 "github.com/kairos-io/kairos-agent/v2/pkg/types/v1"
"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/machine"
"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)",
},
&cli.BoolFlag{Name: "pre", Usage: "Include pre-releases (rc, beta, alpha)"},
&cli.BoolFlag{Name: "all", Usage: "Include older releases"},
},
Name: "list-releases",
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.Println("Available releases with higher versions:")
releases, err := agent.ListReleases(c.Bool("pre"))
var tags []string
tags, err = getReleasesFromProvider(c.Bool("pre"))
if err != nil {
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")
return nil
}
for _, r := range releases {
for _, r := range tags {
fmt.Println(r)
}
@ -779,3 +805,23 @@ func validateSource(source string) error {
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
}