fix: `helmfile diff` should not leave temp values files (#525)
Fixes #503 once again. A follow-up to #520 which was incomplete.
This commit is contained in:
		
							parent
							
								
									57df25c3ff
								
							
						
					
					
						commit
						3edc7d6f33
					
				|  | @ -67,3 +67,7 @@ func (r ReleaseSpec) Clone() (*ReleaseSpec, error) { | ||||||
| 
 | 
 | ||||||
| 	return &deserialized, nil | 	return &deserialized, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (r ReleaseSpec) Desired() bool { | ||||||
|  | 	return r.Installed == nil || *r.Installed | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -568,12 +568,14 @@ type diffPrepareResult struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValues []string, concurrency int, detailedExitCode, suppressSecrets bool) ([]diffPrepareResult, []error) { | func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValues []string, concurrency int, detailedExitCode, suppressSecrets bool) ([]diffPrepareResult, []error) { | ||||||
| 	releases := []ReleaseSpec{} | 	releases := []*ReleaseSpec{} | ||||||
| 	for _, r := range st.Releases { | 	for i, _ := range st.Releases { | ||||||
| 		if r.Installed == nil || *r.Installed { | 		if !st.Releases[i].Desired() { | ||||||
| 			releases = append(releases, r) | 			continue | ||||||
| 		} | 		} | ||||||
|  | 		releases = append(releases, &st.Releases[i]) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	numReleases := len(releases) | 	numReleases := len(releases) | ||||||
| 	jobs := make(chan *ReleaseSpec, numReleases) | 	jobs := make(chan *ReleaseSpec, numReleases) | ||||||
| 	results := make(chan diffPrepareResult, numReleases) | 	results := make(chan diffPrepareResult, numReleases) | ||||||
|  | @ -586,7 +588,7 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu | ||||||
| 		numReleases, | 		numReleases, | ||||||
| 		func() { | 		func() { | ||||||
| 			for i := 0; i < numReleases; i++ { | 			for i := 0; i < numReleases; i++ { | ||||||
| 				jobs <- &releases[i] | 				jobs <- releases[i] | ||||||
| 			} | 			} | ||||||
| 			close(jobs) | 			close(jobs) | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | @ -973,6 +973,95 @@ func TestHelmState_SyncReleasesCleanup(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestHelmState_DiffReleasesCleanup(t *testing.T) { | ||||||
|  | 	tests := []struct { | ||||||
|  | 		name                    string | ||||||
|  | 		releases                []ReleaseSpec | ||||||
|  | 		helm                    *mockHelmExec | ||||||
|  | 		expectedNumRemovedFiles int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			name: "normal release", | ||||||
|  | 			releases: []ReleaseSpec{ | ||||||
|  | 				{ | ||||||
|  | 					Name:  "releaseName", | ||||||
|  | 					Chart: "foo", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			helm:                    &mockHelmExec{}, | ||||||
|  | 			expectedNumRemovedFiles: 0, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "inline values", | ||||||
|  | 			releases: []ReleaseSpec{ | ||||||
|  | 				{ | ||||||
|  | 					Name:  "releaseName", | ||||||
|  | 					Chart: "foo", | ||||||
|  | 					Values: []interface{}{ | ||||||
|  | 						map[interface{}]interface{}{ | ||||||
|  | 							"someList": "a,b,c", | ||||||
|  | 						}, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			helm:                    &mockHelmExec{}, | ||||||
|  | 			expectedNumRemovedFiles: 1, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name: "inline values and values file", | ||||||
|  | 			releases: []ReleaseSpec{ | ||||||
|  | 				{ | ||||||
|  | 					Name:  "releaseName", | ||||||
|  | 					Chart: "foo", | ||||||
|  | 					Values: []interface{}{ | ||||||
|  | 						map[interface{}]interface{}{ | ||||||
|  | 							"someList": "a,b,c", | ||||||
|  | 						}, | ||||||
|  | 						"someFile", | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			helm:                    &mockHelmExec{}, | ||||||
|  | 			expectedNumRemovedFiles: 2, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		t.Run(tt.name, func(t *testing.T) { | ||||||
|  | 			numRemovedFiles := 0 | ||||||
|  | 			state := &HelmState{ | ||||||
|  | 				Releases: tt.releases, | ||||||
|  | 				logger:   logger, | ||||||
|  | 				readFile: func(f string) ([]byte, error) { | ||||||
|  | 					if f != "someFile" { | ||||||
|  | 						return nil, fmt.Errorf("unexpected file to read: %s", f) | ||||||
|  | 					} | ||||||
|  | 					someFileContent := []byte(`foo: bar | ||||||
|  | `) | ||||||
|  | 					return someFileContent, nil | ||||||
|  | 				}, | ||||||
|  | 				removeFile: func(f string) error { | ||||||
|  | 					numRemovedFiles += 1 | ||||||
|  | 					return nil | ||||||
|  | 				}, | ||||||
|  | 				fileExists: func(f string) (bool, error) { | ||||||
|  | 					return true, nil | ||||||
|  | 				}, | ||||||
|  | 			} | ||||||
|  | 			if _, errs := state.DiffReleases(tt.helm, []string{}, 1, false, false, false); errs != nil && len(errs) > 0 { | ||||||
|  | 				t.Errorf("unexpected errors: %v", errs) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if errs := state.Clean(); errs != nil && len(errs) > 0 { | ||||||
|  | 				t.Errorf("unexpected errors: %v", errs) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if numRemovedFiles != tt.expectedNumRemovedFiles { | ||||||
|  | 				t.Errorf("unexpected number of removed files: expected %d, got %d", tt.expectedNumRemovedFiles, numRemovedFiles) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestHelmState_UpdateDeps(t *testing.T) { | func TestHelmState_UpdateDeps(t *testing.T) { | ||||||
| 	state := &HelmState{ | 	state := &HelmState{ | ||||||
| 		basePath: "/src", | 		basePath: "/src", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue