// ensureHome checks to see if $HELM_HOME exists // // If $HELM_HOME does not exist, this function will create it. func ensureHome(home helmpath.Home, out io.Writer) error { configDirectories := []string{home.String(), home.Repository(), home.Cache(), home.LocalRepository()} for _, p := range configDirectories { if fi, err := os.Stat(p); err != nil { fmt.Fprintf(out, "Creating %s \n", p) if err := os.MkdirAll(p, 0755); err != nil { return fmt.Errorf("Could not create %s: %s", p, err) } } else if !fi.IsDir() { return fmt.Errorf("%s must be a directory", p) } } repoFile := home.RepositoryFile() if fi, err := os.Stat(repoFile); err != nil { fmt.Fprintf(out, "Creating %s \n", repoFile) r := repo.NewRepoFile() r.Add(&repo.Entry{ Name: stableRepository, URL: stableRepositoryURL, Cache: "stable-index.yaml", }, &repo.Entry{ Name: localRepository, URL: localRepositoryURL, Cache: "local-index.yaml", }) if err := r.WriteFile(repoFile, 0644); err != nil { return err } cif := home.CacheIndex(stableRepository) if err := repo.DownloadIndexFile(stableRepository, stableRepositoryURL, cif); err != nil { fmt.Fprintf(out, "WARNING: Failed to download %s: %s (run 'helm repo update')\n", stableRepository, err) } } else if fi.IsDir() { return fmt.Errorf("%s must be a file, not a directory", repoFile) } if r, err := repo.LoadRepositoriesFile(repoFile); err == repo.ErrRepoOutOfDate { fmt.Fprintln(out, "Updating repository file format...") if err := r.WriteFile(repoFile, 0644); err != nil { return err } } localRepoIndexFile := home.LocalRepository(localRepoIndexFilePath) if fi, err := os.Stat(localRepoIndexFile); err != nil { fmt.Fprintf(out, "Creating %s \n", localRepoIndexFile) i := repo.NewIndexFile() if err := i.WriteFile(localRepoIndexFile, 0644); err != nil { return err } //TODO: take this out and replace with helm update functionality os.Symlink(localRepoIndexFile, home.CacheIndex("local")) } else if fi.IsDir() { return fmt.Errorf("%s must be a file, not a directory", localRepoIndexFile) } fmt.Fprintf(out, "$HELM_HOME has been configured at %s.\n", helmHome) return nil }
// ensureTestHome creates a home directory like ensureHome, but without remote references. // // t is used only for logging. func ensureTestHome(home helmpath.Home, t *testing.T) error { configDirectories := []string{home.String(), home.Repository(), home.Cache(), home.LocalRepository(), home.Plugins(), home.Starters()} for _, p := range configDirectories { if fi, err := os.Stat(p); err != nil { if err := os.MkdirAll(p, 0755); err != nil { return fmt.Errorf("Could not create %s: %s", p, err) } } else if !fi.IsDir() { return fmt.Errorf("%s must be a directory", p) } } repoFile := home.RepositoryFile() if fi, err := os.Stat(repoFile); err != nil { rf := repo.NewRepoFile() rf.Add(&repo.Entry{ Name: "charts", URL: "http://example.com/foo", Cache: "charts-index.yaml", }, &repo.Entry{ Name: "local", URL: "http://localhost.com:7743/foo", Cache: "local-index.yaml", }) if err := rf.WriteFile(repoFile, 0644); err != nil { return err } } else if fi.IsDir() { return fmt.Errorf("%s must be a file, not a directory", repoFile) } if r, err := repo.LoadRepositoriesFile(repoFile); err == repo.ErrRepoOutOfDate { t.Log("Updating repository file format...") if err := r.WriteFile(repoFile, 0644); err != nil { return err } } localRepoIndexFile := home.LocalRepository(localRepoIndexFilePath) if fi, err := os.Stat(localRepoIndexFile); err != nil { i := repo.NewIndexFile() if err := i.WriteFile(localRepoIndexFile, 0644); err != nil { return err } //TODO: take this out and replace with helm update functionality os.Symlink(localRepoIndexFile, home.CacheIndex("local")) } else if fi.IsDir() { return fmt.Errorf("%s must be a file, not a directory", localRepoIndexFile) } t.Logf("$HELM_HOME has been configured at %s.\n", helmHome) return nil }
func TestServer(t *testing.T) { docroot, err := ioutil.TempDir("", "helm-repotest-") if err != nil { t.Fatal(err) } defer os.RemoveAll(docroot) srv := NewServer(docroot) defer srv.Stop() c, err := srv.CopyCharts("testdata/*.tgz") if err != nil { // Some versions of Go don't correctly fire defer on Fatal. t.Error(err) return } if len(c) != 1 { t.Errorf("Unexpected chart count: %d", len(c)) } if filepath.Base(c[0]) != "examplechart-0.1.0.tgz" { t.Errorf("Unexpected chart: %s", c[0]) } res, err := http.Get(srv.URL() + "/examplechart-0.1.0.tgz") if err != nil { t.Error(err) return } if res.ContentLength < 500 { t.Errorf("Expected at least 500 bytes of data, got %d", res.ContentLength) } res, err = http.Get(srv.URL() + "/index.yaml") if err != nil { t.Error(err) return } data, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { t.Error(err) return } m := repo.NewIndexFile() if err := yaml.Unmarshal(data, m); err != nil { t.Error(err) return } if l := len(m.Entries); l != 1 { t.Errorf("Expected 1 entry, got %d", l) return } expect := "examplechart" if !m.Has(expect, "0.1.0") { t.Errorf("missing %q", expect) } res, err = http.Get(srv.URL() + "/index.yaml-nosuchthing") if err != nil { t.Error(err) return } if res.StatusCode != 404 { t.Errorf("Expected 404, got %d", res.StatusCode) } }