|
|
@ -19,11 +19,18 @@ package main
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
"text/tabwriter"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/codegangsta/cli"
|
|
|
|
"github.com/codegangsta/cli"
|
|
|
|
"github.com/kubernetes/helm/pkg/format"
|
|
|
|
"github.com/kubernetes/helm/pkg/format"
|
|
|
|
"github.com/kubernetes/helm/pkg/repo"
|
|
|
|
"github.com/kubernetes/helm/pkg/repo"
|
|
|
|
|
|
|
|
"golang.org/x/oauth2"
|
|
|
|
|
|
|
|
"golang.org/x/oauth2/google"
|
|
|
|
|
|
|
|
storage "google.golang.org/api/storage/v1"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
func init() {
|
|
|
@ -51,6 +58,10 @@ const addRepoDesc = `The add repository command is used to add a name a reposito
|
|
|
|
$ helm repo add charts gs://kubernetes-charts
|
|
|
|
$ helm repo add charts gs://kubernetes-charts
|
|
|
|
`
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
|
|
|
scope = storage.DevstorageReadOnlyScope
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func repoCommands() cli.Command {
|
|
|
|
func repoCommands() cli.Command {
|
|
|
|
return cli.Command{
|
|
|
|
return cli.Command{
|
|
|
|
Name: "repository",
|
|
|
|
Name: "repository",
|
|
|
@ -67,6 +78,7 @@ func repoCommands() cli.Command {
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Name: "list",
|
|
|
|
Name: "list",
|
|
|
|
|
|
|
|
Aliases: []string{"ls"},
|
|
|
|
Usage: "List the chart repositories on the remote manager.",
|
|
|
|
Usage: "List the chart repositories on the remote manager.",
|
|
|
|
ArgsUsage: "",
|
|
|
|
ArgsUsage: "",
|
|
|
|
Action: func(c *cli.Context) { run(c, listRepos) },
|
|
|
|
Action: func(c *cli.Context) { run(c, listRepos) },
|
|
|
@ -78,6 +90,11 @@ func repoCommands() cli.Command {
|
|
|
|
ArgsUsage: "REPOSITORY_NAME",
|
|
|
|
ArgsUsage: "REPOSITORY_NAME",
|
|
|
|
Action: func(c *cli.Context) { run(c, removeRepo) },
|
|
|
|
Action: func(c *cli.Context) { run(c, removeRepo) },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Name: "foobar",
|
|
|
|
|
|
|
|
Usage: "foobar foobar.",
|
|
|
|
|
|
|
|
Action: func(c *cli.Context) { run(c, foobarRepo) },
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -107,12 +124,37 @@ func listRepos(c *cli.Context) error {
|
|
|
|
format.Info("Looks like you don't have any chart repositories.")
|
|
|
|
format.Info("Looks like you don't have any chart repositories.")
|
|
|
|
format.Info("Add a chart repository using the `helm repo add [REPOSITORY_URL]` command.")
|
|
|
|
format.Info("Add a chart repository using the `helm repo add [REPOSITORY_URL]` command.")
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
format.Msg("Chart Repositories:\n")
|
|
|
|
w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0)
|
|
|
|
|
|
|
|
fmt.Fprintln(w, "NAME\tURL")
|
|
|
|
for k, v := range dest {
|
|
|
|
for k, v := range dest {
|
|
|
|
//TODO: make formatting pretty
|
|
|
|
//TODO: make formatting pretty
|
|
|
|
format.Msg(k + "\t" + v + "\n")
|
|
|
|
fmt.Fprintf(w, "%v\t%v\n", k, v)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
w.Flush()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func foobarRepo(c *cli.Context) error {
|
|
|
|
|
|
|
|
repos := map[string]string{}
|
|
|
|
|
|
|
|
if _, err := NewClient(c).Get(chartRepoPath, &repos); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(repos) < 1 {
|
|
|
|
|
|
|
|
format.Info("Looks like you don't have any chart repositories.")
|
|
|
|
|
|
|
|
format.Info("Add a chart repository using the `helm repo add [REPOSITORY_URL]` command.")
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0)
|
|
|
|
|
|
|
|
fmt.Fprintln(w, "NAME\tURL")
|
|
|
|
|
|
|
|
for k, v := range repos {
|
|
|
|
|
|
|
|
//TODO: make formatting pretty
|
|
|
|
|
|
|
|
charts := chartRepos(k, v)
|
|
|
|
|
|
|
|
for _, chart := range charts {
|
|
|
|
|
|
|
|
fmt.Fprintf(w, "%v\t%s\n", v, chart)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
w.Flush()
|
|
|
|
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -128,3 +170,36 @@ func removeRepo(c *cli.Context) error {
|
|
|
|
format.Msg(name + " has been removed.\n")
|
|
|
|
format.Msg(name + " has been removed.\n")
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func chartRepos(k string, b string) []string {
|
|
|
|
|
|
|
|
client, err := google.DefaultClient(oauth2.NoContext, scope)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
log.Fatalf("Foobar Unable to get default client: %v", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
service, err := storage.New(client)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
log.Fatalf("Unable to create storage service: %v", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// List all objects in a bucket using pagination
|
|
|
|
|
|
|
|
var objects []string
|
|
|
|
|
|
|
|
var bucket string = k
|
|
|
|
|
|
|
|
pageToken := ""
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
|
|
|
call := service.Objects.List(bucket)
|
|
|
|
|
|
|
|
if pageToken != "" {
|
|
|
|
|
|
|
|
call = call.PageToken(pageToken)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := call.Do()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
log.Fatalf("Objects.List failed: %v", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, object := range res.Items {
|
|
|
|
|
|
|
|
objects = append(objects, object.Name)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if pageToken = res.NextPageToken; pageToken == "" {
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return objects
|
|
|
|
|
|
|
|
}
|
|
|
|