Feat: reuseValues in release
Adding properties to set reuseValues flag on release-level. Signed-off-by: Adam Blasko <adam.blasko1@gmail.com>
This commit is contained in:
parent
769d56d208
commit
d5f4dc5d11
|
|
@ -315,7 +315,7 @@ releases:
|
|||
# will attempt to decrypt it using helm-secrets plugin
|
||||
secrets:
|
||||
- vault_secret.yaml
|
||||
# Override helmDefaults options for verify, wait, waitForJobs, timeout, recreatePods and force.
|
||||
# Override helmDefaults options for verify, wait, waitForJobs, timeout, recreatePods, force and reuseValues.
|
||||
verify: true
|
||||
keyring: path/to/keyring.gpg
|
||||
# --skip-schema-validation flag to helm 'install', 'upgrade' and 'lint', starts with helm 3.16.0 (default false)
|
||||
|
|
@ -326,6 +326,7 @@ releases:
|
|||
timeout: 60
|
||||
recreatePods: true
|
||||
force: false
|
||||
reuseValues: false
|
||||
# set `false` to uninstall this release on sync. (default true)
|
||||
installed: true
|
||||
# restores previous state in case of failed release (default false)
|
||||
|
|
|
|||
|
|
@ -283,6 +283,8 @@ type ReleaseSpec struct {
|
|||
Condition string `yaml:"condition,omitempty"`
|
||||
// CreateNamespace, when set to true (default), --create-namespace is passed to helm3 on install (ignored for helm2)
|
||||
CreateNamespace *bool `yaml:"createNamespace,omitempty"`
|
||||
// ReuseValues, on helm upgrade/diff, reuse values currently set in the release and merge them with the ones defined within helmfile
|
||||
ReuseValues *bool `yaml:"reuseValues,omitempty"`
|
||||
|
||||
// DisableOpenAPIValidation is rarely used to bypass OpenAPI validations only that is used for e.g.
|
||||
// work-around against broken CRs
|
||||
|
|
@ -706,7 +708,7 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu
|
|||
flags = append(flags, "--skip-crds")
|
||||
}
|
||||
|
||||
flags = st.appendValuesControlModeFlag(flags, opts.ReuseValues, opts.ResetValues)
|
||||
flags = st.appendValuesControlModeFlag(flags, opts.ReuseValues, opts.ResetValues, release)
|
||||
|
||||
if len(errs) > 0 {
|
||||
results <- syncPrepareResult{errors: errs, files: files}
|
||||
|
|
@ -1845,8 +1847,6 @@ func (st *HelmState) commonDiffFlags(detailedExitCode bool, stripTrailingCR bool
|
|||
flags = append(flags, "--output", opt.Output)
|
||||
}
|
||||
|
||||
flags = st.appendValuesControlModeFlag(flags, opt.ReuseValues, opt.ResetValues)
|
||||
|
||||
if opt.Set != nil {
|
||||
for _, s := range opt.Set {
|
||||
flags = append(flags, "--set", s)
|
||||
|
|
@ -1960,6 +1960,8 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu
|
|||
flags = append(flags, "--values", valfile)
|
||||
}
|
||||
|
||||
flags = st.appendValuesControlModeFlag(flags, opt.ReuseValues, opt.ResetValues, release)
|
||||
|
||||
flags = append(flags, commonDiffFlags...)
|
||||
|
||||
if len(errs) > 0 {
|
||||
|
|
@ -3019,8 +3021,8 @@ func (st *HelmState) chartOCIFlags(r *ReleaseSpec) []string {
|
|||
return flags
|
||||
}
|
||||
|
||||
func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues bool, resetValues bool) []string {
|
||||
if !resetValues && (st.HelmDefaults.ReuseValues || reuseValues) {
|
||||
func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues bool, resetValues bool, release *ReleaseSpec) []string {
|
||||
if !resetValues && (release.ReuseValues != nil && *release.ReuseValues || release.ReuseValues == nil && st.HelmDefaults.ReuseValues || reuseValues) {
|
||||
flags = append(flags, "--reuse-values")
|
||||
} else {
|
||||
flags = append(flags, "--reset-values")
|
||||
|
|
|
|||
|
|
@ -4375,3 +4375,202 @@ func TestHelmState_setStringFlags(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
func TestPrepareDiffReleases_ValueControlReleaseOverride(t *testing.T) {
|
||||
tests := []struct {
|
||||
flags []string
|
||||
diffOptions *DiffOpts
|
||||
helmDefaults *HelmSpec
|
||||
release *ReleaseSpec
|
||||
}{
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
diffOptions: &DiffOpts{},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-from-release",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
diffOptions: &DiffOpts{
|
||||
ReuseValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-from-cli",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
diffOptions: &DiffOpts{
|
||||
ReuseValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{
|
||||
ReuseValues: true,
|
||||
},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-all",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
diffOptions: &DiffOpts{},
|
||||
helmDefaults: &HelmSpec{
|
||||
ReuseValues: true,
|
||||
},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-from-helm-defaults",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
diffOptions: &DiffOpts{},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-from-release",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
diffOptions: &DiffOpts{
|
||||
ResetValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-cli-overrides-release",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
releases := []ReleaseSpec{
|
||||
*tt.release,
|
||||
}
|
||||
state := &HelmState{
|
||||
ReleaseSetSpec: ReleaseSetSpec{
|
||||
Releases: releases,
|
||||
HelmDefaults: *tt.helmDefaults,
|
||||
},
|
||||
logger: logger,
|
||||
valsRuntime: valsRuntime,
|
||||
}
|
||||
helm := &exectest.Helm{
|
||||
Lists: map[exectest.ListKey]string{},
|
||||
Helm3: true,
|
||||
}
|
||||
results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, false, []string{}, false, false, false, tt.diffOptions)
|
||||
|
||||
require.Len(t, es, 0)
|
||||
require.Len(t, results, 1)
|
||||
|
||||
r := results[0]
|
||||
|
||||
require.Equal(t, tt.flags, r.flags, "Wrong value control flag for release %s", r.release.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrepareSyncReleases_ValueControlReleaseOverride(t *testing.T) {
|
||||
tests := []struct {
|
||||
flags []string
|
||||
syncOptions *SyncOpts
|
||||
helmDefaults *HelmSpec
|
||||
release *ReleaseSpec
|
||||
}{
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
syncOptions: &SyncOpts{},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-from-release",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
syncOptions: &SyncOpts{
|
||||
ReuseValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-from-cli",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reuse-values"},
|
||||
syncOptions: &SyncOpts{
|
||||
ReuseValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{
|
||||
ReuseValues: true,
|
||||
},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reuse-values-all",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
syncOptions: &SyncOpts{},
|
||||
helmDefaults: &HelmSpec{
|
||||
ReuseValues: true,
|
||||
},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-from-helm-defaults",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
syncOptions: &SyncOpts{},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-from-release",
|
||||
ReuseValues: boolValue(false),
|
||||
},
|
||||
},
|
||||
{
|
||||
flags: []string{"--reset-values"},
|
||||
syncOptions: &SyncOpts{
|
||||
ResetValues: true,
|
||||
},
|
||||
helmDefaults: &HelmSpec{},
|
||||
release: &ReleaseSpec{
|
||||
Name: "reset-values-cli-overrides-release",
|
||||
ReuseValues: boolValue(true),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
releases := []ReleaseSpec{
|
||||
*tt.release,
|
||||
}
|
||||
state := &HelmState{
|
||||
ReleaseSetSpec: ReleaseSetSpec{
|
||||
Releases: releases,
|
||||
HelmDefaults: *tt.helmDefaults,
|
||||
},
|
||||
logger: logger,
|
||||
valsRuntime: valsRuntime,
|
||||
}
|
||||
helm := &exectest.Helm{
|
||||
Lists: map[exectest.ListKey]string{},
|
||||
Helm3: true,
|
||||
}
|
||||
results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions)
|
||||
|
||||
require.Len(t, es, 0)
|
||||
require.Len(t, results, 1)
|
||||
|
||||
r := results[0]
|
||||
|
||||
require.Equal(t, tt.flags, r.flags, "Wrong value control flag for release %s", r.release.Name)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue