mirror of
https://github.com/kairos-io/kairos-agent.git
synced 2025-08-18 08:17:05 +00:00
art: Expose to sdk upgrade/list events
This commit is contained in:
parent
7fb4c70630
commit
fe03afa167
@ -2,36 +2,80 @@ package agent
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"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/c3os-io/c3os/pkg/utils"
|
||||||
|
"github.com/mudler/go-pluggable"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Upgrade(version, image string, force, debug bool) error {
|
func ListReleases() []string {
|
||||||
if version == "" && image == "" {
|
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")
|
githubRepo, err := utils.OSRelease("GITHUB_REPO")
|
||||||
if err != nil {
|
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]
|
version = releases[0]
|
||||||
fmt.Println("latest release is ", version)
|
fmt.Println("latest release is ", version)
|
||||||
}
|
}
|
||||||
|
|
||||||
if utils.Version() == version && !force {
|
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
|
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")
|
registry, err := utils.OSRelease("IMAGE_REPO")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
img := fmt.Sprintf("%s:%s", registry, version)
|
img := fmt.Sprintf("%s:%s", registry, version)
|
||||||
|
if discoveredImage != "" {
|
||||||
|
img = discoveredImage
|
||||||
|
}
|
||||||
if image != "" {
|
if image != "" {
|
||||||
img = image
|
img = image
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user