diff --git a/state/state.go b/state/state.go index 77861123..bcc1d7cf 100644 --- a/state/state.go +++ b/state/state.go @@ -109,6 +109,16 @@ func readFromYaml(content []byte, file string, logger *zap.SugaredLogger) (*Helm state.DeprecatedReleases = []ReleaseSpec{} } + releaseNameCounts := map[string]int{} + for _, r := range state.Releases { + releaseNameCounts[r.Name] += 1 + } + for name, c := range releaseNameCounts { + if c > 1 { + return nil, fmt.Errorf("invalid helmfile: duplicate release name found: there were %d releases named \"%s\"", c, name) + } + } + state.logger = logger return &state, nil diff --git a/state/state_test.go b/state/state_test.go index 63795ee0..4f269307 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -164,6 +164,29 @@ func TestReadFromYaml_FilterNegatives(t *testing.T) { } } +// See https://github.com/roboll/helmfile/issues/193 +func TestReadFromYaml_DuplicateReleaseName(t *testing.T) { + yamlFile := "example/path/to/yaml/file" + yamlContent := []byte(`releases: +- name: myrelease1 + chart: mychart1 + labels: + stage: pre + foo: bar +- name: myrelease1 + chart: mychart2 + labels: + stage: post +`) + _, err := readFromYaml(yamlContent, yamlFile, logger) + if err == nil { + t.Error("error expected but not happened") + } + if err.Error() != "invalid helmfile: duplicate release name found: there were 2 releases named \"myrelease1\"" { + t.Errorf("unexpected error happened: %v", err) + } +} + func TestLabelParsing(t *testing.T) { cases := []struct { labelString string