Drop Helm v2 support (#613)

Resolves #589

Signed-off-by: xiaomudk <xiaomudk@gmail.com>
This commit is contained in:
xiaomudk 2023-01-17 08:24:47 +08:00 committed by GitHub
parent 1f134d931f
commit c4eb62388b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 458 additions and 1594 deletions

View File

@ -178,8 +178,6 @@ lockFilePath: path/to/lock.file
# In other words, unset values results in no flags passed to helm. # In other words, unset values results in no flags passed to helm.
# See the helm usage (helm SUBCOMMAND -h) for more info on default values when those flags aren't provided. # See the helm usage (helm SUBCOMMAND -h) for more info on default values when those flags aren't provided.
helmDefaults: helmDefaults:
tillerNamespace: tiller-namespace #dedicated default key for tiller-namespace
tillerless: false #dedicated default key for tillerless
kubeContext: kube-context #dedicated default key for kube-context (--kube-context) kubeContext: kube-context #dedicated default key for kube-context (--kube-context)
cleanupOnFail: false #dedicated default key for helm flag --cleanup-on-fail cleanupOnFail: false #dedicated default key for helm flag --cleanup-on-fail
# additional and global args passed to helm (default "") # additional and global args passed to helm (default "")
@ -289,10 +287,6 @@ releases:
atomic: true atomic: true
# when true, cleans up any new resources created during a failed release (default false) # when true, cleans up any new resources created during a failed release (default false)
cleanupOnFail: false cleanupOnFail: false
# name of the tiller namespace (default "")
tillerNamespace: vault
# if true, will use the helm-tiller plugin (default false)
tillerless: false
# enable TLS for request to Tiller (default false) # enable TLS for request to Tiller (default false)
tls: true tls: true
# path to TLS CA certificate file (default "$HELM_HOME/ca.pem") # path to TLS CA certificate file (default "$HELM_HOME/ca.pem")
@ -1008,13 +1002,6 @@ environments:
- http://$HOSTNAME/artifactory/example-repo-local/test.tgz@environments/production.secret.yaml - http://$HOSTNAME/artifactory/example-repo-local/test.tgz@environments/production.secret.yaml
``` ```
## Tillerless
With the [helm-tiller](https://github.com/rimusz/helm-tiller) plugin installed, you can work without tiller installed.
To enable this mode, you need to define `tillerless: true` and set the `tillerNamespace` in the `helmDefaults` section
or in the `releases` entries.
## DAG-aware installation/deletion ordering with `needs` ## DAG-aware installation/deletion ordering with `needs`
`needs` controls the order of the installation/deletion of the release: `needs` controls the order of the installation/deletion of the release:

View File

@ -112,8 +112,8 @@ releases:
Release Templating supports the following parts of release definition: Release Templating supports the following parts of release definition:
- basic fields: `name`, `namespace`, `chart`, `version` - basic fields: `name`, `namespace`, `chart`, `version`
- boolean fields: `installed`, `wait`, `waitForJobs`, `tillerless`, `verify` by the means of additional text - boolean fields: `installed`, `wait`, `waitForJobs`, `verify` by the means of additional text
fields designed for templating only: `installedTemplate`, `waitTemplate`, `tillerlessTemplate`, `verifyTemplate` fields designed for templating only: `installedTemplate`, `waitTemplate`, `verifyTemplate`
```yaml ```yaml
# ... # ...
installedTemplate: '{{`{{ eq .Release.Namespace "kube-system" }}`}}' installedTemplate: '{{`{{ eq .Release.Namespace "kube-system" }}`}}'
@ -328,7 +328,6 @@ Where the gotmpl file loaded in the second part looks like:
```yaml ```yaml
helmDefaults: helmDefaults:
tillerNamespace: kube-system
kubeContext: {{ .Values.kubeContext }} kubeContext: {{ .Values.kubeContext }}
verify: false verify: false
{{ if .Values.wait }} {{ if .Values.wait }}
@ -347,7 +346,6 @@ So in `mydefaults.yaml.gotmpl`, both `.Values.kubeContext` and `.Values.wait` ar
```yaml ```yaml
helmDefaults: helmDefaults:
tillerNamespace: kube-system
kubeContext: test kubeContext: test
verify: false verify: false
wait: false wait: false

View File

@ -232,10 +232,7 @@ func (a *App) Template(c TemplateConfigProvider) error {
// Live output should never be enabled for the "template" subcommand to avoid breaking `helmfile template | kubectl apply -f -` // Live output should never be enabled for the "template" subcommand to avoid breaking `helmfile template | kubectl apply -f -`
run.helm.SetEnableLiveOutput(false) run.helm.SetEnableLiveOutput(false)
// `helm template` in helm v2 does not support local chart.
// So, we set forceDownload=true for helm v2 only
prepErr := run.withPreparedCharts("template", state.ChartPrepareOptions{ prepErr := run.withPreparedCharts("template", state.ChartPrepareOptions{
ForceDownload: !run.helm.IsHelm3(),
SkipRepos: c.SkipDeps(), SkipRepos: c.SkipDeps(),
SkipDeps: c.SkipDeps(), SkipDeps: c.SkipDeps(),
IncludeCRDs: &includeCRDs, IncludeCRDs: &includeCRDs,
@ -257,14 +254,11 @@ func (a *App) Template(c TemplateConfigProvider) error {
func (a *App) WriteValues(c WriteValuesConfigProvider) error { func (a *App) WriteValues(c WriteValuesConfigProvider) error {
return a.ForEachState(func(run *Run) (ok bool, errs []error) { return a.ForEachState(func(run *Run) (ok bool, errs []error) {
// `helm template` in helm v2 does not support local chart.
// So, we set forceDownload=true for helm v2 only
prepErr := run.withPreparedCharts("write-values", state.ChartPrepareOptions{ prepErr := run.withPreparedCharts("write-values", state.ChartPrepareOptions{
ForceDownload: !run.helm.IsHelm3(), SkipRepos: c.SkipDeps(),
SkipRepos: c.SkipDeps(), SkipDeps: c.SkipDeps(),
SkipDeps: c.SkipDeps(), SkipCleanup: c.SkipCleanup(),
SkipCleanup: c.SkipCleanup(), Concurrency: c.Concurrency(),
Concurrency: c.Concurrency(),
}, func() { }, func() {
ok, errs = a.writeValues(run, c) ok, errs = a.writeValues(run, c)
}) })
@ -497,7 +491,7 @@ func (a *App) Destroy(c DestroyConfigProvider) error {
func (a *App) Test(c TestConfigProvider) error { func (a *App) Test(c TestConfigProvider) error {
return a.ForEachState(func(run *Run) (_ bool, errs []error) { return a.ForEachState(func(run *Run) (_ bool, errs []error) {
if c.Cleanup() && run.helm.IsHelm3() { if c.Cleanup() {
a.Logger.Warnf("warn: requested cleanup will not be applied. " + a.Logger.Warnf("warn: requested cleanup will not be applied. " +
"To clean up test resources with Helm 3, you have to remove them manually " + "To clean up test resources with Helm 3, you have to remove them manually " +
"or set helm.sh/hook-delete-policy\n") "or set helm.sh/hook-delete-policy\n")
@ -1056,7 +1050,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg
f := converge f := converge
if opts.Filter { if opts.Filter {
f = func(st *state.HelmState) (bool, []error) { f = func(st *state.HelmState) (bool, []error) {
return processFilteredReleases(st, a.getHelm(st), func(st *state.HelmState) []error { return processFilteredReleases(st, func(st *state.HelmState) []error {
_, err := converge(st) _, err := converge(st)
return err return err
}, },
@ -1073,7 +1067,7 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg
return a.visitStates(fileOrDir, opts, fHelmStatsWithOverrides) return a.visitStates(fileOrDir, opts, fHelmStatsWithOverrides)
} }
func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, converge func(st *state.HelmState) []error, includeTransitiveNeeds bool) (bool, []error) { func processFilteredReleases(st *state.HelmState, converge func(st *state.HelmState) []error, includeTransitiveNeeds bool) (bool, []error) {
if len(st.Selectors) > 0 { if len(st.Selectors) > 0 {
err := st.FilterReleases(includeTransitiveNeeds) err := st.FilterReleases(includeTransitiveNeeds)
if err != nil { if err != nil {
@ -1081,7 +1075,7 @@ func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, conve
} }
} }
if err := checkDuplicates(helm, st, st.Releases); err != nil { if err := checkDuplicates(st.Releases); err != nil {
return false, []error{err} return false, []error{err}
} }
@ -1092,7 +1086,7 @@ func processFilteredReleases(st *state.HelmState, helm helmexec.Interface, conve
return processed, errs return processed, errs
} }
func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []state.ReleaseSpec) error { func checkDuplicates(releases []state.ReleaseSpec) error {
type Key struct { type Key struct {
TillerNamespace, Name, KubeContext string TillerNamespace, Name, KubeContext string
} }
@ -1100,13 +1094,6 @@ func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []st
releaseNameCounts := map[Key]int{} releaseNameCounts := map[Key]int{}
for _, r := range releases { for _, r := range releases {
namespace := r.Namespace namespace := r.Namespace
if !helm.IsHelm3() {
if r.TillerNamespace != "" {
namespace = r.TillerNamespace
} else {
namespace = st.HelmDefaults.TillerNamespace
}
}
releaseNameCounts[Key{namespace, r.Name, r.KubeContext}]++ releaseNameCounts[Key{namespace, r.Name, r.KubeContext}]++
} }
for name, c := range releaseNameCounts { for name, c := range releaseNameCounts {
@ -1130,7 +1117,7 @@ func checkDuplicates(helm helmexec.Interface, st *state.HelmState, releases []st
func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { func (a *App) Wrap(converge func(*state.HelmState, helmexec.Interface) []error) func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) {
return func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) { return func(st *state.HelmState, helm helmexec.Interface, includeTransitiveNeeds bool) (bool, []error) {
return processFilteredReleases(st, helm, func(st *state.HelmState) []error { return processFilteredReleases(st, func(st *state.HelmState) []error {
return converge(st, helm) return converge(st, helm)
}, includeTransitiveNeeds) }, includeTransitiveNeeds)
} }
@ -1268,7 +1255,7 @@ func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state.
} }
} }
if err := checkDuplicates(r.helm, r.state, deduplicated); err != nil { if err := checkDuplicates(deduplicated); err != nil {
return nil, nil, err return nil, nil, err
} }

View File

@ -50,6 +50,7 @@ func TestApply_hooks(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, tc.logLevel, func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, tc.logLevel, func(t *testing.T, logger *zap.SugaredLogger) {
@ -387,10 +388,10 @@ releases:
}, },
selectors: []string{"app=test"}, selectors: []string{"app=test"},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -437,10 +438,10 @@ releases:
}, },
selectors: []string{"app=test"}, selectors: []string{"app=test"},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: ``, {Filter: "^bar$", Flags: listFlags("default", "default")}: ``,
}, },
upgraded: []exectest.Release{ upgraded: []exectest.Release{
{Name: "foo"}, {Name: "foo"},

View File

@ -50,6 +50,7 @@ func TestApply_3(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -183,10 +184,10 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -231,7 +232,7 @@ releases:
{Name: "external-secrets", Flags: []string{"--namespace", "default"}}, {Name: "external-secrets", Flags: []string{"--namespace", "default"}},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default ^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -285,13 +286,13 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -341,10 +342,10 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -390,13 +391,13 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -446,11 +447,11 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: ``,
{Filter: "^external-secrets$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },

View File

@ -50,6 +50,7 @@ func TestApply_2(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -183,10 +184,10 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -231,7 +232,7 @@ releases:
{Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default ^external-secrets$ 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -285,13 +286,13 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -341,10 +342,10 @@ releases:
{Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -390,13 +391,13 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -446,11 +447,11 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: ``, {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: ``,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -501,13 +502,13 @@ releases:
{Name: "serviceC", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "serviceC", Chart: "my/chart", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceA$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
{Filter: "^serviceB$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceB$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
{Filter: "^serviceC$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceC$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
}, },
@ -646,7 +647,7 @@ releases:
{Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -712,7 +713,7 @@ releases:
{Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "incubator/raw", Flags: "--kube-contextdefault--namespacedefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },

View File

@ -42,6 +42,7 @@ func TestDiffWithNeeds(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -316,6 +317,7 @@ func TestDiffWithInstalled(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -385,7 +387,7 @@ releases:
`, `,
selectors: []string{"name=a"}, selectors: []string{"name=a"},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^a$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^a$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -409,7 +411,7 @@ releases:
`, `,
selectors: []string{"name=a"}, selectors: []string{"name=a"},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^a$", Flags: helmV2ListFlags}: ``, {Filter: "^a$", Flags: listFlags("default", "default")}: ``,
}, },
}) })
}) })

View File

@ -44,6 +44,7 @@ func TestLint(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {

View File

@ -48,6 +48,7 @@ func TestSync(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -175,10 +176,10 @@ releases:
{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -306,13 +307,13 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -440,13 +441,13 @@ releases:
selectors: []string{"name=serviceA"}, selectors: []string{"name=serviceA"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^serviceC$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceC$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
{Filter: "^serviceB$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceB$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceB 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
{Filter: "^serviceA$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^serviceA$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 default
`, `,
}, },
@ -572,13 +573,13 @@ releases:
selectors: []string{"app=test"}, selectors: []string{"app=test"},
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default kubernetes-external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -721,11 +722,11 @@ releases:
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
// delete frontend-v1 and backend-v1 // delete frontend-v1 and backend-v1
{Filter: "^kubernetes-external-secrets$", Flags: helmV2ListFlags}: ``, {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: ``,
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },

View File

@ -45,6 +45,7 @@ func TestTemplate(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -236,7 +237,7 @@ releases:
}, },
selectors: []string{"name=test2"}, selectors: []string{"name=test2"},
templated: []exectest.Release{ templated: []exectest.Release{
{Name: "test2", Flags: []string(nil)}, {Name: "test2", Flags: []string{}},
}, },
}) })
}) })
@ -249,8 +250,8 @@ releases:
}, },
selectors: []string{"name=test3"}, selectors: []string{"name=test3"},
templated: []exectest.Release{ templated: []exectest.Release{
{Name: "test2", Flags: []string(nil)}, {Name: "test2", Flags: []string{}},
{Name: "test3", Flags: []string(nil)}, {Name: "test3", Flags: []string{}},
}, },
}) })
}) })
@ -264,8 +265,8 @@ releases:
}, },
selectors: []string{"name=test3"}, selectors: []string{"name=test3"},
templated: []exectest.Release{ templated: []exectest.Release{
{Name: "test2", Flags: []string(nil)}, {Name: "test2", Flags: []string{}},
{Name: "test3", Flags: []string(nil)}, {Name: "test3", Flags: []string{}},
}, },
}) })
}) })
@ -279,7 +280,7 @@ releases:
}, },
selectors: []string{"name=test2"}, selectors: []string{"name=test2"},
templated: []exectest.Release{ templated: []exectest.Release{
{Name: "test2", Flags: []string(nil)}, {Name: "test2", Flags: []string{}},
}, },
}) })
}) })
@ -293,8 +294,8 @@ releases:
}, },
selectors: []string{"name=test3"}, selectors: []string{"name=test3"},
templated: []exectest.Release{ templated: []exectest.Release{
{Name: "test2", Flags: []string(nil)}, {Name: "test2", Flags: []string{}},
{Name: "test3", Flags: []string(nil)}, {Name: "test3", Flags: []string{}},
}, },
}) })
}) })
@ -330,6 +331,7 @@ func TestTemplate_StrictParsing(t *testing.T) {
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
_ = runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { _ = runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {

View File

@ -48,16 +48,16 @@ func injectFs(app *App, fs *testhelper.TestFs) *App {
} }
func expectNoCallsToHelm(app *App) { func expectNoCallsToHelm(app *App) {
expectNoCallsToHelmVersion(app, false) expectNoCallsToHelmVersion(app)
} }
func expectNoCallsToHelmVersion(app *App, isHelm3 bool) { func expectNoCallsToHelmVersion(app *App) {
if app.helms != nil { if app.helms != nil {
panic("invalid call to expectNoCallsToHelm") panic("invalid call to expectNoCallsToHelm")
} }
app.helms = map[helmKey]helmexec.Interface{ app.helms = map[helmKey]helmexec.Interface{
createHelmKey(app.OverrideHelmBinary, app.OverrideKubeContext): &versionOnlyHelmExec{isHelm3: isHelm3}, createHelmKey(app.OverrideHelmBinary, app.OverrideKubeContext): &versionOnlyHelmExec{isHelm3: true},
} }
} }
@ -461,8 +461,6 @@ releases:
chart: stable/prometheus chart: stable/prometheus
`, `,
"/path/to/helmfile.d/b.yaml": ` "/path/to/helmfile.d/b.yaml": `
helmDefaults:
tillerNamespace: zoo
releases: releases:
- name: grafana - name: grafana
chart: stable/grafana chart: stable/grafana
@ -488,12 +486,12 @@ releases:
duplicatedCtx: yes duplicatedCtx: yes
- name: bar - name: bar
chart: charts/foo chart: charts/foo
tillerNamespace: bar1 namespace: bar1
labels: labels:
duplicatedOK: yes duplicatedOK: yes
- name: bar - name: bar
chart: charts/foo chart: charts/foo
tillerNamespace: bar2 namespace: bar2
labels: labels:
duplicatedOK: yes duplicatedOK: yes
`, `,
@ -510,14 +508,11 @@ releases:
{label: "name!=", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name!=. Expected label in form k=v or k!=v"}, {label: "name!=", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name!=. Expected label in form k=v or k!=v"},
{label: "name", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name. Expected label in form k=v or k!=v"}, {label: "name", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[0]: in /path/to/helmfile.d/a1.yaml: malformed label: name. Expected label in form k=v or k!=v"},
// See https://github.com/roboll/helmfile/issues/193 // See https://github.com/roboll/helmfile/issues/193
{label: "duplicatedNs=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in namespace \"zoo\" in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, {label: "duplicatedNs=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"},
{label: "duplicatedCtx=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in namespace \"zoo\" in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"}, {label: "duplicatedCtx=yes", expectedCount: 0, expectErr: true, errMsg: "in ./helmfile.yaml: in .helmfiles[2]: in /path/to/helmfile.d/b.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"},
{label: "duplicatedOK=yes", expectedCount: 2, expectErr: false}, {label: "duplicatedOK=yes", expectedCount: 2, expectErr: false},
} }
for _, testcase := range testcases {
for i := range testcases {
testcase := testcases[i]
t.Run(testcase.label, func(t *testing.T) { t.Run(testcase.label, func(t *testing.T) {
actual := []string{} actual := []string{}
@ -594,12 +589,12 @@ releases:
chart: stable/grafana chart: stable/grafana
- name: bar - name: bar
chart: charts/foo chart: charts/foo
tillerNamespace: bar1 namespace: bar1
labels: labels:
duplicatedOK: yes duplicatedOK: yes
- name: bar - name: bar
chart: charts/foo chart: charts/foo
tillerNamespace: bar2 namespace: bar2
labels: labels:
duplicatedOK: yes duplicatedOK: yes
`, `,
@ -812,46 +807,39 @@ helmfiles:
- path: helmfile.d/c*.yaml - path: helmfile.d/c*.yaml
values: values:
- env.values.yaml - env.values.yaml
- tillerNs: INLINE_TILLER_NS_3
`, `,
"/path/to/helmfile.d/a1.yaml": ` "/path/to/helmfile.d/a1.yaml": `
environments: environments:
default: default:
values: values:
- tillerNs: INLINE_TILLER_NS - ns: INLINE_NS
ns: INLINE_NS
releases: releases:
- name: foo - name: foo
chart: stable/zipkin chart: stable/zipkin
tillerNamespace: {{ .Environment.Values.tillerNs }}
namespace: {{ .Environment.Values.ns }} namespace: {{ .Environment.Values.ns }}
`, `,
"/path/to/helmfile.d/b.yaml": ` "/path/to/helmfile.d/b.yaml": `
environments: environments:
default: default:
values: values:
- tillerNs: INLINE_TILLER_NS - ns: INLINE_NS
ns: INLINE_NS
releases: releases:
- name: bar - name: bar
chart: stable/grafana chart: stable/grafana
tillerNamespace: {{ .Environment.Values.tillerNs }}
namespace: {{ .Environment.Values.ns }} namespace: {{ .Environment.Values.ns }}
`, `,
"/path/to/helmfile.d/c.yaml": ` "/path/to/helmfile.d/c.yaml": `
environments: environments:
default: default:
values: values:
- tillerNs: INLINE_TILLER_NS - ns: INLINE_NS
ns: INLINE_NS
releases: releases:
- name: baz - name: baz
chart: stable/envoy chart: stable/envoy
tillerNamespace: {{ .Environment.Values.tillerNs }}
namespace: {{ .Environment.Values.ns }} namespace: {{ .Environment.Values.ns }}
`, `,
"/path/to/env.values.yaml": ` "/path/to/env.values.yaml": `
tillerNs: INLINE_TILLER_NS_2 ns: INLINE_NS
`, `,
} }
@ -885,15 +873,14 @@ tillerNs: INLINE_TILLER_NS_2
} }
type release struct { type release struct {
chart string chart string
tillerNs string ns string
ns string
} }
expectedReleases := map[string]release{ expectedReleases := map[string]release{
"foo": {"stable/zipkin", "INLINE_TILLER_NS_2", "INLINE_NS"}, "foo": {"stable/zipkin", "INLINE_NS"},
"bar": {"stable/grafana", "INLINE_TILLER_NS", "INLINE_NS"}, "bar": {"stable/grafana", "INLINE_NS"},
"baz": {"stable/envoy", "INLINE_TILLER_NS_3", "INLINE_NS"}, "baz": {"stable/envoy", "INLINE_NS"},
} }
for name := range processed { for name := range processed {
@ -908,10 +895,6 @@ tillerNs: INLINE_TILLER_NS_2
t.Errorf("unexpected chart: expected=%s, got=%s", expected.chart, actual.Chart) t.Errorf("unexpected chart: expected=%s, got=%s", expected.chart, actual.Chart)
} }
if expected.tillerNs != actual.TillerNamespace {
t.Errorf("unexpected tiller namespace: expected=%s, got=%s", expected.tillerNs, actual.TillerNamespace)
}
if expected.ns != actual.Namespace { if expected.ns != actual.Namespace {
t.Errorf("unexpected namespace: expected=%s, got=%s", expected.ns, actual.Namespace) t.Errorf("unexpected namespace: expected=%s, got=%s", expected.ns, actual.Namespace)
} }
@ -1288,95 +1271,6 @@ releases:
} }
} }
// See https://github.com/roboll/helmfile/issues/1213
func TestVisitDesiredStatesWithReleases_DuplicateReleasesHelm2(t *testing.T) {
files := map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: foo
namespace: foo
chart: charts/foo
- name: foo
namespace: bar
chart: charts/foo
`,
}
actual := []state.ReleaseSpec{}
collectReleases := func(run *Run) (bool, []error) {
actual = append(actual, run.state.Releases...)
return false, []error{}
}
app := appWithFs(&App{
OverrideHelmBinary: DefaultHelmBinary,
OverrideKubeContext: "default",
Logger: newAppTestLogger(),
Namespace: "",
Env: "default",
FileOrDir: "helmfile.yaml",
}, files)
expectNoCallsToHelmVersion(app, false)
err := app.ForEachState(
collectReleases,
false,
SetFilter(true),
)
expected := "in ./helmfile.yaml: duplicate release \"foo\" found in kubecontext \"default\": there were 2 releases named \"foo\" matching specified selector"
if err == nil {
t.Errorf("error expected but not happened")
} else if err.Error() != expected {
t.Errorf("unexpected error message: expected=\"%s\", actual=\"%s\"", expected, err.Error())
}
}
// See https://github.com/roboll/helmfile/issues/1213
func TestVisitDesiredStatesWithReleases_NoDuplicateReleasesHelm2(t *testing.T) {
files := map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: foo
namespace: foo
tillerNamespace: tns1
chart: charts/foo
- name: foo
namespace: bar
tillerNamespace: tns2
chart: charts/foo
`,
}
actual := []state.ReleaseSpec{}
collectReleases := func(run *Run) (bool, []error) {
actual = append(actual, run.state.Releases...)
return false, []error{}
}
app := appWithFs(&App{
OverrideHelmBinary: DefaultHelmBinary,
OverrideKubeContext: "default",
Logger: newAppTestLogger(),
Namespace: "",
Env: "default",
FileOrDir: "helmfile.yaml",
}, files)
expectNoCallsToHelmVersion(app, false)
err := app.ForEachState(
collectReleases,
false,
SetFilter(true),
)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
}
// See https://github.com/roboll/helmfile/issues/1213 // See https://github.com/roboll/helmfile/issues/1213
func TestVisitDesiredStatesWithReleases_NoDuplicateReleasesHelm3(t *testing.T) { func TestVisitDesiredStatesWithReleases_NoDuplicateReleasesHelm3(t *testing.T) {
files := map[string]string{ files := map[string]string{
@ -1406,7 +1300,7 @@ releases:
FileOrDir: "helmfile.yaml", FileOrDir: "helmfile.yaml",
}, files) }, files)
expectNoCallsToHelmVersion(app, true) expectNoCallsToHelmVersion(app)
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
@ -1448,7 +1342,7 @@ releases:
FileOrDir: "helmfile.yaml", FileOrDir: "helmfile.yaml",
}, files) }, files)
expectNoCallsToHelmVersion(app, true) expectNoCallsToHelmVersion(app)
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
@ -1494,7 +1388,7 @@ releases:
FileOrDir: "helmfile.yaml", FileOrDir: "helmfile.yaml",
}, files) }, files)
expectNoCallsToHelmVersion(app, true) expectNoCallsToHelmVersion(app)
err := app.ForEachState( err := app.ForEachState(
collectReleases, collectReleases,
@ -1580,7 +1474,6 @@ releases:
- environments/default/2.yaml - environments/default/2.yaml
helmDefaults: helmDefaults:
tillerNamespace: {{ .Environment.Values.tillerNs }}
`, `,
"/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`,
"/path/to/yaml/templates.yaml": `templates: "/path/to/yaml/templates.yaml": `templates:
@ -1605,10 +1498,6 @@ helmDefaults:
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if st.HelmDefaults.TillerNamespace != "TILLER_NS" {
t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace)
}
if *st.Releases[1].MissingFileHandler != "Warn" { if *st.Releases[1].MissingFileHandler != "Warn" {
t.Errorf("unexpected releases[0].missingFileHandler: expected=Warn, got=%s", *st.Releases[1].MissingFileHandler) t.Errorf("unexpected releases[0].missingFileHandler: expected=Warn, got=%s", *st.Releases[1].MissingFileHandler)
} }
@ -1666,7 +1555,6 @@ releases:
- environments/default/2.yaml - environments/default/2.yaml
helmDefaults: helmDefaults:
tillerNamespace: {{ .Environment.Values.tillerNs }}
`, `,
"/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`,
"/path/to/yaml/templates.yaml": `templates: "/path/to/yaml/templates.yaml": `templates:
@ -1690,9 +1578,6 @@ helmDefaults:
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if st.HelmDefaults.TillerNamespace != "TILLER_NS" {
t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace)
}
firstRelease := st.Releases[0] firstRelease := st.Releases[0]
if firstRelease.Name != "myrelease1" { if firstRelease.Name != "myrelease1" {
t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name) t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name)
@ -1740,7 +1625,6 @@ releases:
`, `,
"/path/to/base.gotmpl": `helmDefaults: "/path/to/base.gotmpl": `helmDefaults:
kubeContext: {{ .Environment.Values.foo }} kubeContext: {{ .Environment.Values.foo }}
tillerNamespace: {{ .Environment.Values.tillerNs }}
`, `,
"/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS "/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS
foo: FOO foo: FOO
@ -1766,10 +1650,6 @@ foo: FOO
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if st.HelmDefaults.TillerNamespace != "TILLER_NS" {
t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace)
}
if st.Releases[0].Name != "myrelease0" { if st.Releases[0].Name != "myrelease0" {
t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name) t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name)
} }
@ -1803,7 +1683,6 @@ releases:
`, `,
"/path/to/base.gotmpl": `helmDefaults: "/path/to/base.gotmpl": `helmDefaults:
kubeContext: {{ .Environment.Values.foo }} kubeContext: {{ .Environment.Values.foo }}
tillerNamespace: {{ .Environment.Values.tillerNs }}
`, `,
"/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS "/path/to/yaml/environments/default/1.yaml": `tillerNs: TILLER_NS
foo: FOO foo: FOO
@ -1829,10 +1708,6 @@ foo: FOO
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if st.HelmDefaults.TillerNamespace != "INLINE_TILLER_NS" {
t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace)
}
if st.Releases[0].Name != "myrelease0" { if st.Releases[0].Name != "myrelease0" {
t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name) t.Errorf("unexpected releases[0].name: expected=myrelease0, got=%s", st.Releases[0].Name)
} }
@ -1886,7 +1761,6 @@ releases:
- environments/default/2.yaml - environments/default/2.yaml
helmDefaults: helmDefaults:
tillerNamespace: {{ .Environment.Values.tillerNs }}
`, `,
"/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`, "/path/to/yaml/environments/default/2.yaml": `tillerNs: TILLER_NS`,
"/path/to/yaml/templates.yaml": `templates: "/path/to/yaml/templates.yaml": `templates:
@ -1910,10 +1784,6 @@ helmDefaults:
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if st.HelmDefaults.TillerNamespace != "TILLER_NS" {
t.Errorf("unexpected helmDefaults.tillerNamespace: expected=TILLER_NS, got=%s", st.HelmDefaults.TillerNamespace)
}
firstRelease := st.Releases[0] firstRelease := st.Releases[0]
if firstRelease.Name != "myrelease1" { if firstRelease.Name != "myrelease1" {
t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name) t.Errorf("unexpected releases[1].name: expected=myrelease1, got=%s", firstRelease.Name)
@ -2614,7 +2484,7 @@ func (helm *mockHelmExec) Lint(name, chart string, flags ...string) error {
return nil return nil
} }
func (helm *mockHelmExec) IsHelm3() bool { func (helm *mockHelmExec) IsHelm3() bool {
return false return true
} }
func (helm *mockHelmExec) GetVersion() helmexec.Version { func (helm *mockHelmExec) GetVersion() helmexec.Version {
@ -2880,31 +2750,31 @@ releases:
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
// delete frontend-v1 and backend-v1 // delete frontend-v1 and backend-v1
{Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default
`, `,
{Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default
`, `,
{Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default
`, `,
{Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default
`, `,
{Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
}, },
@ -2945,8 +2815,8 @@ releases:
{Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil,
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: ``, {Filter: "^foo$", Flags: listFlags("", "default")}: ``,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3014,11 +2884,11 @@ releases:
{Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: ``, {Filter: "^foo$", Flags: listFlags("", "default")}: ``,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
{Filter: "^baz$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^baz$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default
`, `,
}, },
@ -3058,11 +2928,11 @@ releases:
{Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: ``, {Filter: "^foo$", Flags: listFlags("", "default")}: ``,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
{Filter: "^baz$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^baz$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default baz 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart3-3.1.0 3.1.0 default
`, `,
}, },
@ -3221,71 +3091,6 @@ releases:
{Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}},
}, },
}, },
{
name: "helm2 upgrade when tns1/foo needs tns2/bar",
loc: location(),
files: map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: foo
chart: stable/mychart1
namespace: ns1
tillerNamespace: tns1
needs:
- tns2/bar
- name: bar
chart: stable/mychart2
namespace: ns2
tillerNamespace: tns2
`,
},
diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
},
upgraded: []exectest.Release{
{Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}},
{Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}},
},
},
{
name: "helm2 upgrade when tns2/bar needs tns1/foo",
loc: location(),
files: map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: bar
chart: stable/mychart2
namespace: ns2
tillerNamespace: tns2
needs:
- tns1/foo
- name: foo
chart: stable/mychart1
namespace: ns1
tillerNamespace: tns1
`,
},
diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "stable/mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "stable/mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
},
upgraded: []exectest.Release{
{Name: "foo", Flags: []string{"--tiller-namespace", "tns1", "--kube-context", "default", "--namespace", "ns1"}},
{Name: "bar", Flags: []string{"--tiller-namespace", "tns2", "--kube-context", "default", "--namespace", "ns2"}},
},
lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: "--tiller-namespacetns1" + helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`,
{Filter: "^bar$", Flags: "--tiller-namespacetns2" + helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`,
},
// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
concurrency: 1,
},
// //
// deletes: deleting all releases in the correct order // deletes: deleting all releases in the correct order
// //
@ -3310,10 +3115,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3343,10 +3148,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3378,10 +3183,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3412,10 +3217,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3446,10 +3251,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3480,10 +3285,10 @@ releases:
{Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -3540,10 +3345,10 @@ releases:
{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^external-secrets$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default external-secrets 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
{Filter: "^my-release$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^my-release$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default
`, `,
}, },
@ -3972,8 +3777,7 @@ changing working directory back to "/path/to"
}, },
} }
for i := range testcases { for _, tc := range testcases {
tc := testcases[i]
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
wantUpgrades := tc.upgraded wantUpgrades := tc.upgraded
wantDeletes := tc.deleted wantDeletes := tc.deleted
@ -3986,6 +3790,7 @@ changing working directory back to "/path/to"
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {
@ -4142,13 +3947,13 @@ changing working directory back to "/path/to"
}, },
} }
for i := range testcases { for _, tc := range testcases {
tc := testcases[i]
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
var helm = &exectest.Helm{ var helm = &exectest.Helm{
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {

View File

@ -5,28 +5,17 @@ import (
) )
type Context struct { type Context struct {
updatedRepos map[string]bool updatedRepos map[string]bool
updatedReposV2 map[string]bool
} }
func NewContext() Context { func NewContext() Context {
return Context{ return Context{
updatedRepos: map[string]bool{}, updatedRepos: map[string]bool{},
updatedReposV2: map[string]bool{},
} }
} }
func (ctx Context) SyncReposOnce(st *state.HelmState, helm state.RepoUpdater) error { func (ctx Context) SyncReposOnce(st *state.HelmState, helm state.RepoUpdater) error {
var ( updated, err := st.SyncRepos(helm, ctx.updatedRepos)
updated []string
err error
)
if helm.IsHelm3() {
updated, err = st.SyncRepos(helm, ctx.updatedRepos)
} else {
updated, err = st.SyncRepos(helm, ctx.updatedReposV2)
}
for _, r := range updated { for _, r := range updated {
ctx.updatedRepos[r] = true ctx.updatedRepos[r] = true

View File

@ -15,7 +15,6 @@ import (
func TestDestroy_2(t *testing.T) { func TestDestroy_2(t *testing.T) {
type testcase struct { type testcase struct {
helm3 bool
ns string ns string
concurrency int concurrency int
error string error string
@ -35,7 +34,7 @@ func TestDestroy_2(t *testing.T) {
wantDeletes := tc.deleted wantDeletes := tc.deleted
var helm = &exectest.Helm{ var helm = &exectest.Helm{
Helm3: tc.helm3, Helm3: true,
FailOnUnexpectedList: true, FailOnUnexpectedList: true,
FailOnUnexpectedDiff: true, FailOnUnexpectedDiff: true,
Lists: tc.lists, Lists: tc.lists,
@ -209,32 +208,32 @@ releases:
files: files, files: files,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^frontend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v3$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v3$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^logging$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^logging$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default
`, `,
{Filter: "^front-proxy$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^front-proxy$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default
`, `,
{Filter: "^servicemesh$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^servicemesh$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default
`, `,
{Filter: "^database$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^database$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default
`, `,
{Filter: "^anotherbackend$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^anotherbackend$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default
`, `,
}, },
@ -426,32 +425,32 @@ changing working directory back to "/path/to"
selectors: []string{"name=logging"}, selectors: []string{"name=logging"},
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^frontend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v3$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v3$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v2$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v2$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^logging$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^logging$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default
`, `,
{Filter: "^front-proxy$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^front-proxy$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default
`, `,
{Filter: "^servicemesh$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^servicemesh$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default
`, `,
{Filter: "^database$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^database$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default
`, `,
{Filter: "^anotherbackend$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^anotherbackend$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default
`, `,
}, },
@ -607,9 +606,9 @@ changing working directory back to "/path/to"
files: filesForTwoReleases, files: filesForTwoReleases,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
}, },
// Disable concurrency to avoid in-deterministic result // Disable concurrency to avoid in-deterministic result
@ -675,7 +674,6 @@ changing working directory back to "/path/to"
t.Run("helm3", func(t *testing.T) { t.Run("helm3", func(t *testing.T) {
check(t, testcase{ check(t, testcase{
helm3: true,
files: filesForTwoReleases, files: filesForTwoReleases,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{

View File

@ -1,6 +1,7 @@
package app package app
import ( import (
"strings"
"sync" "sync"
"testing" "testing"
@ -14,12 +15,23 @@ import (
) )
const ( const (
helmV2ListFlags = "--kube-contextdefault--deleting--deployed--failed--pending"
helmV2ListFlagsWithoutKubeContext = "--deleting--deployed--failed--pending"
helmV3ListFlags = "--kube-contextdefault--uninstalling--deployed--failed--pending" helmV3ListFlags = "--kube-contextdefault--uninstalling--deployed--failed--pending"
helmV3ListFlagsWithoutKubeContext = "--uninstalling--deployed--failed--pending" helmV3ListFlagsWithoutKubeContext = "--uninstalling--deployed--failed--pending"
) )
func listFlags(namespace, kubeContext string) string {
var flags []string
if kubeContext != "" {
flags = append(flags, "--kube-context", kubeContext)
}
if namespace != "" {
flags = append(flags, "--namespace", namespace)
}
flags = append(flags, "--uninstalling--deployed--failed--pending")
return strings.Join(flags, "")
}
type destroyConfig struct { type destroyConfig struct {
args string args string
concurrency int concurrency int
@ -55,7 +67,6 @@ func (d destroyConfig) IncludeTransitiveNeeds() bool {
func TestDestroy(t *testing.T) { func TestDestroy(t *testing.T) {
type testcase struct { type testcase struct {
helm3 bool
ns string ns string
concurrency int concurrency int
error string error string
@ -75,7 +86,7 @@ func TestDestroy(t *testing.T) {
wantDeletes := tc.deleted wantDeletes := tc.deleted
var helm = &exectest.Helm{ var helm = &exectest.Helm{
Helm3: tc.helm3, Helm3: true,
FailOnUnexpectedList: true, FailOnUnexpectedList: true,
FailOnUnexpectedDiff: true, FailOnUnexpectedDiff: true,
Lists: tc.lists, Lists: tc.lists,
@ -248,32 +259,32 @@ releases:
files: files, files: files,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^frontend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default
`, `,
{Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default
`, `,
{Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default
`, `,
{Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default
`, `,
{Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default
`, `,
}, },
@ -465,32 +476,32 @@ changing working directory back to "/path/to"
selectors: []string{"name=logging"}, selectors: []string{"name=logging"},
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^frontend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^frontend-v3$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v3$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default frontend-v3 4 Fri Nov 1 08:40:07 2019 DEPLOYED frontend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v2$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v2$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v2 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^logging$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^logging$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default logging 4 Fri Nov 1 08:40:07 2019 DEPLOYED fluent-bit-3.1.0 3.1.0 default
`, `,
{Filter: "^front-proxy$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^front-proxy$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default front-proxy 4 Fri Nov 1 08:40:07 2019 DEPLOYED envoy-3.1.0 3.1.0 default
`, `,
{Filter: "^servicemesh$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^servicemesh$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default servicemesh 4 Fri Nov 1 08:40:07 2019 DEPLOYED istio-3.1.0 3.1.0 default
`, `,
{Filter: "^database$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^database$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default database 4 Fri Nov 1 08:40:07 2019 DEPLOYED mysql-3.1.0 3.1.0 default
`, `,
{Filter: "^anotherbackend$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^anotherbackend$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default anotherbackend 4 Fri Nov 1 08:40:07 2019 DEPLOYED anotherbackend-3.1.0 3.1.0 default
`, `,
}, },
@ -646,9 +657,9 @@ changing working directory back to "/path/to"
files: filesForTwoReleases, files: filesForTwoReleases,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
}, },
// Disable concurrency to avoid in-deterministic result // Disable concurrency to avoid in-deterministic result
@ -714,13 +725,12 @@ changing working directory back to "/path/to"
t.Run("helm3", func(t *testing.T) { t.Run("helm3", func(t *testing.T) {
check(t, testcase{ check(t, testcase{
helm3: true,
files: filesForTwoReleases, files: filesForTwoReleases,
diffs: map[exectest.DiffKey]error{}, diffs: map[exectest.DiffKey]error{},
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^frontend-v1$", Flags: helmV3ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
{Filter: "^backend-v1$", Flags: helmV3ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
`, `,
}, },
// Disable concurrency to avoid in-deterministic result // Disable concurrency to avoid in-deterministic result

View File

@ -116,10 +116,10 @@ releases:
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
// delete frontend-v1 and backend-v1 // delete frontend-v1 and backend-v1
{Filter: "^frontend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
}, },
@ -152,8 +152,8 @@ releases:
{Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: nil, {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode--reset-values"}: nil,
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: ``, {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: ``,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -332,61 +332,6 @@ releases:
}, },
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
}, },
{
name: "helm2 upgrade when tns1 foo needs tns2 bar",
loc: location(),
files: map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: foo
chart: mychart1
namespace: ns1
tillerNamespace: tns1
needs:
- tns2/bar
- name: bar
chart: mychart2
namespace: ns2
tillerNamespace: tns2
`,
},
detailedExitcode: true,
error: "Identified at least one change",
diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
},
upgraded: []exectest.Release{},
},
{
name: "helm2 upgrade when tns2 bar needs tns1 foo",
loc: location(),
files: map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: bar
chart: mychart2
namespace: ns2
tillerNamespace: tns2
needs:
- tns1/foo
- name: foo
chart: mychart1
namespace: ns1
tillerNamespace: tns1
`,
},
detailedExitcode: true,
error: "Identified at least one change",
diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
},
upgraded: []exectest.Release{},
// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
concurrency: 1,
},
{ {
name: "helm3 upgrade when ns2 bar needs ns1 foo", name: "helm3 upgrade when ns2 bar needs ns1 foo",
loc: location(), loc: location(),
@ -439,10 +384,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -471,10 +416,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -505,10 +450,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -537,10 +482,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -572,10 +517,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -607,10 +552,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -639,10 +584,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -671,10 +616,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -1008,8 +953,7 @@ changing working directory back to "/path/to"
}, },
} }
for i := range testcases { for _, tc := range testcases {
tc := testcases[i]
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
wantUpgrades := tc.upgraded wantUpgrades := tc.upgraded
wantDeletes := tc.deleted wantDeletes := tc.deleted
@ -1022,6 +966,7 @@ changing working directory back to "/path/to"
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {

View File

@ -251,10 +251,10 @@ releases:
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
// delete frontend-v1 and backend-v1 // delete frontend-v1 and backend-v1
{Filter: "^frontend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^frontend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default frontend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
{Filter: "^backend-v1$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^backend-v1$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default backend-v1 4 Fri Nov 1 08:40:07 2019 DEPLOYED backend-3.1.0 3.1.0 default
`, `,
}, },
@ -287,8 +287,8 @@ releases:
{Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil, {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: nil,
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: ``, {Filter: "^foo$", Flags: listFlags("", "default")}: ``,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -505,51 +505,21 @@ releases:
- name: foo - name: foo
chart: mychart1 chart: mychart1
namespace: ns1 namespace: ns1
tillerNamespace: tns1
needs: needs:
- tns2/bar - ns2/bar
- name: bar - name: bar
chart: mychart2 chart: mychart2
namespace: ns2 namespace: ns2
tillerNamespace: tns2
`, `,
}, },
detailedExitcode: true, detailedExitcode: true,
error: "Identified at least one change", error: "Identified at least one change",
diffs: map[exectest.DiffKey]error{ diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "bar", Chart: "mychart2", Flags: "--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
upgraded: []exectest.Release{}, upgraded: []exectest.Release{},
}, },
{
name: "helm2 upgrade when tns2 bar needs tns1 foo",
loc: location(),
files: map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: bar
chart: mychart2
namespace: ns2
tillerNamespace: tns2
needs:
- tns1/foo
- name: foo
chart: mychart1
namespace: ns1
tillerNamespace: tns1
`,
},
detailedExitcode: true,
error: "Identified at least one change",
diffs: map[exectest.DiffKey]error{
{Name: "bar", Chart: "mychart2", Flags: "--tiller-namespacetns2--kube-contextdefault--namespacens2--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
{Name: "foo", Chart: "mychart1", Flags: "--tiller-namespacetns1--kube-contextdefault--namespacens1--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
},
upgraded: []exectest.Release{},
// as we check for log output, set concurrency to 1 to avoid non-deterministic test result
concurrency: 1,
},
{ {
name: "helm3 upgrade when ns2 bar needs ns1 foo", name: "helm3 upgrade when ns2 bar needs ns1 foo",
loc: location(), loc: location(),
@ -602,10 +572,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -634,10 +604,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -668,10 +638,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -700,10 +670,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -735,10 +705,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -770,10 +740,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -802,10 +772,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -837,10 +807,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -872,10 +842,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -904,10 +874,10 @@ releases:
{Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-contextdefault--detailed-exitcode--reset-values"}: helmexec.ExitError{Code: 2},
}, },
lists: map[exectest.ListKey]string{ lists: map[exectest.ListKey]string{
{Filter: "^foo$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart1-3.1.0 3.1.0 default
`, `,
{Filter: "^bar$", Flags: helmV2ListFlags}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE {Filter: "^bar$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 default
`, `,
}, },
@ -1305,8 +1275,7 @@ changing working directory back to "/path/to"
}, },
} }
for i := range testcases { for _, tc := range testcases {
tc := testcases[i]
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
wantUpgrades := tc.upgraded wantUpgrades := tc.upgraded
wantDeletes := tc.deleted wantDeletes := tc.deleted
@ -1319,6 +1288,7 @@ changing working directory back to "/path/to"
DiffMutex: &sync.Mutex{}, DiffMutex: &sync.Mutex{},
ChartsMutex: &sync.Mutex{}, ChartsMutex: &sync.Mutex{},
ReleasesMutex: &sync.Mutex{}, ReleasesMutex: &sync.Mutex{},
Helm3: true,
} }
bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) { bs := runWithLogCapture(t, "debug", func(t *testing.T, logger *zap.SugaredLogger) {

View File

@ -26,6 +26,10 @@ func NewRun(st *state.HelmState, helm helmexec.Interface, ctx Context) *Run {
panic("Assertion failed: helmexec.Interface must not be nil") panic("Assertion failed: helmexec.Interface must not be nil")
} }
if !helm.IsHelm3() {
panic("helmfile has deprecated helm2 since v1.0")
}
return &Run{state: st, helm: helm, ctx: ctx} return &Run{state: st, helm: helm, ctx: ctx}
} }

View File

@ -1,54 +0,0 @@
processing file "helmfile.yaml" in directory "."
changing working directory to "/path/to"
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: bar
3: chart: mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
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: bar
3: chart: mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/tns1/foo
2 default/tns2/bar
processing releases in group 1/2: default/tns1/foo
processing releases in group 2/2: default/tns2/bar
Affected releases are:
bar (mychart2) UPDATED
foo (mychart1) UPDATED
changing working directory back to "/path/to"

View File

@ -8,14 +8,12 @@ first-pass rendering output of "helmfile.yaml.part.0":
2: - name: foo 2: - name: foo
3: chart: mychart1 3: chart: mychart1
4: namespace: ns1 4: namespace: ns1
5: tillerNamespace: tns1 5: needs:
6: needs: 6: - ns2/bar
7: - tns2/bar 7: - name: bar
8: - name: bar 8: chart: mychart2
9: chart: mychart2 9: namespace: ns2
10: namespace: ns2 10:
11: tillerNamespace: tns2
12:
first-pass produced: &{default map[] map[]} first-pass produced: &{default map[] map[]}
first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]}
@ -28,25 +26,23 @@ second-pass rendering result of "helmfile.yaml.part.0":
2: - name: foo 2: - name: foo
3: chart: mychart1 3: chart: mychart1
4: namespace: ns1 4: namespace: ns1
5: tillerNamespace: tns1 5: needs:
6: needs: 6: - ns2/bar
7: - tns2/bar 7: - name: bar
8: - name: bar 8: chart: mychart2
9: chart: mychart2 9: namespace: ns2
10: namespace: ns2 10:
11: tillerNamespace: tns2
12:
merged environment: &{default map[] map[]} merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml 2 release(s) found in helmfile.yaml
processing 2 groups of releases in this order: processing 2 groups of releases in this order:
GROUP RELEASES GROUP RELEASES
1 default/tns2/bar 1 default/ns2/bar
2 default/tns1/foo 2 default/ns1/foo
processing releases in group 1/2: default/tns2/bar processing releases in group 1/2: default/ns2/bar
processing releases in group 2/2: default/tns1/foo processing releases in group 2/2: default/ns1/foo
Affected releases are: Affected releases are:
bar (mychart2) UPDATED bar (mychart2) UPDATED
foo (mychart1) UPDATED foo (mychart1) UPDATED

View File

@ -1,54 +0,0 @@
processing file "helmfile.yaml" in directory "."
changing working directory to "/path/to"
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: mychart1
4: namespace: ns1
5: tillerNamespace: tns1
6: needs:
7: - tns2/bar
8: - name: bar
9: chart: mychart2
10: namespace: ns2
11: tillerNamespace: tns2
12:
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: mychart1
4: namespace: ns1
5: tillerNamespace: tns1
6: needs:
7: - tns2/bar
8: - name: bar
9: chart: mychart2
10: namespace: ns2
11: tillerNamespace: tns2
12:
merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml
processing 2 groups of releases in this order:
GROUP RELEASES
1 tns2/bar
2 tns1/foo
processing releases in group 1/2: tns2/bar
processing releases in group 2/2: tns1/foo
Affected releases are:
bar (mychart2) UPDATED
foo (mychart1) UPDATED
changing working directory back to "/path/to"

View File

@ -1,54 +0,0 @@
processing file "helmfile.yaml" in directory "."
changing working directory to "/path/to"
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: bar
3: chart: mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
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: bar
3: chart: mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml
processing 2 groups of releases in this order:
GROUP RELEASES
1 tns1/foo
2 tns2/bar
processing releases in group 1/2: tns1/foo
processing releases in group 2/2: tns2/bar
Affected releases are:
bar (mychart2) UPDATED
foo (mychart1) UPDATED
changing working directory back to "/path/to"

View File

@ -1,69 +0,0 @@
processing file "helmfile.yaml" in directory "."
changing working directory to "/path/to"
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: stable/mychart1
4: namespace: ns1
5: tillerNamespace: tns1
6: needs:
7: - tns2/bar
8: - name: bar
9: chart: stable/mychart2
10: namespace: ns2
11: tillerNamespace: tns2
12:
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: stable/mychart1
4: namespace: ns1
5: tillerNamespace: tns1
6: needs:
7: - tns2/bar
8: - name: bar
9: chart: stable/mychart2
10: namespace: ns2
11: tillerNamespace: tns2
12:
merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml
Affected releases are:
bar (stable/mychart2) UPDATED
foo (stable/mychart1) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
GROUP RELEASES
1 default/tns1/foo
2 default/tns2/bar
invoking preapply hooks for releases in group 1/2: default/tns1/foo
invoking preapply hooks for releases in group 2/2: default/tns2/bar
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/tns2/bar
2 default/tns1/foo
processing releases in group 1/2: default/tns2/bar
getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default/tns1/foo
getting deployed release version failed: Failed to get the version for: mychart1
UPDATED RELEASES:
NAME CHART VERSION
bar stable/mychart2
foo stable/mychart1
changing working directory back to "/path/to"

View File

@ -1,67 +0,0 @@
processing file "helmfile.yaml" in directory "."
changing working directory to "/path/to"
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: bar
3: chart: stable/mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: stable/mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
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: bar
3: chart: stable/mychart2
4: namespace: ns2
5: tillerNamespace: tns2
6: needs:
7: - tns1/foo
8: - name: foo
9: chart: stable/mychart1
10: namespace: ns1
11: tillerNamespace: tns1
12:
merged environment: &{default map[] map[]}
2 release(s) found in helmfile.yaml
Affected releases are:
bar (stable/mychart2) UPDATED
foo (stable/mychart1) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
GROUP RELEASES
1 default/tns2/bar
2 default/tns1/foo
invoking preapply hooks for releases in group 1/2: default/tns2/bar
invoking preapply hooks for releases in group 2/2: default/tns1/foo
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/tns1/foo
2 default/tns2/bar
processing releases in group 1/2: default/tns1/foo
processing releases in group 2/2: default/tns2/bar
UPDATED RELEASES:
NAME CHART VERSION
foo stable/mychart1 3.1.0
bar stable/mychart2 3.1.0
changing working directory back to "/path/to"

View File

@ -54,10 +54,10 @@ GROUP RELEASES
2 default//foo 2 default//foo
processing releases in group 1/2: default//baz, default//bar processing releases in group 1/2: default//baz, default//bar
getting deployed release version failed: unexpected list key: listkey(filter=^baz$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in getting deployed release version failed: unexpected list key: listkey(filter=^baz$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in
getting deployed release version failed: unexpected list key: listkey(filter=^bar$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in getting deployed release version failed: unexpected list key: listkey(filter=^bar$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in
processing releases in group 2/2: default//foo processing releases in group 2/2: default//foo
getting deployed release version failed: unexpected list key: listkey(filter=^foo$,flags=--kube-contextdefault--deleting--deployed--failed--pending) not found in getting deployed release version failed: unexpected list key: listkey(filter=^foo$,flags=--kube-contextdefault--uninstalling--deployed--failed--pending) not found in
UPDATED RELEASES: UPDATED RELEASES:
NAME CHART VERSION NAME CHART VERSION

View File

@ -27,17 +27,17 @@ func TestGetArgs(t *testing.T) {
expected: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false -q www -w", expected: "-e a.yaml -d b.yaml -i --set app1.bootstrap=true --set app2.bootstrap=false -q www -w",
}, },
{ {
args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns", args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false",
expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false --tiller-namespace ns", expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false",
}, },
{ {
args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns", args: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true",
defaultArgs: []string{"--recreate-pods", "--force"}, defaultArgs: []string{"--recreate-pods", "--force"},
expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --tiller-namespace ns --recreate-pods --force", expected: "--timeout=3600 --set app1.bootstrap=true --set app2.bootstrap=false,app3.bootstrap=true --recreate-pods --force",
}, },
} }
for _, test := range tests { for _, test := range tests {
Helmdefaults := state.HelmSpec{KubeContext: "test", TillerNamespace: "test-namespace", Args: test.defaultArgs} Helmdefaults := state.HelmSpec{KubeContext: "test", Args: test.defaultArgs}
testState := &state.HelmState{ testState := &state.HelmState{
ReleaseSetSpec: state.ReleaseSetSpec{ ReleaseSetSpec: state.ReleaseSetSpec{
HelmDefaults: Helmdefaults, HelmDefaults: Helmdefaults,

View File

@ -2,43 +2,10 @@ package helmexec
import ( import (
"io" "io"
"os"
"path/filepath"
) )
type HelmContext struct { type HelmContext struct {
Tillerless bool HistoryMax int
TillerNamespace string WorkerIndex int
HistoryMax int Writer io.Writer
WorkerIndex int
Writer io.Writer
}
func (context *HelmContext) GetTillerlessArgs(helm *execer) []string {
if context.Tillerless && !helm.IsHelm3() {
if context.TillerNamespace != "" {
return []string{"tiller", "run", context.TillerNamespace, "--", helm.helmBinary}
}
return []string{"tiller", "run", "--", helm.helmBinary}
}
return []string{}
}
func (context *HelmContext) getTillerlessEnv() map[string]string {
if context.Tillerless {
result := map[string]string{
"HELM_TILLER_SILENT": "true",
// Changing the TILLER port doesn't really work: https://github.com/helm/helm/issues/3159
// So this is not used for the moment.
// "HELM_TILLER_PORT": strconv.Itoa(44134 + context.WorkerIndex),
}
if config := os.Getenv("KUBECONFIG"); config != "" {
absConfig, err := filepath.Abs(config)
if err == nil {
result["KUBECONFIG"] = absConfig
}
}
return result
}
return map[string]string{}
} }

View File

@ -1,100 +0,0 @@
package helmexec
import (
"os"
"path/filepath"
"testing"
"github.com/Masterminds/semver/v3"
"github.com/stretchr/testify/require"
)
// TestGetTillerlessArgs tests the GetTillerlessArgs function
func TestGetTillerlessArgs(t *testing.T) {
helmBinary := "helm"
tests := []struct {
tillerless bool
helmMajorVersion string
tillerNamespace string
expected []string
}{
{
tillerless: true,
helmMajorVersion: "2.0.0",
expected: []string{"tiller", "run", "--", helmBinary},
},
{
tillerless: true,
helmMajorVersion: "2.0.0",
tillerNamespace: "test-namespace",
expected: []string{"tiller", "run", "test-namespace", "--", helmBinary},
},
{
tillerless: false,
helmMajorVersion: "2.0.0",
expected: []string{},
},
{
tillerless: true,
helmMajorVersion: "3.0.0",
expected: []string{},
},
}
for _, test := range tests {
hc := &HelmContext{
Tillerless: test.tillerless,
TillerNamespace: test.tillerNamespace,
}
sr, _ := semver.NewVersion(test.helmMajorVersion)
he := &execer{
helmBinary: helmBinary,
version: *sr,
}
require.Equalf(t, test.expected, hc.GetTillerlessArgs(he), "expected result %s, received result %s", test.expected, hc.GetTillerlessArgs(he))
}
}
func pwd() string {
pwd, _ := os.Getwd()
return pwd
}
// TestGetTillerlessEnv tests the getTillerlessEnv function
func TestGetTillerlessEnv(t *testing.T) {
kubeconfigEnv := "KUBECONFIG"
tests := []struct {
tillerless bool
kubeconfig string
expected map[string]string
}{
{
tillerless: true,
kubeconfig: "",
expected: map[string]string{"HELM_TILLER_SILENT": "true"},
},
{
tillerless: true,
kubeconfig: "abc",
expected: map[string]string{"HELM_TILLER_SILENT": "true", kubeconfigEnv: filepath.Join(pwd(), "abc")},
},
{
tillerless: true,
kubeconfig: "/path/to/kubeconfig",
expected: map[string]string{"HELM_TILLER_SILENT": "true", kubeconfigEnv: "/path/to/kubeconfig"},
},
{
tillerless: false,
expected: map[string]string{},
},
}
for _, test := range tests {
hc := &HelmContext{
Tillerless: test.tillerless,
}
t.Setenv(kubeconfigEnv, test.kubeconfig)
result := hc.getTillerlessEnv()
require.Equalf(t, test.expected, result, "expected result %s, received result %s", test.expected, result)
}
}

View File

@ -248,14 +248,10 @@ func (helm *execer) UpdateDeps(chart string) error {
func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags ...string) error { func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags ...string) error {
helm.logger.Infof("Upgrading release=%v, chart=%v", name, redactedURL(chart)) helm.logger.Infof("Upgrading release=%v, chart=%v", name, redactedURL(chart))
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
if helm.IsHelm3() { flags = append(flags, "--history-max", strconv.Itoa(context.HistoryMax))
flags = append(flags, "--history-max", strconv.Itoa(context.HistoryMax))
} else {
env["HELM_TILLER_HISTORY_MAX"] = strconv.Itoa(context.HistoryMax)
}
out, err := helm.exec(append(append(preArgs, "upgrade", "--install", name, chart), flags...), env, nil) out, err := helm.exec(append(append(preArgs, "upgrade", "--install", name, chart), flags...), env, nil)
helm.write(nil, out) helm.write(nil, out)
@ -264,8 +260,8 @@ func (helm *execer) SyncRelease(context HelmContext, name, chart string, flags .
func (helm *execer) ReleaseStatus(context HelmContext, name string, flags ...string) error { func (helm *execer) ReleaseStatus(context HelmContext, name string, flags ...string) error {
helm.logger.Infof("Getting status %v", name) helm.logger.Infof("Getting status %v", name)
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
out, err := helm.exec(append(append(preArgs, "status", name), flags...), env, nil) out, err := helm.exec(append(append(preArgs, "status", name), flags...), env, nil)
helm.write(nil, out) helm.write(nil, out)
return err return err
@ -273,14 +269,9 @@ func (helm *execer) ReleaseStatus(context HelmContext, name string, flags ...str
func (helm *execer) List(context HelmContext, filter string, flags ...string) (string, error) { func (helm *execer) List(context HelmContext, filter string, flags ...string) (string, error) {
helm.logger.Infof("Listing releases matching %v", filter) helm.logger.Infof("Listing releases matching %v", filter)
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
var args []string args := []string{"list", "--filter", filter}
if helm.IsHelm3() {
args = []string{"list", "--filter", filter}
} else {
args = []string{"list", filter}
}
enableLiveOutput := false enableLiveOutput := false
out, err := helm.exec(append(append(preArgs, args...), flags...), env, &enableLiveOutput) out, err := helm.exec(append(append(preArgs, args...), flags...), env, &enableLiveOutput)
@ -290,11 +281,9 @@ func (helm *execer) List(context HelmContext, filter string, flags ...string) (s
// of the release to exist. // of the release to exist.
// //
// This fixes it by removing the header from the v3 output, so that the output is formatted the same as that of v2. // This fixes it by removing the header from the v3 output, so that the output is formatted the same as that of v2.
if helm.IsHelm3() { lines := strings.Split(string(out), "\n")
lines := strings.Split(string(out), "\n") lines = lines[1:]
lines = lines[1:] out = []byte(strings.Join(lines, "\n"))
out = []byte(strings.Join(lines, "\n"))
}
helm.write(nil, out) helm.write(nil, out)
return string(out), err return string(out), err
} }
@ -320,8 +309,8 @@ func (helm *execer) DecryptSecret(context HelmContext, name string, flags ...str
helm.decryptedSecretMutex.Unlock() helm.decryptedSecretMutex.Unlock()
helm.logger.Infof("Decrypting secret %v", absPath) helm.logger.Infof("Decrypting secret %v", absPath)
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
settings := cli.New() settings := cli.New()
pluginVersion, err := GetPluginVersion("secrets", settings.PluginsDirectory) pluginVersion, err := GetPluginVersion("secrets", settings.PluginsDirectory)
if err != nil { if err != nil {
@ -389,12 +378,7 @@ func (helm *execer) DecryptSecret(context HelmContext, name string, flags ...str
func (helm *execer) TemplateRelease(name string, chart string, flags ...string) error { func (helm *execer) TemplateRelease(name string, chart string, flags ...string) error {
helm.logger.Infof("Templating release=%v, chart=%v", name, redactedURL(chart)) helm.logger.Infof("Templating release=%v, chart=%v", name, redactedURL(chart))
var args []string args := []string{"template", name, chart}
if helm.IsHelm3() {
args = []string{"template", name, chart}
} else {
args = []string{"template", chart, "--name", name}
}
out, err := helm.exec(append(args, flags...), map[string]string{}, nil) out, err := helm.exec(append(args, flags...), map[string]string{}, nil)
@ -431,8 +415,8 @@ func (helm *execer) DiffRelease(context HelmContext, name, chart string, suppres
} else { } else {
helm.logger.Infof("Comparing release=%v, chart=%v", name, redactedURL(chart)) helm.logger.Infof("Comparing release=%v, chart=%v", name, redactedURL(chart))
} }
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
var overrideEnableLiveOutput *bool = nil var overrideEnableLiveOutput *bool = nil
if suppressDiff { if suppressDiff {
enableLiveOutput := false enableLiveOutput := false
@ -511,8 +495,8 @@ func (helm *execer) ChartExport(chart string, path string, flags ...string) erro
func (helm *execer) DeleteRelease(context HelmContext, name string, flags ...string) error { func (helm *execer) DeleteRelease(context HelmContext, name string, flags ...string) error {
helm.logger.Infof("Deleting %v", name) helm.logger.Infof("Deleting %v", name)
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
out, err := helm.exec(append(append(preArgs, "delete", name), flags...), env, nil) out, err := helm.exec(append(append(preArgs, "delete", name), flags...), env, nil)
helm.write(nil, out) helm.write(nil, out)
return err return err
@ -520,8 +504,8 @@ func (helm *execer) DeleteRelease(context HelmContext, name string, flags ...str
func (helm *execer) TestRelease(context HelmContext, name string, flags ...string) error { func (helm *execer) TestRelease(context HelmContext, name string, flags ...string) error {
helm.logger.Infof("Testing %v", name) helm.logger.Infof("Testing %v", name)
preArgs := context.GetTillerlessArgs(helm) preArgs := make([]string, 0)
env := context.getTillerlessEnv() env := make(map[string]string)
args := []string{"test", name} args := []string{"test", name}
out, err := helm.exec(append(append(preArgs, args...), flags...), env, nil) out, err := helm.exec(append(append(preArgs, args...), flags...), env, nil)
helm.write(nil, out) helm.write(nil, out)
@ -634,10 +618,6 @@ func resolveOciChart(ociChart string) (ociChartURL, ociChartTag string) {
} }
func (helm *execer) ShowChart(chartPath string) (chart.Metadata, error) { func (helm *execer) ShowChart(chartPath string) (chart.Metadata, error) {
if !helm.IsHelm3() {
// show chart command isn't supported in helm2
return chart.Metadata{}, fmt.Errorf("helm show isn't supported in helm2")
}
var helmArgs = []string{"show", "chart", chartPath} var helmArgs = []string{"show", "chart", chartPath}
out, error := helm.exec(helmArgs, map[string]string{}, nil) out, error := helm.exec(helmArgs, map[string]string{}, nil)
if error != nil { if error != nil {

View File

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"path"
"path/filepath" "path/filepath"
"reflect" "reflect"
"regexp" "regexp"
@ -277,7 +276,7 @@ func Test_SyncRelease(t *testing.T) {
helm := MockExecer(logger, "dev") helm := MockExecer(logger, "dev")
err := helm.SyncRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait", "--wait-for-jobs") err := helm.SyncRelease(HelmContext{}, "release", "chart", "--timeout 10", "--wait", "--wait-for-jobs")
expected := `Upgrading release=release, chart=chart expected := `Upgrading release=release, chart=chart
exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wait --wait-for-jobs exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wait --wait-for-jobs --history-max 0
` `
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -289,7 +288,7 @@ exec: helm --kube-context dev upgrade --install release chart --timeout 10 --wai
buffer.Reset() buffer.Reset()
err = helm.SyncRelease(HelmContext{}, "release", "chart") err = helm.SyncRelease(HelmContext{}, "release", "chart")
expected = `Upgrading release=release, chart=chart expected = `Upgrading release=release, chart=chart
exec: helm --kube-context dev upgrade --install release chart exec: helm --kube-context dev upgrade --install release chart --history-max 0
` `
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -301,24 +300,7 @@ exec: helm --kube-context dev upgrade --install release chart
buffer.Reset() buffer.Reset()
err = helm.SyncRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz") err = helm.SyncRelease(HelmContext{}, "release", "https://example_user:example_password@repo.example.com/chart.tgz")
expected = `Upgrading release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz expected = `Upgrading release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz
exec: helm --kube-context dev upgrade --install release https://example_user:example_password@repo.example.com/chart.tgz exec: helm --kube-context dev upgrade --install release https://example_user:example_password@repo.example.com/chart.tgz --history-max 0
`
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if buffer.String() != expected {
t.Errorf("helmexec.SyncRelease()\nactual = %v\nexpect = %v", buffer.String(), expected)
}
}
func Test_SyncReleaseTillerless(t *testing.T) {
var buffer bytes.Buffer
logger := NewLogger(&buffer, "debug")
helm := MockExecer(logger, "dev")
err := helm.SyncRelease(HelmContext{Tillerless: true, TillerNamespace: "foo"}, "release", "chart",
"--timeout 10", "--wait", "--wait-for-jobs")
expected := `Upgrading release=release, chart=chart
exec: helm --kube-context dev tiller run foo -- helm upgrade --install release chart --timeout 10 --wait --wait-for-jobs
` `
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -548,22 +530,6 @@ exec: helm --kube-context dev diff upgrade --allow-unreleased release https://ex
} }
} }
func Test_DiffReleaseTillerless(t *testing.T) {
var buffer bytes.Buffer
logger := NewLogger(&buffer, "debug")
helm := MockExecer(logger, "dev")
err := helm.DiffRelease(HelmContext{Tillerless: true}, "release", "chart", false, "--timeout 10", "--wait", "--wait-for-jobs")
expected := `Comparing release=release, chart=chart
exec: helm --kube-context dev tiller run -- helm diff upgrade --allow-unreleased release chart --timeout 10 --wait --wait-for-jobs
`
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if buffer.String() != expected {
t.Errorf("helmexec.DiffRelease()\nactual = %v\nexpect = %v", buffer.String(), expected)
}
}
func Test_DeleteRelease(t *testing.T) { func Test_DeleteRelease(t *testing.T) {
var buffer bytes.Buffer var buffer bytes.Buffer
logger := NewLogger(&buffer, "debug") logger := NewLogger(&buffer, "debug")
@ -887,31 +853,6 @@ func Test_LogLevels(t *testing.T) {
} }
} }
func Test_getTillerlessEnv(t *testing.T) {
context := HelmContext{Tillerless: true, TillerNamespace: "foo", WorkerIndex: 1}
os.Unsetenv("KUBECONFIG")
actual := context.getTillerlessEnv()
if val, found := actual["HELM_TILLER_SILENT"]; !found || val != "true" {
t.Errorf("getTillerlessEnv() HELM_TILLER_SILENT\nactual = %s\nexpect = true", val)
}
// This feature is disabled until it is fixed in helm
/*if val, found := actual["HELM_TILLER_PORT"]; !found || val != "44135" {
t.Errorf("getTillerlessEnv() HELM_TILLER_PORT\nactual = %s\nexpect = 44135", val)
}*/
if val, found := actual["KUBECONFIG"]; found {
t.Errorf("getTillerlessEnv() KUBECONFIG\nactual = %s\nexpect = nil", val)
}
t.Setenv("KUBECONFIG", "toto")
actual = context.getTillerlessEnv()
cwd, _ := os.Getwd()
expected := path.Join(cwd, "toto")
if val, found := actual["KUBECONFIG"]; !found || val != expected {
t.Errorf("getTillerlessEnv() KUBECONFIG\nactual = %s\nexpect = %s", val, expected)
}
}
func Test_mergeEnv(t *testing.T) { func Test_mergeEnv(t *testing.T) {
actual := env2map(mergeEnv([]string{"A=1", "B=c=d", "E=2"}, map[string]string{"B": "3", "F": "4"})) actual := env2map(mergeEnv([]string{"A=1", "B=c=d", "E=2"}, map[string]string{"B": "3", "F": "4"}))
expected := map[string]string{"A": "1", "B": "3", "E": "2", "F": "4"} expected := map[string]string{"A": "1", "B": "3", "E": "2", "F": "4"}
@ -926,7 +867,7 @@ func Test_Template(t *testing.T) {
helm := MockExecer(logger, "dev") helm := MockExecer(logger, "dev")
err := helm.TemplateRelease("release", "path/to/chart", "--values", "file.yml") err := helm.TemplateRelease("release", "path/to/chart", "--values", "file.yml")
expected := `Templating release=release, chart=path/to/chart expected := `Templating release=release, chart=path/to/chart
exec: helm --kube-context dev template path/to/chart --name release --values file.yml exec: helm --kube-context dev template release path/to/chart --values file.yml
` `
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -938,7 +879,7 @@ exec: helm --kube-context dev template path/to/chart --name release --values fil
buffer.Reset() buffer.Reset()
err = helm.TemplateRelease("release", "https://example_user:example_password@repo.example.com/chart.tgz", "--values", "file.yml") err = helm.TemplateRelease("release", "https://example_user:example_password@repo.example.com/chart.tgz", "--values", "file.yml")
expected = `Templating release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz expected = `Templating release=release, chart=https://example_user:xxxxx@repo.example.com/chart.tgz
exec: helm --kube-context dev template https://example_user:example_password@repo.example.com/chart.tgz --name release --values file.yml exec: helm --kube-context dev template release https://example_user:example_password@repo.example.com/chart.tgz --values file.yml
` `
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -1064,15 +1005,8 @@ func Test_resolveOciChart(t *testing.T) {
} }
func Test_ShowChart(t *testing.T) { func Test_ShowChart(t *testing.T) {
helm2Runner := mockRunner{output: []byte("Client: v2.16.1+ge13bc94\n")}
helm := New("helm", false, NewLogger(os.Stdout, "info"), "dev", &helm2Runner)
_, err := helm.ShowChart("fake-chart")
if err == nil {
t.Error("helmexec.ShowChart() - helm show isn't supported in helm2")
}
showChartRunner := mockRunner{output: []byte("name: my-chart\nversion: 3.2.0\n")} showChartRunner := mockRunner{output: []byte("name: my-chart\nversion: 3.2.0\n")}
helm = &execer{ helm := &execer{
helmBinary: "helm", helmBinary: "helm",
version: *semver.MustParse("3.3.2"), version: *semver.MustParse("3.3.2"),
logger: NewLogger(os.Stdout, "info"), logger: NewLogger(os.Stdout, "info"),

View File

@ -9,7 +9,6 @@ import (
"github.com/Masterminds/semver/v3" "github.com/Masterminds/semver/v3"
goversion "github.com/hashicorp/go-version" goversion "github.com/hashicorp/go-version"
"github.com/r3labs/diff"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/helmfile/helmfile/pkg/app/version" "github.com/helmfile/helmfile/pkg/app/version"
@ -297,10 +296,7 @@ func (m *chartDependencyManager) lockFileName() string {
} }
func (m *chartDependencyManager) Update(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { func (m *chartDependencyManager) Update(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) {
if shell.IsHelm3() { return m.updateHelm3(shell, wd, unresolved)
return m.updateHelm3(shell, wd, unresolved)
}
return m.updateHelm2(shell, wd, unresolved)
} }
func (m *chartDependencyManager) updateHelm3(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) { func (m *chartDependencyManager) updateHelm3(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) {
@ -319,24 +315,6 @@ func (m *chartDependencyManager) updateHelm3(shell helmexec.DependencyUpdater, w
return m.doUpdate("Chart.lock", unresolved, shell, wd) return m.doUpdate("Chart.lock", unresolved, shell, wd)
} }
func (m *chartDependencyManager) updateHelm2(shell helmexec.DependencyUpdater, wd string, unresolved *UnresolvedDependencies) (*ResolvedDependencies, error) {
// Generate `Chart.yaml` of the temporary local chart
if err := m.writeBytes(filepath.Join(wd, "Chart.yaml"), []byte(fmt.Sprintf("name: %s\nversion: 1.0.0\n", m.Name))); err != nil {
return nil, err
}
// Generate `requirements.yaml` of the temporary local chart from the helmfile state
reqsContent, err := yaml.Marshal(unresolved.ToChartRequirements())
if err != nil {
return nil, err
}
if err := m.writeBytes(filepath.Join(wd, "requirements.yaml"), reqsContent); err != nil {
return nil, err
}
return m.doUpdate("requirements.lock", unresolved, shell, wd)
}
func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *UnresolvedDependencies, shell helmexec.DependencyUpdater, wd string) (*ResolvedDependencies, error) { func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *UnresolvedDependencies, shell helmexec.DependencyUpdater, wd string) (*ResolvedDependencies, error) {
// Generate `requirements.lock` of the temporary local chart by coping `<basename>.lock` // Generate `requirements.lock` of the temporary local chart by coping `<basename>.lock`
lockFilePath := m.lockFileName() lockFilePath := m.lockFileName()
@ -346,7 +324,7 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre
return nil, err return nil, err
} }
if shell.IsHelm3() && originalLockFileContent != nil { if originalLockFileContent != nil {
if err := m.writeBytes(filepath.Join(wd, chartLockFile), originalLockFileContent); err != nil { if err := m.writeBytes(filepath.Join(wd, chartLockFile), originalLockFileContent); err != nil {
return nil, err return nil, err
} }
@ -372,24 +350,6 @@ func (m *chartDependencyManager) doUpdate(chartLockFile string, unresolved *Unre
return lockedReqs.ResolvedDependencies[i].ChartName < lockedReqs.ResolvedDependencies[j].ChartName return lockedReqs.ResolvedDependencies[i].ChartName < lockedReqs.ResolvedDependencies[j].ChartName
}) })
// Don't update lock file if no dependency updated.
if !shell.IsHelm3() && originalLockFileContent != nil {
originalLockedReqs := &ChartLockedRequirements{}
if err := yaml.Unmarshal(originalLockFileContent, originalLockedReqs); err != nil {
return nil, err
}
changes, err := diff.Diff(originalLockedReqs.ResolvedDependencies, lockedReqs.ResolvedDependencies)
if err != nil {
return nil, err
}
if len(changes) == 0 {
lockedReqs.Generated = originalLockedReqs.Generated
}
}
lockedReqs.Version = version.Version() lockedReqs.Version = version.Version()
updatedLockFileContent, err = yaml.Marshal(lockedReqs) updatedLockFileContent, err = yaml.Marshal(lockedReqs)

View File

@ -298,7 +298,7 @@ func (c *StateCreator) scatterGatherEnvSecretFiles(st *HelmState, envSecretFiles
} }
release := &ReleaseSpec{} release := &ReleaseSpec{}
flags := st.appendConnectionFlags([]string{}, helm, release) flags := st.appendConnectionFlags([]string{}, release)
decFile, err := helm.DecryptSecret(st.createHelmContext(release, 0), urlOrPath, flags...) decFile, err := helm.DecryptSecret(st.createHelmContext(release, 0), urlOrPath, flags...)
if err != nil { if err != nil {
results <- secretResult{secret.id, nil, err, secret.path} results <- secretResult{secret.id, nil, err, secret.path}

View File

@ -27,16 +27,14 @@ func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) []st
// append post-renderer flags to helm flags // append post-renderer flags to helm flags
func (st *HelmState) appendPostRenderFlags(flags []string, release *ReleaseSpec, helm helmexec.Interface) []string { func (st *HelmState) appendPostRenderFlags(flags []string, release *ReleaseSpec, helm helmexec.Interface) []string {
if helm.IsHelm3() { switch {
switch { // helm.GetPostRenderer() comes from cmd flag.
// helm.GetPostRenderer() comes from cmd flag. case helm.GetPostRenderer() != "":
case helm.GetPostRenderer() != "": flags = append(flags, "--post-renderer", helm.GetPostRenderer())
flags = append(flags, "--post-renderer", helm.GetPostRenderer()) case release.PostRenderer != nil && *release.PostRenderer != "":
case release.PostRenderer != nil && *release.PostRenderer != "": flags = append(flags, "--post-renderer", *release.PostRenderer)
flags = append(flags, "--post-renderer", *release.PostRenderer) case st.HelmDefaults.PostRenderer != nil && *st.HelmDefaults.PostRenderer != "":
case st.HelmDefaults.PostRenderer != nil && *st.HelmDefaults.PostRenderer != "": flags = append(flags, "--post-renderer", *st.HelmDefaults.PostRenderer)
flags = append(flags, "--post-renderer", *st.HelmDefaults.PostRenderer)
}
} }
return flags return flags
} }

View File

@ -67,15 +67,6 @@ func (r ReleaseSpec) ExecuteTemplateExpressions(renderer *tmpl.FileRenderer) (*R
result.InstalledTemplate = &resultTmpl result.InstalledTemplate = &resultTmpl
} }
if result.TillerlessTemplate != nil {
ts := *result.TillerlessTemplate
resultTmpl, err := renderer.RenderTemplateContentToString([]byte(ts))
if err != nil {
return nil, fmt.Errorf("failed executing template expressions in release \"%s\".version = \"%s\": %v", r.Name, ts, err)
}
result.TillerlessTemplate = &resultTmpl
}
if result.VerifyTemplate != nil { if result.VerifyTemplate != nil {
ts := *result.VerifyTemplate ts := *result.VerifyTemplate
resultTmpl, err := renderer.RenderTemplateContentToString([]byte(ts)) resultTmpl, err := renderer.RenderTemplateContentToString([]byte(ts))

View File

@ -144,11 +144,9 @@ type SubhelmfileEnvironmentSpec struct {
// HelmSpec to defines helmDefault values // HelmSpec to defines helmDefault values
type HelmSpec struct { type HelmSpec struct {
KubeContext string `yaml:"kubeContext,omitempty"` KubeContext string `yaml:"kubeContext,omitempty"`
TillerNamespace string `yaml:"tillerNamespace,omitempty"` Args []string `yaml:"args,omitempty"`
Tillerless bool `yaml:"tillerless"` Verify bool `yaml:"verify"`
Args []string `yaml:"args,omitempty"`
Verify bool `yaml:"verify"`
// Devel, when set to true, use development versions, too. Equivalent to version '>0.0.0-0' // Devel, when set to true, use development versions, too. Equivalent to version '>0.0.0-0'
Devel bool `yaml:"devel"` Devel bool `yaml:"devel"`
// Wait, if set to true, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful // Wait, if set to true, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful
@ -295,9 +293,6 @@ type ReleaseSpec struct {
ValuesPathPrefix string `yaml:"valuesPathPrefix,omitempty"` ValuesPathPrefix string `yaml:"valuesPathPrefix,omitempty"`
TillerNamespace string `yaml:"tillerNamespace,omitempty"`
Tillerless *bool `yaml:"tillerless,omitempty"`
KubeContext string `yaml:"kubeContext,omitempty"` KubeContext string `yaml:"kubeContext,omitempty"`
TLS *bool `yaml:"tls,omitempty"` TLS *bool `yaml:"tls,omitempty"`
@ -306,10 +301,9 @@ type ReleaseSpec struct {
TLSCert string `yaml:"tlsCert,omitempty"` TLSCert string `yaml:"tlsCert,omitempty"`
// These values are used in templating // These values are used in templating
TillerlessTemplate *string `yaml:"tillerlessTemplate,omitempty"` VerifyTemplate *string `yaml:"verifyTemplate,omitempty"`
VerifyTemplate *string `yaml:"verifyTemplate,omitempty"` WaitTemplate *string `yaml:"waitTemplate,omitempty"`
WaitTemplate *string `yaml:"waitTemplate,omitempty"` InstalledTemplate *string `yaml:"installedTemplate,omitempty"`
InstalledTemplate *string `yaml:"installedTemplate,omitempty"`
// These settings requires helm-x integration to work // These settings requires helm-x integration to work
Dependencies []Dependency `yaml:"dependencies,omitempty"` Dependencies []Dependency `yaml:"dependencies,omitempty"`
@ -400,8 +394,7 @@ const MissingFileHandlerWarn = "Warn"
const MissingFileHandlerDebug = "Debug" const MissingFileHandlerDebug = "Debug"
var DefaultFetchOutputDirTemplate = path.Join( var DefaultFetchOutputDirTemplate = path.Join(
"{{ .OutputDir }}{{ if .Release.TillerNamespace }}", "{{ .OutputDir }}{{ if .Release.Namespace }}",
"{{ .Release.TillerNamespace }}{{ end }}{{ if .Release.Namespace }}",
"{{ .Release.Namespace }}{{ end }}{{ if .Release.KubeContext }}", "{{ .Release.Namespace }}{{ end }}{{ if .Release.KubeContext }}",
"{{ .Release.KubeContext }}{{ end }}", "{{ .Release.KubeContext }}{{ end }}",
"{{ .Release.Name }}", "{{ .Release.Name }}",
@ -432,8 +425,6 @@ func (st *HelmState) ApplyOverrides(spec *ReleaseSpec) {
if len(components) > 1 { if len(components) > 1 {
ns = components[len(components)-2] ns = components[len(components)-2]
} else if spec.TillerNamespace != "" {
ns = spec.TillerNamespace
} else { } else {
ns = spec.Namespace ns = spec.Namespace
} }
@ -721,17 +712,14 @@ func ReleaseToID(r *ReleaseSpec) string {
id += kc + "/" id += kc + "/"
} }
tns := r.TillerNamespace
ns := r.Namespace ns := r.Namespace
if tns != "" { if ns != "" {
id += tns + "/"
} else if ns != "" {
id += ns + "/" id += ns + "/"
} }
if kc != "" { if kc != "" {
if tns == "" && ns == "" { if ns == "" {
// This is intentional to avoid conflating kc=,ns=foo,name=bar and kc=foo,ns=,name=bar. // This is intentional to avoid conflating kc=,ns=foo,name=bar and kc=foo,ns=,name=bar.
// Before https://github.com/roboll/helmfile/pull/1823 they were both `foo/bar` which turned out to break `needs` in many ways. // Before https://github.com/roboll/helmfile/pull/1823 they were both `foo/bar` which turned out to break `needs` in many ways.
// //
@ -780,15 +768,10 @@ func (st *HelmState) DeleteReleasesForSync(affectedReleases *AffectedReleases, h
relErr = newReleaseFailedError(release, err) relErr = newReleaseFailedError(release, err)
} else { } else {
var args []string var args []string
if helm.IsHelm3() { if release.Namespace != "" {
args = []string{} args = append(args, "--namespace", release.Namespace)
if release.Namespace != "" {
args = append(args, "--namespace", release.Namespace)
}
} else {
args = []string{"--purge"}
} }
deletionFlags := st.appendConnectionFlags(args, helm, release) deletionFlags := st.appendConnectionFlags(args, release)
m.Lock() m.Lock()
if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release) affectedReleases.Failed = append(affectedReleases.Failed, release)
@ -893,12 +876,7 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme
relErr = newReleaseFailedError(release, err) relErr = newReleaseFailedError(release, err)
} else if installed { } else if installed {
var args []string var args []string
if helm.IsHelm3() { deletionFlags := st.appendConnectionFlags(args, release)
args = []string{}
} else {
args = []string{"--purge"}
}
deletionFlags := st.appendConnectionFlags(args, helm, release)
m.Lock() m.Lock()
if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil {
affectedReleases.Failed = append(affectedReleases.Failed, release) affectedReleases.Failed = append(affectedReleases.Failed, release)
@ -973,15 +951,11 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme
} }
func (st *HelmState) listReleases(context helmexec.HelmContext, helm helmexec.Interface, release *ReleaseSpec) (string, error) { func (st *HelmState) listReleases(context helmexec.HelmContext, helm helmexec.Interface, release *ReleaseSpec) (string, error) {
flags := st.connectionFlags(helm, release) flags := st.connectionFlags(release)
if helm.IsHelm3() { if release.Namespace != "" {
if release.Namespace != "" { flags = append(flags, "--namespace", release.Namespace)
flags = append(flags, "--namespace", release.Namespace)
}
flags = append(flags, "--uninstalling")
} else {
flags = append(flags, "--deleting")
} }
flags = append(flags, "--uninstalling")
flags = append(flags, "--deployed", "--failed", "--pending") flags = append(flags, "--deployed", "--failed", "--pending")
return helm.List(context, "^"+release.Name+"$", flags...) return helm.List(context, "^"+release.Name+"$", flags...)
} }
@ -1107,12 +1081,6 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre
jobQueue := make(chan *ReleaseSpec, len(releases)) jobQueue := make(chan *ReleaseSpec, len(releases))
results := make(chan *chartPrepareResult, len(releases)) results := make(chan *chartPrepareResult, len(releases))
var helm3 bool
if helm != nil {
helm3 = helm.IsHelm3()
}
if !opts.SkipResolve { if !opts.SkipResolve {
updated, err := st.ResolveDeps() updated, err := st.ResolveDeps()
if err != nil { if err != nil {
@ -1193,7 +1161,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre
if chartification != nil && helmfileCommand != "pull" { if chartification != nil && helmfileCommand != "pull" {
c := chartify.New( c := chartify.New(
chartify.HelmBin(st.DefaultHelmBinary), chartify.HelmBin(st.DefaultHelmBinary),
chartify.UseHelm3(helm3), chartify.UseHelm3(true),
chartify.WithLogf(st.logger.Debugf), chartify.WithLogf(st.logger.Debugf),
) )
@ -1348,7 +1316,7 @@ func (st *HelmState) runHelmDepBuilds(helm helmexec.Interface, concurrency int,
// //
// See https://github.com/roboll/helmfile/issues/1521 // See https://github.com/roboll/helmfile/issues/1521
for _, r := range builds { for _, r := range builds {
buildDepsFlags := getBuildDepsFlags(helm, r) buildDepsFlags := getBuildDepsFlags(r)
if err := helm.BuildDeps(r.releaseName, r.chartPath, buildDepsFlags...); err != nil { if err := helm.BuildDeps(r.releaseName, r.chartPath, buildDepsFlags...); err != nil {
if r.chartFetchedByGoGetter { if r.chartFetchedByGoGetter {
diagnostic := fmt.Sprintf( diagnostic := fmt.Sprintf(
@ -1855,14 +1823,6 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu
} }
func (st *HelmState) createHelmContext(spec *ReleaseSpec, workerIndex int) helmexec.HelmContext { func (st *HelmState) createHelmContext(spec *ReleaseSpec, workerIndex int) helmexec.HelmContext {
namespace := st.HelmDefaults.TillerNamespace
if spec.TillerNamespace != "" {
namespace = spec.TillerNamespace
}
tillerless := st.HelmDefaults.Tillerless
if spec.Tillerless != nil {
tillerless = *spec.Tillerless
}
historyMax := 10 historyMax := 10
if st.HelmDefaults.HistoryMax != nil { if st.HelmDefaults.HistoryMax != nil {
historyMax = *st.HelmDefaults.HistoryMax historyMax = *st.HelmDefaults.HistoryMax
@ -1872,10 +1832,8 @@ func (st *HelmState) createHelmContext(spec *ReleaseSpec, workerIndex int) helme
} }
return helmexec.HelmContext{ return helmexec.HelmContext{
Tillerless: tillerless, WorkerIndex: workerIndex,
TillerNamespace: namespace, HistoryMax: historyMax,
WorkerIndex: workerIndex,
HistoryMax: historyMax,
} }
} }
@ -2018,10 +1976,10 @@ func (st *HelmState) ReleaseStatuses(helm helmexec.Interface, workerLimit int) [
st.ApplyOverrides(&release) st.ApplyOverrides(&release)
flags := []string{} flags := []string{}
if helm.IsHelm3() && release.Namespace != "" { if release.Namespace != "" {
flags = append(flags, "--namespace", release.Namespace) flags = append(flags, "--namespace", release.Namespace)
} }
flags = st.appendConnectionFlags(flags, helm, &release) flags = st.appendConnectionFlags(flags, &release)
return helm.ReleaseStatus(st.createHelmContext(&release, workerIndex), release.Name, flags...) return helm.ReleaseStatus(st.createHelmContext(&release, workerIndex), release.Name, flags...)
}) })
@ -2032,12 +1990,9 @@ func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm hel
return st.scatterGatherReleases(helm, concurrency, func(release ReleaseSpec, workerIndex int) error { return st.scatterGatherReleases(helm, concurrency, func(release ReleaseSpec, workerIndex int) error {
st.ApplyOverrides(&release) st.ApplyOverrides(&release)
flags := []string{} flags := make([]string, 0)
if purge && !helm.IsHelm3() { flags = st.appendConnectionFlags(flags, &release)
flags = append(flags, "--purge") if release.Namespace != "" {
}
flags = st.appendConnectionFlags(flags, helm, &release)
if helm.IsHelm3() && release.Namespace != "" {
flags = append(flags, "--namespace", release.Namespace) flags = append(flags, "--namespace", release.Namespace)
} }
context := st.createHelmContext(&release, workerIndex) context := st.createHelmContext(&release, workerIndex)
@ -2089,27 +2044,22 @@ func (st *HelmState) TestReleases(helm helmexec.Interface, cleanup bool, timeout
} }
flags := []string{} flags := []string{}
if helm.IsHelm3() && release.Namespace != "" { if release.Namespace != "" {
flags = append(flags, "--namespace", release.Namespace) flags = append(flags, "--namespace", release.Namespace)
} }
if cleanup && !helm.IsHelm3() {
flags = append(flags, "--cleanup")
}
if opts.Logs { if opts.Logs {
flags = append(flags, "--logs") flags = append(flags, "--logs")
} }
if timeout == EmptyTimeout { if timeout == EmptyTimeout {
flags = append(flags, st.timeoutFlags(helm, &release)...) flags = append(flags, st.timeoutFlags(&release)...)
} else { } else {
duration := strconv.Itoa(timeout) duration := strconv.Itoa(timeout)
if helm.IsHelm3() { duration += "s"
duration += "s"
}
flags = append(flags, "--timeout", duration) flags = append(flags, "--timeout", duration)
} }
flags = st.appendConnectionFlags(flags, helm, &release) flags = st.appendConnectionFlags(flags, &release)
return helm.TestRelease(st.createHelmContext(&release, workerIndex), release.Name, flags...) return helm.TestRelease(st.createHelmContext(&release, workerIndex), release.Name, flags...)
}) })
@ -2424,62 +2374,48 @@ func findChartDirectory(topLevelDir string) (string, error) {
} }
// appendConnectionFlags append all the helm command-line flags related to K8s API and Tiller connection including the kubecontext // appendConnectionFlags append all the helm command-line flags related to K8s API and Tiller connection including the kubecontext
func (st *HelmState) appendConnectionFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec) []string { func (st *HelmState) appendConnectionFlags(flags []string, release *ReleaseSpec) []string {
adds := st.connectionFlags(helm, release) adds := st.connectionFlags(release)
flags = append(flags, adds...) flags = append(flags, adds...)
return flags return flags
} }
func (st *HelmState) connectionFlags(helm helmexec.Interface, release *ReleaseSpec) []string { func (st *HelmState) connectionFlags(release *ReleaseSpec) []string {
flags := []string{} flags := []string{}
tillerless := st.HelmDefaults.Tillerless if release.TLS != nil && *release.TLS || release.TLS == nil && st.HelmDefaults.TLS {
if release.Tillerless != nil { flags = append(flags, "--tls")
tillerless = *release.Tillerless
} }
if !tillerless {
if !helm.IsHelm3() {
if release.TillerNamespace != "" {
flags = append(flags, "--tiller-namespace", release.TillerNamespace)
} else if st.HelmDefaults.TillerNamespace != "" {
flags = append(flags, "--tiller-namespace", st.HelmDefaults.TillerNamespace)
}
}
if release.TLS != nil && *release.TLS || release.TLS == nil && st.HelmDefaults.TLS { if release.TLSKey != "" {
flags = append(flags, "--tls") flags = append(flags, "--tls-key", release.TLSKey)
} } else if st.HelmDefaults.TLSKey != "" {
flags = append(flags, "--tls-key", st.HelmDefaults.TLSKey)
}
if release.TLSKey != "" { if release.TLSCert != "" {
flags = append(flags, "--tls-key", release.TLSKey) flags = append(flags, "--tls-cert", release.TLSCert)
} else if st.HelmDefaults.TLSKey != "" { } else if st.HelmDefaults.TLSCert != "" {
flags = append(flags, "--tls-key", st.HelmDefaults.TLSKey) flags = append(flags, "--tls-cert", st.HelmDefaults.TLSCert)
} }
if release.TLSCert != "" { if release.TLSCACert != "" {
flags = append(flags, "--tls-cert", release.TLSCert) flags = append(flags, "--tls-ca-cert", release.TLSCACert)
} else if st.HelmDefaults.TLSCert != "" { } else if st.HelmDefaults.TLSCACert != "" {
flags = append(flags, "--tls-cert", st.HelmDefaults.TLSCert) flags = append(flags, "--tls-ca-cert", st.HelmDefaults.TLSCACert)
} }
if release.TLSCACert != "" { if release.KubeContext != "" {
flags = append(flags, "--tls-ca-cert", release.TLSCACert) flags = append(flags, "--kube-context", release.KubeContext)
} else if st.HelmDefaults.TLSCACert != "" { } else if st.Environments[st.Env.Name].KubeContext != "" {
flags = append(flags, "--tls-ca-cert", st.HelmDefaults.TLSCACert) flags = append(flags, "--kube-context", st.Environments[st.Env.Name].KubeContext)
} } else if st.HelmDefaults.KubeContext != "" {
flags = append(flags, "--kube-context", st.HelmDefaults.KubeContext)
if release.KubeContext != "" {
flags = append(flags, "--kube-context", release.KubeContext)
} else if st.Environments[st.Env.Name].KubeContext != "" {
flags = append(flags, "--kube-context", st.Environments[st.Env.Name].KubeContext)
} else if st.HelmDefaults.KubeContext != "" {
flags = append(flags, "--kube-context", st.HelmDefaults.KubeContext)
}
} }
return flags return flags
} }
func (st *HelmState) timeoutFlags(helm helmexec.Interface, release *ReleaseSpec) []string { func (st *HelmState) timeoutFlags(release *ReleaseSpec) []string {
var flags []string var flags []string
timeout := st.HelmDefaults.Timeout timeout := st.HelmDefaults.Timeout
@ -2488,9 +2424,7 @@ func (st *HelmState) timeoutFlags(helm helmexec.Interface, release *ReleaseSpec)
} }
if timeout != 0 { if timeout != 0 {
duration := strconv.Itoa(timeout) duration := strconv.Itoa(timeout)
if helm.IsHelm3() { duration += "s"
duration += "s"
}
flags = append(flags, "--timeout", duration) flags = append(flags, "--timeout", duration)
} }
@ -2512,7 +2446,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp
flags = append(flags, "--wait-for-jobs") flags = append(flags, "--wait-for-jobs")
} }
flags = append(flags, st.timeoutFlags(helm, release)...) flags = append(flags, st.timeoutFlags(release)...)
if release.Force != nil && *release.Force || release.Force == nil && st.HelmDefaults.Force { if release.Force != nil && *release.Force || release.Force == nil && st.HelmDefaults.Force {
flags = append(flags, "--force") flags = append(flags, "--force")
@ -2545,7 +2479,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp
flags = append(flags, "--disable-openapi-validation") flags = append(flags, "--disable-openapi-validation")
} }
flags = st.appendConnectionFlags(flags, helm, release) flags = st.appendConnectionFlags(flags, release)
flags = st.appendHelmXFlags(flags, release) flags = st.appendHelmXFlags(flags, release)
@ -2561,14 +2495,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp
func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, []string, error) { func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, []string, error) {
var flags []string var flags []string
// `helm template` in helm v2 does not support `--version` flag. So we fetch with the version flag and then template flags = st.chartVersionFlags(release)
// without the flag. See PrepareCharts function to see the Helmfile implementation of chart fetching.
//
// `helm template` in helm v3 supports `--version` and it automatically fetches the remote chart to template,
// so we skip fetching on helmfile-side and let helm fetch it.
if helm.IsHelm3() {
flags = st.chartVersionFlags(release)
}
flags = st.appendHelmXFlags(flags, release) flags = st.appendHelmXFlags(flags, release)
@ -2609,7 +2536,7 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec,
flags = st.appendApiVersionsFlags(flags, release) flags = st.appendApiVersionsFlags(flags, release)
flags = st.appendConnectionFlags(flags, helm, release) flags = st.appendConnectionFlags(flags, release)
flags = st.appendHelmXFlags(flags, release) flags = st.appendHelmXFlags(flags, release)
@ -2932,7 +2859,7 @@ func (st *HelmState) generateSecretValuesFiles(helm helmexec.Interface, release
} }
path := paths[0] path := paths[0]
decryptFlags := st.appendConnectionFlags([]string{}, helm, release) decryptFlags := st.appendConnectionFlags([]string{}, release)
valfile, err := helm.DecryptSecret(st.createHelmContext(release, workerIndex), path, decryptFlags...) valfile, err := helm.DecryptSecret(st.createHelmContext(release, workerIndex), path, decryptFlags...)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -66,15 +66,6 @@ func updateBoolTemplatedValues(r *ReleaseSpec) error {
} }
} }
if r.TillerlessTemplate != nil {
if tillerless, err := getBoolRefFromStringTemplate(*r.TillerlessTemplate); err != nil {
return fmt.Errorf("tillerlessTemplate: %v", err)
} else {
r.TillerlessTemplate = nil
r.Tillerless = tillerless
}
}
if r.VerifyTemplate != nil { if r.VerifyTemplate != nil {
if verify, err := getBoolRefFromStringTemplate(*r.VerifyTemplate); err != nil { if verify, err := getBoolRefFromStringTemplate(*r.VerifyTemplate); err != nil {
return fmt.Errorf("verifyTemplate: %v", err) return fmt.Errorf("verifyTemplate: %v", err)

View File

@ -63,25 +63,23 @@ func TestHelmState_executeTemplates(t *testing.T) {
{ {
name: "Has template expressions in boolean values", name: "Has template expressions in boolean values",
input: ReleaseSpec{ input: ReleaseSpec{
Chart: "test-chart", Chart: "test-chart",
Name: "app-dev", Name: "app-dev",
Namespace: "dev", Namespace: "dev",
Labels: map[string]string{"id": "app"}, Labels: map[string]string{"id": "app"},
InstalledTemplate: func(i string) *string { return &i }(`{{ eq .Release.Labels.id "app" | ternary "true" "false" }}`), InstalledTemplate: func(i string) *string { return &i }(`{{ eq .Release.Labels.id "app" | ternary "true" "false" }}`),
VerifyTemplate: func(i string) *string { return &i }(`{{ true }}`), VerifyTemplate: func(i string) *string { return &i }(`{{ true }}`),
Verify: func(i bool) *bool { return &i }(false), Verify: func(i bool) *bool { return &i }(false),
WaitTemplate: func(i string) *string { return &i }(`{{ false }}`), WaitTemplate: func(i string) *string { return &i }(`{{ false }}`),
TillerlessTemplate: func(i string) *string { return &i }(`true`),
}, },
want: ReleaseSpec{ want: ReleaseSpec{
Chart: "test-chart", Chart: "test-chart",
Name: "app-dev", Name: "app-dev",
Namespace: "dev", Namespace: "dev",
Labels: map[string]string{"id": "app"}, Labels: map[string]string{"id": "app"},
Installed: func(i bool) *bool { return &i }(true), Installed: func(i bool) *bool { return &i }(true),
Verify: func(i bool) *bool { return &i }(true), Verify: func(i bool) *bool { return &i }(true),
Wait: func(i bool) *bool { return &i }(false), Wait: func(i bool) *bool { return &i }(false),
Tillerless: func(i bool) *bool { return &i }(true),
}, },
}, },
{ {
@ -182,11 +180,6 @@ func TestHelmState_executeTemplates(t *testing.T) {
boolPtrToString(tt.want.Installed), boolPtrToString(actual.Installed), boolPtrToString(tt.want.Installed), boolPtrToString(actual.Installed),
) )
} }
if !reflect.DeepEqual(actual.Tillerless, tt.want.Tillerless) {
t.Errorf("expected actual.Tillerless %+v, got %+v",
boolPtrToString(tt.want.Tillerless), boolPtrToString(actual.Tillerless),
)
}
if !reflect.DeepEqual(actual.Verify, tt.want.Verify) { if !reflect.DeepEqual(actual.Verify, tt.want.Verify) {
t.Errorf("expected actual.Verify %+v, got %+v", t.Errorf("expected actual.Verify %+v, got %+v",
boolPtrToString(tt.want.Verify), boolPtrToString(actual.Verify), boolPtrToString(tt.want.Verify), boolPtrToString(actual.Verify),

View File

@ -22,16 +22,6 @@ func (st *HelmState) scatterGather(concurrency int, items int, produceInputs fun
concurrency = items concurrency = items
} }
for _, r := range st.Releases {
if r.Tillerless != nil {
if *r.Tillerless {
concurrency = 1
}
} else if st.HelmDefaults.Tillerless {
concurrency = 1
}
}
// WaitGroup is required to wait until goroutine per job in job queue cleanly stops. // WaitGroup is required to wait until goroutine per job in job queue cleanly stops.
var waitGroup sync.WaitGroup var waitGroup sync.WaitGroup
waitGroup.Add(concurrency) waitGroup.Add(concurrency)

View File

@ -408,7 +408,7 @@ func TestHelmState_flagsForUpgrade(t *testing.T) {
}, },
want: []string{ want: []string{
"--version", "0.1", "--version", "0.1",
"--timeout", "123", "--timeout", "123s",
"--namespace", "test-namespace", "--namespace", "test-namespace",
}, },
}, },
@ -426,7 +426,7 @@ func TestHelmState_flagsForUpgrade(t *testing.T) {
}, },
want: []string{ want: []string{
"--version", "0.1", "--version", "0.1",
"--timeout", "123", "--timeout", "123s",
"--namespace", "test-namespace", "--namespace", "test-namespace",
}, },
}, },
@ -534,79 +534,6 @@ func TestHelmState_flagsForUpgrade(t *testing.T) {
"--namespace", "test-namespace", "--namespace", "test-namespace",
}, },
}, },
{
name: "tiller",
defaults: HelmSpec{},
release: &ReleaseSpec{
Chart: "test/chart",
Version: "0.1",
Name: "test-charts",
TLS: boolValue(true),
TillerNamespace: "tiller-system",
TLSKey: "key.pem",
TLSCert: "cert.pem",
TLSCACert: "ca.pem",
},
want: []string{
"--version", "0.1",
"--tiller-namespace", "tiller-system",
"--tls",
"--tls-key", "key.pem",
"--tls-cert", "cert.pem",
"--tls-ca-cert", "ca.pem",
},
},
{
name: "tiller-override-defaults",
defaults: HelmSpec{
TLS: false,
TillerNamespace: "a",
TLSKey: "b.pem",
TLSCert: "c.pem",
TLSCACert: "d.pem",
},
release: &ReleaseSpec{
Chart: "test/chart",
Version: "0.1",
Name: "test-charts",
TLS: boolValue(true),
TillerNamespace: "tiller-system",
TLSKey: "key.pem",
TLSCert: "cert.pem",
TLSCACert: "ca.pem",
},
want: []string{
"--version", "0.1",
"--tiller-namespace", "tiller-system",
"--tls",
"--tls-key", "key.pem",
"--tls-cert", "cert.pem",
"--tls-ca-cert", "ca.pem",
},
},
{
name: "tiller-from-defaults",
defaults: HelmSpec{
TLS: true,
TillerNamespace: "tiller-system",
TLSKey: "key.pem",
TLSCert: "cert.pem",
TLSCACert: "ca.pem",
},
release: &ReleaseSpec{
Chart: "test/chart",
Version: "0.1",
Name: "test-charts",
},
want: []string{
"--version", "0.1",
"--tiller-namespace", "tiller-system",
"--tls",
"--tls-key", "key.pem",
"--tls-cert", "cert.pem",
"--tls-ca-cert", "ca.pem",
},
},
{ {
name: "create-namespace-default-helm3.2", name: "create-namespace-default-helm3.2",
defaults: HelmSpec{ defaults: HelmSpec{
@ -1263,18 +1190,6 @@ func TestHelmState_SyncReleases(t *testing.T) {
helm: &exectest.Helm{}, helm: &exectest.Helm{},
wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}},
}, },
{
name: "with tiller args",
releases: []ReleaseSpec{
{
Name: "releaseName",
Chart: "foo",
TillerNamespace: "tillerns",
},
},
helm: &exectest.Helm{},
wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}},
},
{ {
name: "escaped values", name: "escaped values",
releases: []ReleaseSpec{ releases: []ReleaseSpec{
@ -1478,6 +1393,7 @@ func TestHelmState_SyncReleases_MissingValuesFileForUndesiredRelease(t *testing.
state = injectFs(state, fs) state = injectFs(state, fs)
helm := &exectest.Helm{ helm := &exectest.Helm{
Lists: map[exectest.ListKey]string{}, Lists: map[exectest.ListKey]string{},
Helm3: true,
} }
//simulate the helm.list call result //simulate the helm.list call result
helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$"}] = tt.listResult helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$"}] = tt.listResult
@ -1610,8 +1526,7 @@ func TestHelmState_SyncReleasesAffectedRealeases(t *testing.T) {
}, },
}, },
} }
for i := range tests { for _, tt := range tests {
tt := tests[i]
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
state := &HelmState{ state := &HelmState{
ReleaseSetSpec: ReleaseSetSpec{ ReleaseSetSpec: ReleaseSetSpec{
@ -1627,7 +1542,7 @@ func TestHelmState_SyncReleasesAffectedRealeases(t *testing.T) {
//simulate the release is already installed //simulate the release is already installed
for i, release := range tt.releases { for i, release := range tt.releases {
if tt.installed != nil && tt.installed[i] { if tt.installed != nil && tt.installed[i] {
helm.Lists[exectest.ListKey{Filter: "^" + release.Name + "$", Flags: "--deleting--deployed--failed--pending"}] = release.Name helm.Lists[exectest.ListKey{Filter: "^" + release.Name + "$", Flags: "--uninstalling--deployed--failed--pending"}] = release.Name
} }
} }
@ -1724,8 +1639,7 @@ func TestGetDeployedVersion(t *testing.T) {
installedVersion: "3.2.0", installedVersion: "3.2.0",
}, },
} }
for i := range tests { for _, tt := range tests {
tt := tests[i]
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
state := &HelmState{ state := &HelmState{
ReleaseSetSpec: ReleaseSetSpec{ ReleaseSetSpec: ReleaseSetSpec{
@ -1740,7 +1654,7 @@ func TestGetDeployedVersion(t *testing.T) {
Lists: map[exectest.ListKey]string{}, Lists: map[exectest.ListKey]string{},
} }
// simulate the helm.list call result // simulate the helm.list call result
helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$", Flags: "--deleting--deployed--failed--pending"}] = tt.listResult helm.Lists[exectest.ListKey{Filter: "^" + tt.release.Name + "$", Flags: "--uninstalling--deployed--failed--pending"}] = tt.listResult
affectedReleases := AffectedReleases{} affectedReleases := AffectedReleases{}
state.SyncReleases(&affectedReleases, helm, []string{}, 1) state.SyncReleases(&affectedReleases, helm, []string{}, 1)
@ -1770,18 +1684,6 @@ func TestHelmState_DiffReleases(t *testing.T) {
helm: &exectest.Helm{}, helm: &exectest.Helm{},
wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}}, wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--reset-values"}}},
}, },
{
name: "with tiller args",
releases: []ReleaseSpec{
{
Name: "releaseName",
Chart: "foo",
TillerNamespace: "tillerns",
},
},
helm: &exectest.Helm{},
wantReleases: []exectest.Release{{Name: "releaseName", Flags: []string{"--tiller-namespace", "tillerns", "--reset-values"}}},
},
{ {
name: "escaped values", name: "escaped values",
releases: []ReleaseSpec{ releases: []ReleaseSpec{
@ -2100,6 +2002,7 @@ func TestHelmState_DiffReleasesCleanup(t *testing.T) {
func TestHelmState_UpdateDeps(t *testing.T) { func TestHelmState_UpdateDeps(t *testing.T) {
helm := &exectest.Helm{ helm := &exectest.Helm{
UpdateDepsCallbacks: map[string]func(string) error{}, UpdateDepsCallbacks: map[string]func(string) error{},
Helm3: true,
} }
var generatedDir string var generatedDir string
@ -2121,7 +2024,7 @@ func TestHelmState_UpdateDeps(t *testing.T) {
digest: sha256:8194b597c85bb3d1fee8476d4a486e952681d5c65f185ad5809f2118bc4079b5 digest: sha256:8194b597c85bb3d1fee8476d4a486e952681d5c65f185ad5809f2118bc4079b5
generated: 2019-05-16T15:42:45.50486+09:00 generated: 2019-05-16T15:42:45.50486+09:00
`) `)
filename := filepath.Join(generatedDir, "requirements.lock") filename := filepath.Join(generatedDir, "Chart.lock")
logger.Debugf("test: writing %s: %s", filename, content) logger.Debugf("test: writing %s: %s", filename, content)
return os.WriteFile(filename, content, 0644) return os.WriteFile(filename, content, 0644)
} }
@ -2350,19 +2253,6 @@ func TestHelmState_ReleaseStatuses(t *testing.T) {
helm: &exectest.Helm{}, helm: &exectest.Helm{},
wantErr: false, wantErr: false,
}, },
{
name: "with tiller args",
releases: []ReleaseSpec{
{
Name: "releaseA",
TillerNamespace: "tillerns",
},
},
helm: &exectest.Helm{},
want: []exectest.Release{
{Name: "releaseA", Flags: []string{"--tiller-namespace", "tillerns"}},
},
},
} }
for i := range tests { for i := range tests {
tt := tests[i] tt := tests[i]
@ -2402,13 +2292,12 @@ func TestHelmState_ReleaseStatuses(t *testing.T) {
func TestHelmState_TestReleasesNoCleanUp(t *testing.T) { func TestHelmState_TestReleasesNoCleanUp(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
cleanup bool cleanup bool
releases []ReleaseSpec releases []ReleaseSpec
helm *exectest.Helm helm *exectest.Helm
want []exectest.Release want []exectest.Release
wantErr bool wantErr bool
tillerNamespace string
}{ }{
{ {
name: "happy path", name: "happy path",
@ -2418,7 +2307,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) {
}, },
}, },
helm: &exectest.Helm{}, helm: &exectest.Helm{},
want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1"}}}, want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1s"}}},
}, },
{ {
name: "do cleanup", name: "do cleanup",
@ -2429,7 +2318,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) {
}, },
}, },
helm: &exectest.Helm{}, helm: &exectest.Helm{},
want: []exectest.Release{{Name: "releaseB", Flags: []string{"--cleanup", "--timeout", "1"}}}, want: []exectest.Release{{Name: "releaseB", Flags: []string{"--timeout", "1s"}}},
}, },
{ {
name: "happy path", name: "happy path",
@ -2441,21 +2330,9 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) {
helm: &exectest.Helm{}, helm: &exectest.Helm{},
wantErr: true, wantErr: true,
}, },
{
name: "with tiller args",
releases: []ReleaseSpec{
{
Name: "releaseA",
TillerNamespace: "tillerns",
},
},
helm: &exectest.Helm{},
want: []exectest.Release{{Name: "releaseA", Flags: []string{"--timeout", "1", "--tiller-namespace", "tillerns"}}},
},
} }
for i := range tests { for _, tt := range tests {
tt := tests[i] t.Run(tt.name, func(t *testing.T) {
f := func(t *testing.T) {
state := &HelmState{ state := &HelmState{
ReleaseSetSpec: ReleaseSetSpec{ ReleaseSetSpec: ReleaseSetSpec{
Releases: tt.releases, Releases: tt.releases,
@ -2470,8 +2347,7 @@ func TestHelmState_TestReleasesNoCleanUp(t *testing.T) {
if !reflect.DeepEqual(tt.helm.Releases, tt.want) { if !reflect.DeepEqual(tt.helm.Releases, tt.want) {
t.Errorf("HelmState.TestReleases() for [%s] = %v, want %v", tt.name, tt.helm.Releases, tt.want) t.Errorf("HelmState.TestReleases() for [%s] = %v, want %v", tt.name, tt.helm.Releases, tt.want)
} }
} })
t.Run(tt.name, f)
} }
} }
@ -2529,16 +2405,16 @@ func TestHelmState_NoReleaseMatched(t *testing.T) {
func TestHelmState_Delete(t *testing.T) { func TestHelmState_Delete(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
deleted []exectest.Release deleted []exectest.Release
wantErr bool wantErr bool
desired *bool desired *bool
installed bool installed bool
purge bool purge bool
flags string flags string
tillerNamespace string namespace string
kubeContext string kubeContext string
defKubeContext string defKubeContext string
}{ }{
{ {
name: "desired and installed (purge=false)", name: "desired and installed (purge=false)",
@ -2570,7 +2446,7 @@ func TestHelmState_Delete(t *testing.T) {
desired: boolValue(true), desired: boolValue(true),
installed: true, installed: true,
purge: true, purge: true,
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}},
}, },
{ {
name: "desired but not installed (purge=false)", name: "desired but not installed (purge=false)",
@ -2586,7 +2462,7 @@ func TestHelmState_Delete(t *testing.T) {
desired: boolValue(true), desired: boolValue(true),
installed: false, installed: false,
purge: true, purge: true,
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}},
}, },
{ {
name: "installed but filtered (purge=false)", name: "installed but filtered (purge=false)",
@ -2602,7 +2478,7 @@ func TestHelmState_Delete(t *testing.T) {
desired: boolValue(false), desired: boolValue(false),
installed: true, installed: true,
purge: true, purge: true,
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}},
}, },
{ {
name: "not installed, and filtered (purge=false)", name: "not installed, and filtered (purge=false)",
@ -2618,17 +2494,7 @@ func TestHelmState_Delete(t *testing.T) {
desired: boolValue(false), desired: boolValue(false),
installed: false, installed: false,
purge: true, purge: true,
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{}}},
},
{
name: "with tiller args",
wantErr: false,
desired: nil,
installed: true,
purge: true,
tillerNamespace: "tillerns",
flags: "--tiller-namespacetillerns",
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--tiller-namespace", "tillerns"}}},
}, },
{ {
name: "with kubecontext", name: "with kubecontext",
@ -2638,7 +2504,7 @@ func TestHelmState_Delete(t *testing.T) {
purge: true, purge: true,
kubeContext: "ctx", kubeContext: "ctx",
flags: "--kube-contextctx", flags: "--kube-contextctx",
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "ctx"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "ctx"}}},
}, },
{ {
name: "with default kubecontext", name: "with default kubecontext",
@ -2648,7 +2514,7 @@ func TestHelmState_Delete(t *testing.T) {
purge: true, purge: true,
defKubeContext: "defctx", defKubeContext: "defctx",
flags: "--kube-contextdefctx", flags: "--kube-contextdefctx",
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "defctx"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "defctx"}}},
}, },
{ {
name: "with non-default and default kubecontexts", name: "with non-default and default kubecontexts",
@ -2659,21 +2525,20 @@ func TestHelmState_Delete(t *testing.T) {
kubeContext: "ctx", kubeContext: "ctx",
defKubeContext: "defctx", defKubeContext: "defctx",
flags: "--kube-contextctx", flags: "--kube-contextctx",
deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--purge", "--kube-context", "ctx"}}}, deleted: []exectest.Release{{Name: "releaseA", Flags: []string{"--kube-context", "ctx"}}},
}, },
} }
for i := range tests { for _, tt := range tests {
tt := tests[i] t.Run(tt.name, func(t *testing.T) {
f := func(t *testing.T) {
name := "releaseA" name := "releaseA"
if tt.wantErr { if tt.wantErr {
name = "releaseA-error" name = "releaseA-error"
} }
release := ReleaseSpec{ release := ReleaseSpec{
Name: name, Name: name,
Installed: tt.desired, Installed: tt.desired,
TillerNamespace: tt.tillerNamespace, Namespace: tt.namespace,
KubeContext: tt.kubeContext, KubeContext: tt.kubeContext,
} }
releases := []ReleaseSpec{ releases := []ReleaseSpec{
release, release,
@ -2691,6 +2556,7 @@ func TestHelmState_Delete(t *testing.T) {
helm := &exectest.Helm{ helm := &exectest.Helm{
Lists: map[exectest.ListKey]string{}, Lists: map[exectest.ListKey]string{},
Deleted: []exectest.Release{}, Deleted: []exectest.Release{},
Helm3: true,
} }
if tt.installed { if tt.installed {
helm.Lists[exectest.ListKey{Filter: "^" + name + "$", Flags: tt.flags}] = name helm.Lists[exectest.ListKey{Filter: "^" + name + "$", Flags: tt.flags}] = name
@ -2705,8 +2571,7 @@ func TestHelmState_Delete(t *testing.T) {
} else if !(reflect.DeepEqual(tt.deleted, helm.Deleted) && (len(affectedReleases.Deleted) == len(tt.deleted))) { } else if !(reflect.DeepEqual(tt.deleted, helm.Deleted) && (len(affectedReleases.Deleted) == len(tt.deleted))) {
t.Errorf("unexpected deletions happened: expected %v, got %v", tt.deleted, helm.Deleted) t.Errorf("unexpected deletions happened: expected %v, got %v", tt.deleted, helm.Deleted)
} }
} })
t.Run(tt.name, f)
} }
} }
@ -2758,6 +2623,7 @@ func TestDiffpareSyncReleases(t *testing.T) {
} }
helm := &exectest.Helm{ helm := &exectest.Helm{
Lists: map[exectest.ListKey]string{}, Lists: map[exectest.ListKey]string{},
Helm3: true,
} }
results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, []string{}, false, false, false, tt.diffOptions) results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, []string{}, false, false, false, tt.diffOptions)
@ -2818,6 +2684,7 @@ func TestPrepareSyncReleases(t *testing.T) {
} }
helm := &exectest.Helm{ helm := &exectest.Helm{
Lists: map[exectest.ListKey]string{}, Lists: map[exectest.ListKey]string{},
Helm3: true,
} }
results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions) results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions)
@ -3126,14 +2993,6 @@ func TestGenerateChartPath(t *testing.T) {
wantErr: false, wantErr: false,
expected: "/output-dir/release-name/chart-name/0.0.0", expected: "/output-dir/release-name/chart-name/0.0.0",
}, },
{
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespace",
chartName: "chart-name",
release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace"},
outputDir: "/output-dir",
wantErr: false,
expected: "/output-dir/tiller-namespace/release-name/chart-name/latest",
},
{ {
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseNamespace", testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseNamespace",
chartName: "chart-name", chartName: "chart-name",
@ -3142,14 +3001,6 @@ func TestGenerateChartPath(t *testing.T) {
wantErr: false, wantErr: false,
expected: "/output-dir/release-namespace/release-name/chart-name/latest", expected: "/output-dir/release-namespace/release-name/chart-name/latest",
}, },
{
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseNamespace",
chartName: "chart-name",
release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", Namespace: "release-namespace"},
outputDir: "/output-dir",
wantErr: false,
expected: "/output-dir/tiller-namespace/release-namespace/release-name/chart-name/latest",
},
{ {
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseKubeContext", testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseKubeContext",
chartName: "chart-name", chartName: "chart-name",
@ -3166,22 +3017,6 @@ func TestGenerateChartPath(t *testing.T) {
wantErr: false, wantErr: false,
expected: "/output-dir/release-namespace/kube-context/release-name/chart-name/latest", expected: "/output-dir/release-namespace/kube-context/release-name/chart-name/latest",
}, },
{
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseKubeContext",
chartName: "chart-name",
release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", KubeContext: "kube-context"},
outputDir: "/output-dir",
wantErr: false,
expected: "/output-dir/tiller-namespace/kube-context/release-name/chart-name/latest",
},
{
testName: "PathGeneratedWithGivenOutputDirAndGivenReleaseTillerNamespaceAndGivenReleaseNamespaceAndGivenReleaseKubeContext",
chartName: "chart-name",
release: &ReleaseSpec{Name: "release-name", TillerNamespace: "tiller-namespace", Namespace: "release-namespace", KubeContext: "kube-context"},
outputDir: "/output-dir",
wantErr: false,
expected: "/output-dir/tiller-namespace/release-namespace/kube-context/release-name/chart-name/latest",
},
{ {
testName: "PathGeneratedWithGivenOutputDirAndGivenOutputDirTemplateWithFieldNameOutputDir", testName: "PathGeneratedWithGivenOutputDirAndGivenOutputDirTemplateWithFieldNameOutputDir",
chartName: "chart-name", chartName: "chart-name",

View File

@ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) {
run(testcase{ run(testcase{
subject: "baseline", subject: "baseline",
release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
want: "foo-values-648b77cdd4", want: "foo-values-5d85cdbb5d",
}) })
run(testcase{ run(testcase{
subject: "different bytes content", subject: "different bytes content",
release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
data: []byte(`{"k":"v"}`), data: []byte(`{"k":"v"}`),
want: "foo-values-5dfbf8fdb7", want: "foo-values-9548bdcd9",
}) })
run(testcase{ run(testcase{
subject: "different map content", subject: "different map content",
release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
data: map[string]interface{}{"k": "v"}, data: map[string]interface{}{"k": "v"},
want: "foo-values-7565d47dd9", want: "foo-values-5db884fb87",
}) })
run(testcase{ run(testcase{
subject: "different chart", subject: "different chart",
release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"},
want: "foo-values-7c4f76c445", want: "foo-values-6596c997cc",
}) })
run(testcase{ run(testcase{
subject: "different name", subject: "different name",
release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"},
want: "bar-values-644fb47865", want: "bar-values-5ccfd9f8b5",
}) })
run(testcase{ run(testcase{
subject: "specific ns", subject: "specific ns",
release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"},
want: "myns-foo-values-c5ddcc795", want: "myns-foo-values-bc7cd5b87",
}) })
for id, n := range ids { for id, n := range ids {

View File

@ -5,8 +5,6 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/helmfile/helmfile/pkg/helmexec"
) )
var ( var (
@ -65,9 +63,9 @@ func normalizeChart(basePath, chart string) string {
return filepath.Join(basePath, chart) return filepath.Join(basePath, chart)
} }
func getBuildDepsFlags(helm helmexec.Interface, cpr *chartPrepareResult) []string { func getBuildDepsFlags(cpr *chartPrepareResult) []string {
flags := []string{} flags := []string{}
if helm.IsHelm3() && cpr.skipRefresh { if cpr.skipRefresh {
flags = append(flags, "--skip-refresh") flags = append(flags, "--skip-refresh")
} }