// 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 }
func addRepository(name, url string) error { if err := repo.DownloadIndexFile(name, url, cacheIndexFile(name)); err != nil { return errors.New("Looks like " + url + " is not a valid chart repository or cannot be reached: " + err.Error()) } return insertRepoLine(name, url) }
func addRepository(name, url string, home helmpath.Home) error { cif := home.CacheIndex(name) if err := repo.DownloadIndexFile(name, url, cif); err != nil { return fmt.Errorf("Looks like %q is not a valid chart repository or cannot be reached: %s", url, err.Error()) } return insertRepoLine(name, url, home) }
func updateRepository(name, url string, home helmpath.Home) error { cif := home.CacheIndex(name) if err := repo.DownloadIndexFile(name, url, cif); err != nil { return err } return updateRepoLine(name, url, home) }
func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) { out := m.Out fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...") var wg sync.WaitGroup for _, re := range repos { wg.Add(1) go func(n, u string) { if err := repo.DownloadIndexFile(n, u, m.HelmHome.CacheIndex(n)); err != nil { fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", n, u, err) } else { fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", n) } wg.Done() }(re.Name, re.URL) } wg.Wait() fmt.Fprintln(out, "Update Complete. ⎈Happy Helming!⎈") }
func (m *Manager) parallelRepoUpdate(repos map[string]string) { out := m.Out fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...") var wg sync.WaitGroup for name, url := range repos { wg.Add(1) go func(n, u string) { err := repo.DownloadIndexFile(n, u, m.HelmHome.CacheIndex(n)) if err != nil { updateErr := fmt.Sprintf("...Unable to get an update from the %q chart repository: %s", n, err) fmt.Fprintln(out, updateErr) } else { fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", n) } wg.Done() }(name, url) } wg.Wait() fmt.Fprintln(out, "Update Complete. Happy Helming!") }
func updateCharts(repos []*repo.Entry, verbose bool, out io.Writer, home helmpath.Home) { fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...") var wg sync.WaitGroup for _, re := range repos { wg.Add(1) go func(n, u string) { defer wg.Done() if n == localRepository { // We skip local because the indices are symlinked. return } err := repo.DownloadIndexFile(n, u, home.CacheIndex(n)) if err != nil { fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", n, u, err) } else { fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", n) } }(re.Name, re.URL) } wg.Wait() fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming!⎈ ") }
func updateCharts(repos map[string]string, verbose bool) { fmt.Println("Hang tight while we grab the latest from your chart repositories...") var wg sync.WaitGroup for name, url := range repos { wg.Add(1) go func(n, u string) { defer wg.Done() 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 { updateErr = updateErr + ": " + err.Error() } fmt.Println(updateErr) } else { fmt.Println("...Successfully got an update from the " + n + " chart repository") } }(name, url) } wg.Wait() fmt.Println("Update Complete. Happy Helming!") }