From b2f7a8745da4d12d12a2f47eaed0fb1f713b19ac Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Tue, 17 May 2016 11:59:52 -0400 Subject: [PATCH] ref(helm): fix helm update --- cmd/helm/repo.go | 2 +- cmd/helm/update.go | 43 ++------------------------------ pkg/repo/index.go | 51 ++++++++++++++++++++++++++++++++++++++ pkg/repo/index_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++ pkg/repo/local.go | 13 ---------- 5 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 pkg/repo/index.go create mode 100644 pkg/repo/index_test.go diff --git a/cmd/helm/repo.go b/cmd/helm/repo.go index 40aa43fd4..d2c24e38e 100644 --- a/cmd/helm/repo.go +++ b/cmd/helm/repo.go @@ -47,7 +47,7 @@ func runRepoAdd(cmd *cobra.Command, args []string) error { } name, url := args[0], args[1] - if err := downloadIndexFile(name, url); err != nil { + if err := repo.DownloadIndexFile(name, url, cacheDirectory(name, "-index.yaml")); err != nil { return errors.New("Oops! Looks like " + url + " is not a valid chart repository or cannot be reached\n") } diff --git a/cmd/helm/update.go b/cmd/helm/update.go index 4479c19ed..9d8c160ea 100644 --- a/cmd/helm/update.go +++ b/cmd/helm/update.go @@ -3,15 +3,9 @@ package main import ( "errors" "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "strings" "sync" "github.com/spf13/cobra" - "gopkg.in/yaml.v2" "github.com/kubernetes/helm/pkg/repo" ) @@ -52,7 +46,8 @@ func updateCharts(repos map[string]string, verbose bool) { wg.Add(1) go func(n, u string) { defer wg.Done() - err := downloadIndexFile(n, u) + indexFileName := cacheDirectory(n + "-index.yaml") + err := repo.DownloadIndexFile(n, u, indexFileName) if err != nil { updateErr := "...Unable to get an update from the " + n + " chart repository" if verbose { @@ -67,37 +62,3 @@ func updateCharts(repos map[string]string, verbose bool) { wg.Wait() fmt.Println("Update Complete. Happy Helming!") } - -func downloadIndexFile(name, url string) error { - var indexURL string - - indexURL = strings.TrimSuffix(url, "/") + "/index.yaml" - resp, err := http.Get(indexURL) - if err != nil { - return err - } - defer resp.Body.Close() - - var indexFile *os.File - var r repo.RepoFile - - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - if err := yaml.Unmarshal(b, &r); err != nil { - return err - } - - indexFile, err = os.Create(cacheDirectory(name + "-index.yaml")) - if err != nil { - return err - } - - if _, err := io.Copy(indexFile, resp.Body); err != nil { - return err - } - - return nil -} diff --git a/pkg/repo/index.go b/pkg/repo/index.go new file mode 100644 index 000000000..33f9c1dfe --- /dev/null +++ b/pkg/repo/index.go @@ -0,0 +1,51 @@ +package repo + +import ( + "io/ioutil" + "net/http" + "strings" + + "gopkg.in/yaml.v2" +) + +// IndexFile represents the index file in a chart repository +type IndexFile struct { + Entries map[string]*ChartRef +} + +// ChartRef represents a chart entry in the IndexFile +type ChartRef struct { + Name string `yaml:"name"` + URL string `yaml:"url"` + Keywords []string `yaml:"keywords"` + Removed bool `yaml:"removed,omitempty"` +} + +// DownloadIndexFile uses +func DownloadIndexFile(repoName, url, indexFileName string) error { + var indexURL string + + indexURL = strings.TrimSuffix(url, "/") + "/index.yaml" + resp, err := http.Get(indexURL) + if err != nil { + return err + } + defer resp.Body.Close() + + var r IndexFile + + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := yaml.Unmarshal(b, &r); err != nil { + return err + } + + if err := ioutil.WriteFile(indexFileName, b, 0644); err != nil { + return err + } + + return nil +} diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go new file mode 100644 index 000000000..41b04d2c4 --- /dev/null +++ b/pkg/repo/index_test.go @@ -0,0 +1,56 @@ +package repo + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + + "gopkg.in/yaml.v2" +) + +var ( + testRepo = "test-repo" +) + +func TestDownloadIndexFile(t *testing.T) { + fileBytes, err := ioutil.ReadFile("testdata/local-index.yaml") + if err != nil { + t.Errorf("%#v", err) + } + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "binary/octet-stream") + fmt.Fprintln(w, string(fileBytes)) + })) + + dirName, err := ioutil.TempDir("testdata", "tmp") + path := filepath.Join(dirName, testRepo+"-index.yaml") + if err := DownloadIndexFile(testRepo, ts.URL, path); err != nil { + t.Errorf("%#v", err) + } + + if _, err := os.Stat(path); err != nil { + t.Errorf("error finding created index file: %#v", err) + } + + b, err := ioutil.ReadFile(path) + if err != nil { + t.Errorf("error reading index file: %#v", err) + } + + var i IndexFile + if err = yaml.Unmarshal(b, &i); err != nil { + t.Errorf("error unmarshaling index file: %#v", err) + } + + numEntries := len(i.Entries) + if numEntries != 2 { + t.Errorf("Expected 2 entries in index file but got %v", numEntries) + } + os.Remove(path) + +} diff --git a/pkg/repo/local.go b/pkg/repo/local.go index 1844e2f44..30fdab42d 100644 --- a/pkg/repo/local.go +++ b/pkg/repo/local.go @@ -13,19 +13,6 @@ import ( var localRepoPath string -// IndexFile represents the index file in a chart repository -type IndexFile struct { - Entries map[string]*ChartRef -} - -// ChartRef represents a chart entry in the IndexFile -type ChartRef struct { - Name string `yaml:"name"` - URL string `yaml:"url"` - Keywords []string `yaml:"keywords"` - Removed bool `yaml:"removed,omitempty"` -} - // StartLocalRepo starts a web server and serves files from the given path func StartLocalRepo(path string) { fmt.Println("Now serving you on localhost:8879...")