fix: do not complain on missing values files for undesired release (#617)
Fixes #616
This commit is contained in:
parent
3b3d3092dd
commit
f6264bfa9d
|
|
@ -239,6 +239,17 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu
|
|||
for release := range jobs {
|
||||
st.applyDefaultsTo(release)
|
||||
|
||||
// If `installed: false`, the only potential operation on this release would be uninstalling.
|
||||
// We skip generating values files in that case, because for an uninstall with `helm delete`, we don't need to those.
|
||||
// The values files are for `helm upgrade -f values.yaml` calls that happens when the release has `installed: true`.
|
||||
// This logic addresses:
|
||||
// - https://github.com/roboll/helmfile/issues/519
|
||||
// - https://github.com/roboll/helmfile/issues/616
|
||||
if !release.Desired() {
|
||||
results <- syncPrepareResult{release: release, flags: []string{}, errors: []*ReleaseError{}}
|
||||
continue
|
||||
}
|
||||
|
||||
flags, flagsErr := st.flagsForUpgrade(helm, release, workerIndex)
|
||||
if flagsErr != nil {
|
||||
results <- syncPrepareResult{errors: []*ReleaseError{newReleaseError(release, flagsErr)}}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,12 @@ import (
|
|||
|
||||
var logger = helmexec.NewLogger(os.Stdout, "warn")
|
||||
|
||||
func injectFs(st *HelmState, fs *TestFs) *HelmState {
|
||||
st.readFile = fs.ReadFile
|
||||
st.fileExists = fs.FileExists
|
||||
return st
|
||||
}
|
||||
|
||||
func TestLabelParsing(t *testing.T) {
|
||||
cases := []struct {
|
||||
labelString string
|
||||
|
|
@ -948,6 +954,117 @@ func TestHelmState_SyncReleases(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestHelmState_SyncReleases_MissingValuesFileForUndesiredRelease(t *testing.T) {
|
||||
no := false
|
||||
tests := []struct {
|
||||
name string
|
||||
release ReleaseSpec
|
||||
listResult string
|
||||
expectedError string
|
||||
}{
|
||||
{
|
||||
name: "should install",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
},
|
||||
listResult: ``,
|
||||
expectedError: ``,
|
||||
},
|
||||
{
|
||||
name: "should upgrade",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
},
|
||||
listResult: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
|
||||
foo 1 Wed Apr 17 17:39:04 2019 DEPLOYED foo-bar-2.0.4 0.1.0 default`,
|
||||
expectedError: ``,
|
||||
},
|
||||
{
|
||||
name: "should uninstall",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
Installed: &no,
|
||||
},
|
||||
listResult: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
|
||||
foo 1 Wed Apr 17 17:39:04 2019 DEPLOYED foo-bar-2.0.4 0.1.0 default`,
|
||||
expectedError: ``,
|
||||
},
|
||||
{
|
||||
name: "should fail installing due to missing values file",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
Values: []interface{}{"noexistent.values.yaml"},
|
||||
},
|
||||
listResult: ``,
|
||||
expectedError: `failed processing release foo: file does not exist: noexistent.values.yaml`,
|
||||
},
|
||||
{
|
||||
name: "should fail upgrading due to missing values file",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
Values: []interface{}{"noexistent.values.yaml"},
|
||||
},
|
||||
listResult: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
|
||||
foo 1 Wed Apr 17 17:39:04 2019 DEPLOYED foo-bar-2.0.4 0.1.0 default`,
|
||||
expectedError: `failed processing release foo: file does not exist: noexistent.values.yaml`,
|
||||
},
|
||||
{
|
||||
name: "should uninstall even when there is a missing values file",
|
||||
release: ReleaseSpec{
|
||||
Name: "foo",
|
||||
Chart: "../../foo-bar",
|
||||
Values: []interface{}{"noexistent.values.yaml"},
|
||||
Installed: &no,
|
||||
},
|
||||
listResult: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
|
||||
foo 1 Wed Apr 17 17:39:04 2019 DEPLOYED foo-bar-2.0.4 0.1.0 default`,
|
||||
expectedError: ``,
|
||||
},
|
||||
}
|
||||
for i := range tests {
|
||||
tt := tests[i]
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
state := &HelmState{
|
||||
Releases: []ReleaseSpec{tt.release},
|
||||
logger: logger,
|
||||
}
|
||||
fs := NewTestFs(map[string]string{})
|
||||
state = injectFs(state, fs)
|
||||
helm := &mockHelmExec{
|
||||
lists: map[listKey]string{},
|
||||
}
|
||||
//simulate the helm.list call result
|
||||
helm.lists[listKey{filter: "^" + tt.release.Name + "$"}] = tt.listResult
|
||||
|
||||
affectedReleases := AffectedReleases{}
|
||||
errs := state.SyncReleases(&affectedReleases, helm, []string{}, 1)
|
||||
|
||||
if tt.expectedError != "" {
|
||||
if len(errs) == 0 {
|
||||
t.Fatalf("expected error not occurred: expected=%s, got none", tt.expectedError)
|
||||
}
|
||||
if len(errs) != 1 {
|
||||
t.Fatalf("too many errors: expected %d, got %d: %v", 1, len(errs), errs)
|
||||
}
|
||||
err := errs[0]
|
||||
if err.Error() != tt.expectedError {
|
||||
t.Fatalf("unexpected error: expected=%s, got=%v", tt.expectedError, err)
|
||||
}
|
||||
} else {
|
||||
if len(errs) > 0 {
|
||||
t.Fatalf("unexpected error(s): expected=0, got=%d: %v", len(errs), errs)
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestHelmState_SyncReleasesAffectedRealeases(t *testing.T) {
|
||||
no := false
|
||||
tests := []struct {
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@ func (f *TestFs) FileExistsAt(path string) bool {
|
|||
return ok
|
||||
}
|
||||
|
||||
func (f *TestFs) FileExists(path string) (bool, error) {
|
||||
return f.FileExistsAt(path), nil
|
||||
}
|
||||
|
||||
func (f *TestFs) DirectoryExistsAt(path string) bool {
|
||||
var ok bool
|
||||
if strings.Contains(path, "/") {
|
||||
|
|
|
|||
Loading…
Reference in New Issue