From ac0eca221b93a7fba1a17dda7c8cb54eb8938ced Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Mon, 11 Apr 2016 14:05:23 +0200 Subject: [PATCH] Use tabwriter and add a repo listing function --- cmd/helm/repository.go | 79 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/cmd/helm/repository.go b/cmd/helm/repository.go index f17c2fae2..70842c7e1 100644 --- a/cmd/helm/repository.go +++ b/cmd/helm/repository.go @@ -19,11 +19,18 @@ package main import ( "encoding/json" "errors" + "fmt" + "log" + "os" "path/filepath" + "text/tabwriter" "github.com/codegangsta/cli" "github.com/kubernetes/helm/pkg/format" "github.com/kubernetes/helm/pkg/repo" + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + storage "google.golang.org/api/storage/v1" ) 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 ` +const ( + scope = storage.DevstorageReadOnlyScope +) + func repoCommands() cli.Command { return cli.Command{ Name: "repository", @@ -67,6 +78,7 @@ func repoCommands() cli.Command { }, { Name: "list", + Aliases: []string{"ls"}, Usage: "List the chart repositories on the remote manager.", ArgsUsage: "", Action: func(c *cli.Context) { run(c, listRepos) }, @@ -78,6 +90,11 @@ func repoCommands() cli.Command { ArgsUsage: "REPOSITORY_NAME", Action: func(c *cli.Context) { run(c, removeRepo) }, }, + { + Name: "foobar", + Usage: "foobar foobar.", + Action: func(c *cli.Context) { run(c, foobarRepo) }, + }, }, } } @@ -107,11 +124,36 @@ func listRepos(c *cli.Context) error { 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 { - format.Msg("Chart Repositories:\n") + w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0) + fmt.Fprintln(w, "NAME\tURL") for k, v := range dest { //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 } @@ -128,3 +170,36 @@ func removeRepo(c *cli.Context) error { format.Msg(name + " has been removed.\n") 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 +}