art: Expose to sdk upgrade/list events

This commit is contained in:
Ettore Di Giacinto 2022-08-18 13:12:05 +00:00 committed by Itxaka
parent 7fb4c70630
commit fe03afa167
2 changed files with 50 additions and 55 deletions

View File

@ -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
}

View File

@ -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
}