fix(helm): Non-zero exit code on failed chart repository update (#4348)

* Fail on failed chart repository update

* Fix failed test

* Add repo update strict flag
pull/4909/head
Lev Aminov 6 years ago committed by Matthew Fisher
parent 9ae00bebad
commit f6b1189aa2

@ -40,9 +40,10 @@ future releases.
var errNoRepositories = errors.New("no repositories found. You must add one before updating") var errNoRepositories = errors.New("no repositories found. You must add one before updating")
type repoUpdateCmd struct { type repoUpdateCmd struct {
update func([]*repo.ChartRepository, io.Writer, helmpath.Home) update func([]*repo.ChartRepository, io.Writer, helmpath.Home, bool) error
home helmpath.Home home helmpath.Home
out io.Writer out io.Writer
strict bool
} }
func newRepoUpdateCmd(out io.Writer) *cobra.Command { func newRepoUpdateCmd(out io.Writer) *cobra.Command {
@ -60,6 +61,10 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command {
return u.run() return u.run()
}, },
} }
f := cmd.Flags()
f.BoolVar(&u.strict, "strict", false, "fail on update warnings")
return cmd return cmd
} }
@ -80,14 +85,15 @@ func (u *repoUpdateCmd) run() error {
} }
repos = append(repos, r) repos = append(repos, r)
} }
return u.update(repos, u.out, u.home, u.strict)
u.update(repos, u.out, u.home)
return nil
} }
func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Home) { func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Home, strict bool) error {
fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...") fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...")
var wg sync.WaitGroup var (
errorCounter int
wg sync.WaitGroup
)
for _, re := range repos { for _, re := range repos {
wg.Add(1) wg.Add(1)
go func(re *repo.ChartRepository) { go func(re *repo.ChartRepository) {
@ -98,6 +104,7 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho
} }
err := re.DownloadIndexFile(home.Cache()) err := re.DownloadIndexFile(home.Cache())
if err != nil { if err != nil {
errorCounter++
fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", re.Config.Name, re.Config.URL, err) fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", re.Config.Name, re.Config.URL, err)
} else { } else {
fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", re.Config.Name) fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", re.Config.Name)
@ -105,5 +112,11 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho
}(re) }(re)
} }
wg.Wait() wg.Wait()
if errorCounter != 0 && strict {
return errors.New("Update Failed. Check log for details")
}
fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming!⎈ ") fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming!⎈ ")
return nil
} }

@ -46,10 +46,11 @@ func TestUpdateCmd(t *testing.T) {
out := bytes.NewBuffer(nil) out := bytes.NewBuffer(nil)
// Instead of using the HTTP updater, we provide our own for this test. // Instead of using the HTTP updater, we provide our own for this test.
// The TestUpdateCharts test verifies the HTTP behavior independently. // The TestUpdateCharts test verifies the HTTP behavior independently.
updater := func(repos []*repo.ChartRepository, out io.Writer, hh helmpath.Home) { updater := func(repos []*repo.ChartRepository, out io.Writer, hh helmpath.Home, strict bool) error {
for _, re := range repos { for _, re := range repos {
fmt.Fprintln(out, re.Config.Name) fmt.Fprintln(out, re.Config.Name)
} }
return nil
} }
uc := &repoUpdateCmd{ uc := &repoUpdateCmd{
update: updater, update: updater,
@ -94,7 +95,7 @@ func TestUpdateCharts(t *testing.T) {
} }
b := bytes.NewBuffer(nil) b := bytes.NewBuffer(nil)
updateCharts([]*repo.ChartRepository{r}, b, hh) updateCharts([]*repo.ChartRepository{r}, b, hh, false)
got := b.String() got := b.String()
if strings.Contains(got, "Unable to get an update") { if strings.Contains(got, "Unable to get an update") {

Loading…
Cancel
Save