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
}