Stop panic when deduplicating releases (#2067)
* Stop panic when deduplicating releases * Add testdata for new testcases
This commit is contained in:
parent
dbc40f68b8
commit
b1928e585d
|
|
@ -1200,14 +1200,11 @@ func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state.
|
||||||
// releases in the helmfile config.
|
// releases in the helmfile config.
|
||||||
// Otherwise we can't compute the DAG of releases correctly.
|
// Otherwise we can't compute the DAG of releases correctly.
|
||||||
r, deduped := selectedIds[id]
|
r, deduped := selectedIds[id]
|
||||||
if !deduped {
|
if deduped {
|
||||||
panic(fmt.Errorf("assertion error: release %q has never been selected. This shouldn't happen", id))
|
|
||||||
}
|
|
||||||
|
|
||||||
deduplicated = append(deduplicated, r)
|
deduplicated = append(deduplicated, r)
|
||||||
|
|
||||||
dedupedBefore[id] = struct{}{}
|
dedupedBefore[id] = struct{}{}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := checkDuplicates(r.helm, r.state, deduplicated); err != nil {
|
if err := checkDuplicates(r.helm, r.state, deduplicated); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|
|
||||||
|
|
@ -1220,4 +1220,65 @@ releases:
|
||||||
concurrency: 1,
|
concurrency: 1,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("select non existant release with --allow-no-matching-release", func(t *testing.T) {
|
||||||
|
check(t, testcase{
|
||||||
|
files: map[string]string{
|
||||||
|
"/path/to/helmfile.yaml": `
|
||||||
|
releases:
|
||||||
|
- name: foo
|
||||||
|
chart: incubator/raw
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: test
|
||||||
|
|
||||||
|
- name: bar
|
||||||
|
chart: incubator/raw
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: test
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
selectors: []string{"app=foo"},
|
||||||
|
upgraded: []exectest.Release{},
|
||||||
|
error: "err: no releases found that matches specified selector(app=foo) and environment(default), in any helmfile",
|
||||||
|
// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
|
||||||
|
concurrency: 1,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("select single release from helmfile with two duplicates", func(t *testing.T) {
|
||||||
|
check(t, testcase{
|
||||||
|
files: map[string]string{
|
||||||
|
"/path/to/helmfile.yaml": `
|
||||||
|
releases:
|
||||||
|
- name: foo
|
||||||
|
chart: incubator/raw
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: test
|
||||||
|
|
||||||
|
- name: bar
|
||||||
|
chart: incubator/raw
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: build
|
||||||
|
|
||||||
|
- name: bar
|
||||||
|
chart: incubator/raw
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: test
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
selectors: []string{"name=foo"},
|
||||||
|
upgraded: []exectest.Release{},
|
||||||
|
diffs: map[exectest.DiffKey]error{
|
||||||
|
exectest.DiffKey{Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode"}: helmexec.ExitError{Code: 2},
|
||||||
|
},
|
||||||
|
error: "",
|
||||||
|
// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
|
||||||
|
concurrency: 1,
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
43
pkg/app/testdata/testapply_2/select_non_existant_release_with_--allow-no-matching-release/log
vendored
Normal file
43
pkg/app/testdata/testapply_2/select_non_existant_release_with_--allow-no-matching-release/log
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
processing file "helmfile.yaml" in directory "."
|
||||||
|
first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
|
||||||
|
first-pass uses: &{default map[] map[]}
|
||||||
|
first-pass rendering output of "helmfile.yaml.part.0":
|
||||||
|
0:
|
||||||
|
1: releases:
|
||||||
|
2: - name: foo
|
||||||
|
3: chart: incubator/raw
|
||||||
|
4: namespace: default
|
||||||
|
5: labels:
|
||||||
|
6: app: test
|
||||||
|
7:
|
||||||
|
8: - name: bar
|
||||||
|
9: chart: incubator/raw
|
||||||
|
10: namespace: default
|
||||||
|
11: labels:
|
||||||
|
12: app: test
|
||||||
|
13:
|
||||||
|
|
||||||
|
first-pass produced: &{default map[] map[]}
|
||||||
|
first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]}
|
||||||
|
vals:
|
||||||
|
map[]
|
||||||
|
defaultVals:[]
|
||||||
|
second-pass rendering result of "helmfile.yaml.part.0":
|
||||||
|
0:
|
||||||
|
1: releases:
|
||||||
|
2: - name: foo
|
||||||
|
3: chart: incubator/raw
|
||||||
|
4: namespace: default
|
||||||
|
5: labels:
|
||||||
|
6: app: test
|
||||||
|
7:
|
||||||
|
8: - name: bar
|
||||||
|
9: chart: incubator/raw
|
||||||
|
10: namespace: default
|
||||||
|
11: labels:
|
||||||
|
12: app: test
|
||||||
|
13:
|
||||||
|
|
||||||
|
merged environment: &{default map[] map[]}
|
||||||
|
0 release(s) matching app=foo found in helmfile.yaml
|
||||||
|
|
||||||
69
pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log
vendored
Normal file
69
pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log
vendored
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
processing file "helmfile.yaml" in directory "."
|
||||||
|
first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode=<nil>
|
||||||
|
first-pass uses: &{default map[] map[]}
|
||||||
|
first-pass rendering output of "helmfile.yaml.part.0":
|
||||||
|
0:
|
||||||
|
1: releases:
|
||||||
|
2: - name: foo
|
||||||
|
3: chart: incubator/raw
|
||||||
|
4: namespace: default
|
||||||
|
5: labels:
|
||||||
|
6: app: test
|
||||||
|
7:
|
||||||
|
8: - name: bar
|
||||||
|
9: chart: incubator/raw
|
||||||
|
10: namespace: default
|
||||||
|
11: labels:
|
||||||
|
12: app: build
|
||||||
|
13:
|
||||||
|
14: - name: bar
|
||||||
|
15: chart: incubator/raw
|
||||||
|
16: namespace: default
|
||||||
|
17: labels:
|
||||||
|
18: app: test
|
||||||
|
19:
|
||||||
|
|
||||||
|
first-pass produced: &{default map[] map[]}
|
||||||
|
first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]}
|
||||||
|
vals:
|
||||||
|
map[]
|
||||||
|
defaultVals:[]
|
||||||
|
second-pass rendering result of "helmfile.yaml.part.0":
|
||||||
|
0:
|
||||||
|
1: releases:
|
||||||
|
2: - name: foo
|
||||||
|
3: chart: incubator/raw
|
||||||
|
4: namespace: default
|
||||||
|
5: labels:
|
||||||
|
6: app: test
|
||||||
|
7:
|
||||||
|
8: - name: bar
|
||||||
|
9: chart: incubator/raw
|
||||||
|
10: namespace: default
|
||||||
|
11: labels:
|
||||||
|
12: app: build
|
||||||
|
13:
|
||||||
|
14: - name: bar
|
||||||
|
15: chart: incubator/raw
|
||||||
|
16: namespace: default
|
||||||
|
17: labels:
|
||||||
|
18: app: test
|
||||||
|
19:
|
||||||
|
|
||||||
|
merged environment: &{default map[] map[]}
|
||||||
|
1 release(s) matching name=foo found in helmfile.yaml
|
||||||
|
|
||||||
|
Affected releases are:
|
||||||
|
foo (incubator/raw) UPDATED
|
||||||
|
|
||||||
|
processing 1 groups of releases in this order:
|
||||||
|
GROUP RELEASES
|
||||||
|
1 default/default/foo
|
||||||
|
|
||||||
|
processing releases in group 1/1: default/default/foo
|
||||||
|
getting deployed release version failed:unexpected list key: {^foo$ --kube-contextdefault--deleting--deployed--failed--pending}
|
||||||
|
|
||||||
|
UPDATED RELEASES:
|
||||||
|
NAME CHART VERSION
|
||||||
|
foo incubator/raw
|
||||||
|
|
||||||
Loading…
Reference in New Issue