From fe03afa167d97a4db07750ed91dd97159d4a79cf Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Thu, 18 Aug 2022 13:12:05 +0000 Subject: [PATCH] art: Expose to sdk upgrade/list events --- internal/agent/upgrade.go | 56 +++++++++++++++++++++++++++++++++---- internal/github/releases.go | 49 -------------------------------- 2 files changed, 50 insertions(+), 55 deletions(-) delete mode 100644 internal/github/releases.go diff --git a/internal/agent/upgrade.go b/internal/agent/upgrade.go index 0259e4f..9ee95ca 100644 --- a/internal/agent/upgrade.go +++ b/internal/agent/upgrade.go @@ -2,36 +2,80 @@ package agent import ( "context" + "encoding/json" "fmt" "os" "os/exec" "strings" - "github.com/c3os-io/c3os/internal/github" + events "github.com/c3os-io/c3os/sdk/bus" + + "github.com/c3os-io/c3os/internal/bus" + "github.com/c3os-io/c3os/pkg/github" "github.com/c3os-io/c3os/pkg/utils" + "github.com/mudler/go-pluggable" ) -func Upgrade(version, image string, force, debug bool) error { - if version == "" && image == "" { +func ListReleases() []string { + releases := []string{} + + bus.Manager.Response(events.EventAvailableReleases, func(p *pluggable.Plugin, r *pluggable.EventResponse) { + json.Unmarshal([]byte(r.Data), &releases) + }) + + bus.Manager.Publish(events.EventAvailableReleases, nil) + + if len(releases) == 0 { githubRepo, err := utils.OSRelease("GITHUB_REPO") if err != nil { - return err + return releases } - releases, _ := github.FindReleases(context.Background(), "", githubRepo) + releases, _ = github.FindReleases(context.Background(), "", githubRepo) + } + + return releases +} + +func Upgrade(version, image string, force, debug bool) error { + bus.Manager.Initialize() + + if version == "" && image == "" { + releases := ListReleases() + + if len(releases) == 0 { + return fmt.Errorf("no releases found") + } + version = releases[0] fmt.Println("latest release is ", version) } if utils.Version() == version && !force { - fmt.Println("latest version already installed. use --force to force upgrade") + fmt.Println("version already installed. use --force to force upgrade") return nil } + discoveredImage := "" + bus.Manager.Response(events.EventVersionImage, func(p *pluggable.Plugin, r *pluggable.EventResponse) { + discoveredImage = r.Data + }) + + _, err := bus.Manager.Publish(events.EventVersionImage, &events.VersionImagePayload{ + Version: version, + }) + if err != nil { + return err + } + registry, err := utils.OSRelease("IMAGE_REPO") if err != nil { return err } + img := fmt.Sprintf("%s:%s", registry, version) + if discoveredImage != "" { + img = discoveredImage + } if image != "" { img = image } diff --git a/internal/github/releases.go b/internal/github/releases.go deleted file mode 100644 index fef096b..0000000 --- a/internal/github/releases.go +++ /dev/null @@ -1,49 +0,0 @@ -package github - -import ( - "context" - "fmt" - "log" - "net/http" - "strings" - - "github.com/google/go-github/v40/github" - "golang.org/x/oauth2" -) - -func newHTTPClient(ctx context.Context, token string) *http.Client { - if token == "" { - return http.DefaultClient - } - src := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) - return oauth2.NewClient(ctx, src) -} - -func FindReleases(ctx context.Context, token, slug string) ([]string, error) { - hc := newHTTPClient(ctx, token) - cli := github.NewClient(hc) - - repo := strings.Split(slug, "/") - if len(repo) != 2 || repo[0] == "" || repo[1] == "" { - return nil, fmt.Errorf("Invalid slug format. It should be 'owner/name': %s", slug) - } - - rels, res, err := cli.Repositories.ListReleases(ctx, repo[0], repo[1], nil) - if err != nil { - log.Println("API returned an error response:", err) - if res != nil && res.StatusCode == 404 { - // 404 means repository not found or release not found. It's not an error here. - err = nil - log.Println("API returned 404. Repository or release not found") - } - return nil, err - } - - versions := []string{} - for _, rel := range rels { - if strings.HasPrefix(*rel.Name, "v") { - versions = append(versions, *rel.Name) - } - } - return versions, nil -}