func addHelmRepoUpdate()

in cmd/resource/helm.go [89:174]


func addHelmRepoUpdate(name string, url string, username string, password string, tlsverify bool, localCA bool, settings *cli.EnvSettings) error {
	file := settings.RepositoryConfig
	os.Remove(file)
	//Ensure the file directory exists as it is required for file locking
	err := os.MkdirAll(filepath.Dir(file), os.ModePerm)
	if err != nil && !os.IsExist(err) {
		return genericError("Adding helm repository", err)
	}

	// Acquire a file lock for process synchronization
	fileLock := flock.New(strings.Replace(file, filepath.Ext(file), ".lock", 1))
	lockCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	locked, err := fileLock.TryLockContext(lockCtx, time.Second)
	if err == nil && locked {
		defer fileLock.Unlock()
	}
	if err != nil {
		return genericError("Adding helm repository", err)
	}

	b, err := ioutil.ReadFile(file)
	if err != nil && !os.IsNotExist(err) {
		return genericError("Adding helm repository", err)
	}

	var f repo.File
	if err := yaml.Unmarshal(b, &f); err != nil {
		return genericError("Adding helm repository", err)
	}

	c := repo.Entry{
		Name:                  name,
		URL:                   url,
		InsecureSkipTLSverify: tlsverify,
	}

	if !IsZero(username) && !IsZero(password) {
		c.Username = username
		c.Password = password
	}

	if localCA {
		c.CAFile = caLocalPath
	}

	r, err := repo.NewChartRepository(&c, getter.All(settings))
	if err != nil {
		return genericError("Adding helm repository", err)
	}

	if _, err := r.DownloadIndexFile(); err != nil {
		return genericError("Adding helm repository", errors.Wrapf(err, "looks like %q is not a valid chart repository or cannot be reached", url))
	}

	f.Update(&c)

	if err := f.WriteFile(file, 0644); err != nil {
		return genericError("Adding helm repository", err)
	}
	log.Printf("%q has been added to your repositories\n", name)
	var repos []*repo.ChartRepository
	for _, cfg := range f.Repositories {
		r, err := repo.NewChartRepository(cfg, getter.All(settings))
		if err != nil {
			genericError("Adding helm repository", err)
		}
		repos = append(repos, r)
	}
	log.Printf("Hang tight while we grab the latest from your chart repositories...")
	var wg sync.WaitGroup
	for _, re := range repos {
		wg.Add(1)
		go func(re *repo.ChartRepository) {
			defer wg.Done()
			if _, err := re.DownloadIndexFile(); err != nil {
				log.Printf("...Unable to get an update from the %q chart repository (%s):\n\t%s\n", re.Config.Name, re.Config.URL, err)
			} else {
				log.Printf("...Successfully got an update from the %q chart repository\n", re.Config.Name)
			}
		}(re)
	}
	wg.Wait()
	log.Printf("Update Complete. ⎈ Happy Helming!⎈ ")
	return nil
}