feat: Add support for --wait-retries flag. (#1922)
* feat: Add support for --wait-retries flag. This change wires up waitRetries option to set the helm --wait-retries flag. --wait-retries was added in helm 3.15.0 and makes waiting more robust to registry errors. https://github.com/helm/helm/commit/fc74964 https://github.com/helm/helm/releases/tag/v3.15.0 Resolves #1522 Signed-off-by: Connor Hindley <connor.hindley@tanium.com>
This commit is contained in:
		
							parent
							
								
									8169595b95
								
							
						
					
					
						commit
						2c38611acd
					
				|  | @ -195,6 +195,8 @@ helmDefaults: | ||||||
|   keyring: path/to/keyring.gpg |   keyring: path/to/keyring.gpg | ||||||
|   # wait for k8s resources via --wait. (default false) |   # wait for k8s resources via --wait. (default false) | ||||||
|   wait: true |   wait: true | ||||||
|  |   # if set and --wait enabled, will retry any failed check on resource state subject to the specified number of retries (default 0) | ||||||
|  |   waitRetries: 3 | ||||||
|   # if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout (default false, Implemented in Helm3.5) |   # if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout (default false, Implemented in Helm3.5) | ||||||
|   waitForJobs: true |   waitForJobs: true | ||||||
|   # time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) |   # time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) | ||||||
|  | @ -312,6 +314,7 @@ releases: | ||||||
|     verify: true |     verify: true | ||||||
|     keyring: path/to/keyring.gpg |     keyring: path/to/keyring.gpg | ||||||
|     wait: true |     wait: true | ||||||
|  |     waitRetries: 3 | ||||||
|     waitForJobs: true |     waitForJobs: true | ||||||
|     timeout: 60 |     timeout: 60 | ||||||
|     recreatePods: true |     recreatePods: true | ||||||
|  |  | ||||||
|  | @ -385,6 +385,7 @@ func (a *App) Sync(c SyncConfigProvider) error { | ||||||
| 			SkipRefresh:            c.SkipRefresh(), | 			SkipRefresh:            c.SkipRefresh(), | ||||||
| 			SkipDeps:               c.SkipDeps(), | 			SkipDeps:               c.SkipDeps(), | ||||||
| 			Wait:                   c.Wait(), | 			Wait:                   c.Wait(), | ||||||
|  | 			WaitRetries:            c.WaitRetries(), | ||||||
| 			WaitForJobs:            c.WaitForJobs(), | 			WaitForJobs:            c.WaitForJobs(), | ||||||
| 			IncludeCRDs:            &includeCRDs, | 			IncludeCRDs:            &includeCRDs, | ||||||
| 			IncludeTransitiveNeeds: c.IncludeNeeds(), | 			IncludeTransitiveNeeds: c.IncludeNeeds(), | ||||||
|  | @ -419,6 +420,7 @@ func (a *App) Apply(c ApplyConfigProvider) error { | ||||||
| 			SkipRefresh:            c.SkipRefresh(), | 			SkipRefresh:            c.SkipRefresh(), | ||||||
| 			SkipDeps:               c.SkipDeps(), | 			SkipDeps:               c.SkipDeps(), | ||||||
| 			Wait:                   c.Wait(), | 			Wait:                   c.Wait(), | ||||||
|  | 			WaitRetries:            c.WaitRetries(), | ||||||
| 			WaitForJobs:            c.WaitForJobs(), | 			WaitForJobs:            c.WaitForJobs(), | ||||||
| 			IncludeCRDs:            &includeCRDs, | 			IncludeCRDs:            &includeCRDs, | ||||||
| 			SkipCleanup:            c.RetainValuesFiles() || c.SkipCleanup(), | 			SkipCleanup:            c.RetainValuesFiles() || c.SkipCleanup(), | ||||||
|  | @ -1546,6 +1548,7 @@ Do you really want to apply? | ||||||
| 					SkipCleanup:          c.RetainValuesFiles() || c.SkipCleanup(), | 					SkipCleanup:          c.RetainValuesFiles() || c.SkipCleanup(), | ||||||
| 					SkipCRDs:             c.SkipCRDs(), | 					SkipCRDs:             c.SkipCRDs(), | ||||||
| 					Wait:                 c.Wait(), | 					Wait:                 c.Wait(), | ||||||
|  | 					WaitRetries:          c.WaitRetries(), | ||||||
| 					WaitForJobs:          c.WaitForJobs(), | 					WaitForJobs:          c.WaitForJobs(), | ||||||
| 					ReuseValues:          c.ReuseValues(), | 					ReuseValues:          c.ReuseValues(), | ||||||
| 					ResetValues:          c.ResetValues(), | 					ResetValues:          c.ResetValues(), | ||||||
|  | @ -1943,6 +1946,7 @@ Do you really want to sync? | ||||||
| 					Set:              c.Set(), | 					Set:              c.Set(), | ||||||
| 					SkipCRDs:         c.SkipCRDs(), | 					SkipCRDs:         c.SkipCRDs(), | ||||||
| 					Wait:             c.Wait(), | 					Wait:             c.Wait(), | ||||||
|  | 					WaitRetries:      c.WaitRetries(), | ||||||
| 					WaitForJobs:      c.WaitForJobs(), | 					WaitForJobs:      c.WaitForJobs(), | ||||||
| 					ReuseValues:      c.ReuseValues(), | 					ReuseValues:      c.ReuseValues(), | ||||||
| 					ResetValues:      c.ResetValues(), | 					ResetValues:      c.ResetValues(), | ||||||
|  |  | ||||||
|  | @ -2244,6 +2244,7 @@ type applyConfig struct { | ||||||
| 	diffArgs                string | 	diffArgs                string | ||||||
| 	logger                  *zap.SugaredLogger | 	logger                  *zap.SugaredLogger | ||||||
| 	wait                    bool | 	wait                    bool | ||||||
|  | 	waitRetries             int | ||||||
| 	waitForJobs             bool | 	waitForJobs             bool | ||||||
| 	reuseValues             bool | 	reuseValues             bool | ||||||
| 	postRenderer            string | 	postRenderer            string | ||||||
|  | @ -2272,6 +2273,10 @@ func (a applyConfig) Wait() bool { | ||||||
| 	return a.wait | 	return a.wait | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (a applyConfig) WaitRetries() int { | ||||||
|  | 	return a.waitRetries | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (a applyConfig) WaitForJobs() bool { | func (a applyConfig) WaitForJobs() bool { | ||||||
| 	return a.waitForJobs | 	return a.waitForJobs | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -63,6 +63,7 @@ type ApplyConfigProvider interface { | ||||||
| 	SkipDeps() bool | 	SkipDeps() bool | ||||||
| 	SkipRefresh() bool | 	SkipRefresh() bool | ||||||
| 	Wait() bool | 	Wait() bool | ||||||
|  | 	WaitRetries() int | ||||||
| 	WaitForJobs() bool | 	WaitForJobs() bool | ||||||
| 
 | 
 | ||||||
| 	IncludeTests() bool | 	IncludeTests() bool | ||||||
|  | @ -113,6 +114,7 @@ type SyncConfigProvider interface { | ||||||
| 	SkipDeps() bool | 	SkipDeps() bool | ||||||
| 	SkipRefresh() bool | 	SkipRefresh() bool | ||||||
| 	Wait() bool | 	Wait() bool | ||||||
|  | 	WaitRetries() int | ||||||
| 	WaitForJobs() bool | 	WaitForJobs() bool | ||||||
| 	SyncArgs() string | 	SyncArgs() string | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -50,6 +50,8 @@ type ApplyOptions struct { | ||||||
| 	SuppressDiff bool | 	SuppressDiff bool | ||||||
| 	// Wait is true if the helm command should wait for the release to be deployed
 | 	// Wait is true if the helm command should wait for the release to be deployed
 | ||||||
| 	Wait bool | 	Wait bool | ||||||
|  | 	// WaitRetries is the number of times to retry waiting for the release to be deployed
 | ||||||
|  | 	WaitRetries int | ||||||
| 	// WaitForJobs is true if the helm command should wait for the jobs to be completed
 | 	// WaitForJobs is true if the helm command should wait for the jobs to be completed
 | ||||||
| 	WaitForJobs bool | 	WaitForJobs bool | ||||||
| 	// Propagate '--skipSchemaValidation' to helmv3 template and helm install
 | 	// Propagate '--skipSchemaValidation' to helmv3 template and helm install
 | ||||||
|  | @ -213,6 +215,11 @@ func (a *ApplyImpl) Wait() bool { | ||||||
| 	return a.ApplyOptions.Wait | 	return a.ApplyOptions.Wait | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // WaitRetries returns the wait retries.
 | ||||||
|  | func (a *ApplyImpl) WaitRetries() int { | ||||||
|  | 	return a.ApplyOptions.WaitRetries | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // WaitForJobs returns the wait for jobs.
 | // WaitForJobs returns the wait for jobs.
 | ||||||
| func (a *ApplyImpl) WaitForJobs() bool { | func (a *ApplyImpl) WaitForJobs() bool { | ||||||
| 	return a.ApplyOptions.WaitForJobs | 	return a.ApplyOptions.WaitForJobs | ||||||
|  |  | ||||||
|  | @ -20,6 +20,8 @@ type SyncOptions struct { | ||||||
| 	SkipCRDs bool | 	SkipCRDs bool | ||||||
| 	// Wait is the wait flag
 | 	// Wait is the wait flag
 | ||||||
| 	Wait bool | 	Wait bool | ||||||
|  | 	// WaitRetries is the wait retries flag
 | ||||||
|  | 	WaitRetries int | ||||||
| 	// WaitForJobs is the wait for jobs flag
 | 	// WaitForJobs is the wait for jobs flag
 | ||||||
| 	WaitForJobs bool | 	WaitForJobs bool | ||||||
| 	// ReuseValues is true if the helm command should reuse the values
 | 	// ReuseValues is true if the helm command should reuse the values
 | ||||||
|  | @ -110,6 +112,11 @@ func (t *SyncImpl) Wait() bool { | ||||||
| 	return t.SyncOptions.Wait | 	return t.SyncOptions.Wait | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // WaitRetries returns the wait retries
 | ||||||
|  | func (t *SyncImpl) WaitRetries() int { | ||||||
|  | 	return t.SyncOptions.WaitRetries | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // WaitForJobs returns the wait for jobs
 | // WaitForJobs returns the wait for jobs
 | ||||||
| func (t *SyncImpl) WaitForJobs() bool { | func (t *SyncImpl) WaitForJobs() bool { | ||||||
| 	return t.SyncOptions.WaitForJobs | 	return t.SyncOptions.WaitForJobs | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  | 	"strconv" | ||||||
| 
 | 
 | ||||||
| 	"github.com/helmfile/chartify" | 	"github.com/helmfile/chartify" | ||||||
| 
 | 
 | ||||||
|  | @ -105,15 +106,31 @@ func (st *HelmState) appendWaitForJobsFlags(flags []string, release *ReleaseSpec | ||||||
| 	return flags | 	return flags | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (st *HelmState) appendWaitFlags(flags []string, release *ReleaseSpec, ops *SyncOpts) []string { | func (st *HelmState) appendWaitFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec, ops *SyncOpts) []string { | ||||||
|  | 	var hasWait bool | ||||||
| 	switch { | 	switch { | ||||||
| 	case release.Wait != nil && *release.Wait: | 	case release.Wait != nil && *release.Wait: | ||||||
|  | 		hasWait = true | ||||||
| 		flags = append(flags, "--wait") | 		flags = append(flags, "--wait") | ||||||
| 	case ops != nil && ops.Wait: | 	case ops != nil && ops.Wait: | ||||||
|  | 		hasWait = true | ||||||
| 		flags = append(flags, "--wait") | 		flags = append(flags, "--wait") | ||||||
| 	case release.Wait == nil && st.HelmDefaults.Wait: | 	case release.Wait == nil && st.HelmDefaults.Wait: | ||||||
|  | 		hasWait = true | ||||||
| 		flags = append(flags, "--wait") | 		flags = append(flags, "--wait") | ||||||
| 	} | 	} | ||||||
|  | 	// see https://github.com/helm/helm/releases/tag/v3.15.0
 | ||||||
|  | 	// https://github.com/helm/helm/commit/fc74964
 | ||||||
|  | 	if hasWait && helm.IsVersionAtLeast("3.15.0") { | ||||||
|  | 		switch { | ||||||
|  | 		case release.WaitRetries != nil && *release.WaitRetries > 0: | ||||||
|  | 			flags = append(flags, "--wait-retries", strconv.Itoa(*release.WaitRetries)) | ||||||
|  | 		case ops != nil && ops.WaitRetries > 0: | ||||||
|  | 			flags = append(flags, "--wait-retries", strconv.Itoa(ops.WaitRetries)) | ||||||
|  | 		case release.WaitRetries == nil && st.HelmDefaults.WaitRetries > 0: | ||||||
|  | 			flags = append(flags, "--wait-retries", strconv.Itoa(st.HelmDefaults.WaitRetries)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	return flags | 	return flags | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -76,13 +76,16 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 		name     string | 		name     string | ||||||
| 		release  *ReleaseSpec | 		release  *ReleaseSpec | ||||||
| 		syncOpts *SyncOpts | 		syncOpts *SyncOpts | ||||||
|  | 		helm     helmexec.Interface | ||||||
| 		helmSpec HelmSpec | 		helmSpec HelmSpec | ||||||
| 		expected []string | 		expected []string | ||||||
| 	}{ | 	}{ | ||||||
|  | 		// --wait
 | ||||||
| 		{ | 		{ | ||||||
| 			name:     "release wait", | 			name:     "release wait", | ||||||
| 			release:  &ReleaseSpec{Wait: &[]bool{true}[0]}, | 			release:  &ReleaseSpec{Wait: &[]bool{true}[0]}, | ||||||
| 			syncOpts: nil, | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{}, | 			helmSpec: HelmSpec{}, | ||||||
| 			expected: []string{"--wait"}, | 			expected: []string{"--wait"}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -90,6 +93,7 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 			name:     "cli flags wait", | 			name:     "cli flags wait", | ||||||
| 			release:  &ReleaseSpec{}, | 			release:  &ReleaseSpec{}, | ||||||
| 			syncOpts: &SyncOpts{Wait: true}, | 			syncOpts: &SyncOpts{Wait: true}, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{}, | 			helmSpec: HelmSpec{}, | ||||||
| 			expected: []string{"--wait"}, | 			expected: []string{"--wait"}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -97,6 +101,7 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 			name:     "helm defaults wait", | 			name:     "helm defaults wait", | ||||||
| 			release:  &ReleaseSpec{}, | 			release:  &ReleaseSpec{}, | ||||||
| 			syncOpts: nil, | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{Wait: true}, | 			helmSpec: HelmSpec{Wait: true}, | ||||||
| 			expected: []string{"--wait"}, | 			expected: []string{"--wait"}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -104,6 +109,7 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 			name:     "release wait false", | 			name:     "release wait false", | ||||||
| 			release:  &ReleaseSpec{Wait: &[]bool{false}[0]}, | 			release:  &ReleaseSpec{Wait: &[]bool{false}[0]}, | ||||||
| 			syncOpts: nil, | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{Wait: true}, | 			helmSpec: HelmSpec{Wait: true}, | ||||||
| 			expected: []string{}, | 			expected: []string{}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -111,6 +117,7 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 			name:     "cli flags wait false", | 			name:     "cli flags wait false", | ||||||
| 			release:  &ReleaseSpec{}, | 			release:  &ReleaseSpec{}, | ||||||
| 			syncOpts: &SyncOpts{}, | 			syncOpts: &SyncOpts{}, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{Wait: true}, | 			helmSpec: HelmSpec{Wait: true}, | ||||||
| 			expected: []string{"--wait"}, | 			expected: []string{"--wait"}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -118,16 +125,74 @@ func TestAppendWaitFlags(t *testing.T) { | ||||||
| 			name:     "helm defaults wait false", | 			name:     "helm defaults wait false", | ||||||
| 			release:  &ReleaseSpec{}, | 			release:  &ReleaseSpec{}, | ||||||
| 			syncOpts: nil, | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
| 			helmSpec: HelmSpec{Wait: false}, | 			helmSpec: HelmSpec{Wait: false}, | ||||||
| 			expected: []string{}, | 			expected: []string{}, | ||||||
| 		}, | 		}, | ||||||
|  | 		// --wait-retries
 | ||||||
|  | 		{ | ||||||
|  | 			name:     "release wait and retry unsupported", | ||||||
|  | 			release:  &ReleaseSpec{Wait: &[]bool{true}[0], WaitRetries: &[]int{1}[0]}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.11.0"), | ||||||
|  | 			helmSpec: HelmSpec{}, | ||||||
|  | 			expected: []string{"--wait"}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "release wait and retry supported", | ||||||
|  | 			release:  &ReleaseSpec{Wait: &[]bool{true}[0], WaitRetries: &[]int{1}[0]}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{}, | ||||||
|  | 			expected: []string{"--wait", "--wait-retries", "1"}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "no wait retry", | ||||||
|  | 			release:  &ReleaseSpec{WaitRetries: &[]int{1}[0]}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{}, | ||||||
|  | 			expected: []string{}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "cli flags wait and retry", | ||||||
|  | 			release:  &ReleaseSpec{}, | ||||||
|  | 			syncOpts: &SyncOpts{Wait: true, WaitRetries: 2}, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{}, | ||||||
|  | 			expected: []string{"--wait", "--wait-retries", "2"}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "helm defaults wait retry", | ||||||
|  | 			release:  &ReleaseSpec{}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{Wait: true, WaitRetries: 3}, | ||||||
|  | 			expected: []string{"--wait", "--wait-retries", "3"}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "release wait default retries", | ||||||
|  | 			release:  &ReleaseSpec{Wait: &[]bool{true}[0]}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{WaitRetries: 4}, | ||||||
|  | 			expected: []string{"--wait", "--wait-retries", "4"}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:     "release retries default wait", | ||||||
|  | 			release:  &ReleaseSpec{WaitRetries: &[]int{5}[0]}, | ||||||
|  | 			syncOpts: nil, | ||||||
|  | 			helm:     testutil.NewVersionHelmExec("3.15.0"), | ||||||
|  | 			helmSpec: HelmSpec{Wait: true}, | ||||||
|  | 			expected: []string{"--wait", "--wait-retries", "5"}, | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, tt := range tests { | 	for _, tt := range tests { | ||||||
| 		t.Run(tt.name, func(t *testing.T) { | 		t.Run(tt.name, func(t *testing.T) { | ||||||
| 			st := &HelmState{} | 			st := &HelmState{} | ||||||
| 			st.HelmDefaults = tt.helmSpec | 			st.HelmDefaults = tt.helmSpec | ||||||
| 			got := st.appendWaitFlags([]string{}, tt.release, tt.syncOpts) | 			got := st.appendWaitFlags([]string{}, tt.helm, tt.release, tt.syncOpts) | ||||||
| 			require.Equalf(t, tt.expected, got, "appendWaitFlags() = %v, want %v", got, tt.expected) | 			require.Equalf(t, tt.expected, got, "appendWaitFlags() = %v, want %v", got, tt.expected) | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -167,6 +167,8 @@ type HelmSpec struct { | ||||||
| 	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
 | ||||||
| 	Wait bool `yaml:"wait"` | 	Wait bool `yaml:"wait"` | ||||||
|  | 	// WaitRetries, if set and --wait enabled, will retry any failed check on resource state, except if HTTP status code < 500 is received, subject to the specified number of retries
 | ||||||
|  | 	WaitRetries int `yaml:"waitRetries"` | ||||||
| 	// WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout
 | 	// WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout
 | ||||||
| 	WaitForJobs bool `yaml:"waitForJobs"` | 	WaitForJobs bool `yaml:"waitForJobs"` | ||||||
| 	// Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300)
 | 	// Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300)
 | ||||||
|  | @ -262,6 +264,8 @@ type ReleaseSpec struct { | ||||||
| 	Devel *bool `yaml:"devel,omitempty"` | 	Devel *bool `yaml:"devel,omitempty"` | ||||||
| 	// 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
 | ||||||
| 	Wait *bool `yaml:"wait,omitempty"` | 	Wait *bool `yaml:"wait,omitempty"` | ||||||
|  | 	// WaitRetries, if set and --wait enabled, will retry any failed check on resource state, except if HTTP status code < 500 is received, subject to the specified number of retries
 | ||||||
|  | 	WaitRetries *int `yaml:"waitRetries,omitempty"` | ||||||
| 	// WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout
 | 	// WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout
 | ||||||
| 	WaitForJobs *bool `yaml:"waitForJobs,omitempty"` | 	WaitForJobs *bool `yaml:"waitForJobs,omitempty"` | ||||||
| 	// Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300)
 | 	// Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300)
 | ||||||
|  | @ -781,6 +785,7 @@ type SyncOpts struct { | ||||||
| 	SkipCleanup          bool | 	SkipCleanup          bool | ||||||
| 	SkipCRDs             bool | 	SkipCRDs             bool | ||||||
| 	Wait                 bool | 	Wait                 bool | ||||||
|  | 	WaitRetries          int | ||||||
| 	WaitForJobs          bool | 	WaitForJobs          bool | ||||||
| 	ReuseValues          bool | 	ReuseValues          bool | ||||||
| 	ResetValues          bool | 	ResetValues          bool | ||||||
|  | @ -1122,6 +1127,7 @@ type ChartPrepareOptions struct { | ||||||
| 	Validate               bool | 	Validate               bool | ||||||
| 	IncludeCRDs            *bool | 	IncludeCRDs            *bool | ||||||
| 	Wait                   bool | 	Wait                   bool | ||||||
|  | 	WaitRetries            int | ||||||
| 	WaitForJobs            bool | 	WaitForJobs            bool | ||||||
| 	OutputDir              string | 	OutputDir              string | ||||||
| 	OutputDirTemplate      string | 	OutputDirTemplate      string | ||||||
|  | @ -2730,7 +2736,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp | ||||||
| 		flags = append(flags, "--enable-dns") | 		flags = append(flags, "--enable-dns") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	flags = st.appendWaitFlags(flags, release, opt) | 	flags = st.appendWaitFlags(flags, helm, release, opt) | ||||||
| 	flags = st.appendWaitForJobsFlags(flags, release, opt) | 	flags = st.appendWaitForJobsFlags(flags, release, opt) | ||||||
| 
 | 
 | ||||||
| 	// non-OCI chart should be verified here
 | 	// non-OCI chart should be verified here
 | ||||||
|  |  | ||||||
|  | @ -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-5b58697694", | 		want:    "foo-values-669d45cd7b", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	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-58bff47d77", | 		want:    "foo-values-67d8c67fcf", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	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]any{"k": "v"}, | 		data:    map[string]any{"k": "v"}, | ||||||
| 		want:    "foo-values-5fb8948f75", | 		want:    "foo-values-b9bc64677", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	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-784b76684f", | 		want:    "foo-values-585c4565f5", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	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-f48df5f49", | 		want:    "bar-values-c94846459", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	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-6b68696b8c", | 		want:    "myns-foo-values-798d69477", | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	for id, n := range ids { | 	for id, n := range ids { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue