From 2412d69e326b528c3e9d15d83c6a197aaf6b9501 Mon Sep 17 00:00:00 2001 From: Dimitris Karakasilis Date: Fri, 8 Dec 2023 10:50:01 +0200 Subject: [PATCH] Re-enable call-out to provider for releases Signed-off-by: Dimitris Karakasilis --- go.mod | 2 +- go.sum | 4 +- internal/agent/upgrade.go | 105 ++++++++++++++++---------------------- main.go | 10 +++- 4 files changed, 55 insertions(+), 66 deletions(-) diff --git a/go.mod b/go.mod index 67f423a..2f354dc 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/jaypipes/ghw v0.12.0 github.com/joho/godotenv v1.5.1 - github.com/kairos-io/kairos-sdk v0.0.19-0.20231207121804-e1bdef3f0376 + github.com/kairos-io/kairos-sdk v0.0.19-0.20231208070330-4aaf17c01269 github.com/labstack/echo/v4 v4.11.1 github.com/mitchellh/mapstructure v1.5.0 github.com/mudler/go-nodepair v0.0.0-20221223092639-ba399a66fdfb diff --git a/go.sum b/go.sum index 34ef23c..87f06f9 100644 --- a/go.sum +++ b/go.sum @@ -355,8 +355,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kairos-io/kairos-sdk v0.0.19-0.20231207121804-e1bdef3f0376 h1:PpWh6NDJ+kuQncClfg+hmzAhNSLcEfA0jfpKANA3XEM= -github.com/kairos-io/kairos-sdk v0.0.19-0.20231207121804-e1bdef3f0376/go.mod h1:17dpFG2d3Q/TcT86DlLK5nNXEjlSrkYl7bsvO2cpYGE= +github.com/kairos-io/kairos-sdk v0.0.19-0.20231208070330-4aaf17c01269 h1:7qBdzwCCvgxBXQW6xYF5+KJAD1UJvaYO7EZuZLNm1io= +github.com/kairos-io/kairos-sdk v0.0.19-0.20231208070330-4aaf17c01269/go.mod h1:17dpFG2d3Q/TcT86DlLK5nNXEjlSrkYl7bsvO2cpYGE= github.com/kbinani/screenshot v0.0.0-20210720154843-7d3a670d8329 h1:qq2nCpSrXrmvDGRxW0ruW9BVEV1CN2a9YDOExdt+U0o= github.com/kbinani/screenshot v0.0.0-20210720154843-7d3a670d8329/go.mod h1:2VPVQDR4wO7KXHwP+DAypEy67rXf+okUx2zjgpCxZw4= github.com/kendru/darwin/go/depgraph v0.0.0-20221105232959-877d6a81060c h1:eKb4PqwAMhlqwXw0W3atpKaYaPGlXE/Fwh+xpCEYaPk= diff --git a/internal/agent/upgrade.go b/internal/agent/upgrade.go index 1d8072d..4f873cf 100644 --- a/internal/agent/upgrade.go +++ b/internal/agent/upgrade.go @@ -6,11 +6,13 @@ import ( "strings" hook "github.com/kairos-io/kairos-agent/v2/internal/agent/hooks" + "github.com/mudler/go-pluggable" "github.com/kairos-io/kairos-agent/v2/internal/bus" "github.com/kairos-io/kairos-agent/v2/pkg/action" config "github.com/kairos-io/kairos-agent/v2/pkg/config" v1 "github.com/kairos-io/kairos-agent/v2/pkg/types/v1" + events "github.com/kairos-io/kairos-sdk/bus" "github.com/kairos-io/kairos-sdk/collector" "github.com/kairos-io/kairos-sdk/utils" "github.com/kairos-io/kairos-sdk/versioneer" @@ -30,46 +32,28 @@ func CurrentImage() (string, error) { return artifact.ContainerName(registryAndOrg) } -func ListReleases(includePrereleases bool) (versioneer.TagList, error) { - var tagList versioneer.TagList +func ListReleases(includePrereleases bool) ([]string, error) { var err error - // TODO: Re-enable when the provider also consumes versioneer - // TODO: Somehow pass includePrereleases to the provider? - // bus.Manager.Response(events.EventAvailableReleases, func(p *pluggable.Plugin, r *pluggable.EventResponse) { - // if err := json.Unmarshal([]byte(r.Data), &tagList); err != nil { - // fmt.Printf("warn: failed unmarshalling data: '%s'\n", err.Error()) - // } - // }) - - // if _, err := bus.Manager.Publish(events.EventAvailableReleases, events.EventPayload{}); err != nil { - // fmt.Printf("warn: failed publishing event: '%s'\n", err.Error()) - // } - - // Sort before we filter - // // We got the release list from the bus manager and we don't know if they are sorted, so sort them in reverse to get the latest first - // // TODO: Should we sort? Maybe it's better to leave the sorting to the provider. Maybe there is custom logic baked in and - // // we mess with it? Our provider can definitely do the same kind of sorting because it uses the same versioneer library. - // sort.Sort(sort.Reverse(&tagList)) - - tagList = versioneer.TagList{} // This will come from the provider-kairos above - - if len(tagList.Tags) == 0 { - tagList, err = newerReleases() - if err != nil { - return tagList, err - } - - if !includePrereleases { - tagList = tagList.NoPrereleases() - } + providerTags, err := getReleasesFromProvider(includePrereleases) + if err != nil { + fmt.Printf("warn: %s", err.Error()) } - if len(tagList.Tags) == 0 { - fmt.Println("No newer releases found") + if len(providerTags) != 0 { + return providerTags, nil } - return tagList, nil + tagList, err := newerReleases() + if err != nil { + return []string{}, err + } + + if !includePrereleases { + tagList = tagList.NoPrereleases() + } + + return tagList.FullImages() } func Upgrade( @@ -119,38 +103,15 @@ func newerReleases() (versioneer.TagList, error) { if err != nil { return tagList, err } + //fmt.Printf("tagList.OtherAnyVersion() = %#v\n", tagList.OtherAnyVersion().Tags) + //fmt.Printf("tagList.Images() = %#v\n", tagList.Images().Tags) + // fmt.Println("Tags") + // tagList.NewerAnyVersion().Print() + // fmt.Println("---------------------------") return tagList.NewerAnyVersion().RSorted(), nil } -// TODO: Remove the releavant hook from the provider-kairos too? -// determineUpgradeImage asks the provider plugin for an image or constructs -// it using version and data from /etc/os-release -// func determineUpgradeImage(version string) (*v1.ImageSource, error) { -// var img string -// bus.Manager.Response(events.EventVersionImage, func(p *pluggable.Plugin, r *pluggable.EventResponse) { -// img = r.Data -// }) - -// _, err := bus.Manager.Publish(events.EventVersionImage, &events.VersionImagePayload{ -// Version: version, -// }) -// if err != nil { -// return nil, err -// } - -// if img != "" { -// return v1.NewSrcFromURI(img) -// } - -// registry, err := utils.OSRelease("IMAGE_REPO") -// if err != nil { -// return nil, fmt.Errorf("can't find IMAGE_REPO key under /etc/os-release %w", err) -// } - -// return v1.NewSrcFromURI(fmt.Sprintf("%s:%s", registry, version)) -// } - // generateUpgradeConfForCLIArgs creates a kairos configuration for `--source` and `--recovery` // command line arguments. It will be added to the rest of the configurations. func generateUpgradeConfForCLIArgs(source string, upgradeRecovery bool) (string, error) { @@ -204,3 +165,23 @@ func generateUpgradeSpec(sourceImageURL string, force, strictValidations bool, d return upgradeSpec, c, nil } + +func getReleasesFromProvider(includePrereleases bool) ([]string, error) { + var result []string + bus.Manager.Response(events.EventAvailableReleases, func(p *pluggable.Plugin, r *pluggable.EventResponse) { + if r.Data == "" { + return + } + if err := json.Unmarshal([]byte(r.Data), &result); err != nil { + fmt.Printf("warn: failed unmarshalling data: '%s'\n", err.Error()) + } + }) + + configYAML := "IncludePreReleases: true" + _, err := bus.Manager.Publish(events.EventAvailableReleases, events.EventPayload{Config: configYAML}) + if err != nil { + return result, fmt.Errorf("failed publishing event: %w", err) + } + + return result, nil +} diff --git a/main.go b/main.go index 84dfc75..4ab7f25 100644 --- a/main.go +++ b/main.go @@ -110,7 +110,15 @@ See https://kairos.io/docs/upgrade/manual/ for documentation. if err != nil { return err } - releases.PrintImages() + + if len(releases) == 0 { + fmt.Println("No newer releases found") + return nil + } + + for _, r := range releases { + fmt.Println(r) + } return nil },