diff --git a/chart/helm-operator/crds/helmrelease.yaml b/chart/helm-operator/crds/helmrelease.yaml index 71d448f01..afc191fe4 100644 --- a/chart/helm-operator/crds/helmrelease.yaml +++ b/chart/helm-operator/crds/helmrelease.yaml @@ -205,6 +205,10 @@ spec: enable: description: Enable will mark this Helm release for tests. type: boolean + ignoreFailures: + description: IgnoreFailures will cause a Helm release to be rolled + back if it fails otherwise it will be left in a released state + type: boolean timeout: description: Timeout is the time to wait for any individual Kubernetes operation (like Jobs for hooks) during test. diff --git a/deploy/crds.yaml b/deploy/crds.yaml index 9efd418d4..f0426fbb0 100644 --- a/deploy/crds.yaml +++ b/deploy/crds.yaml @@ -206,6 +206,10 @@ spec: enable: description: Enable will mark this Helm release for tests. type: boolean + ignoreFailures: + description: IgnoreFailures will cause a Helm release to be rolled + back if it fails otherwise it will be left in a released state + type: boolean timeout: description: Timeout is the time to wait for any individual Kubernetes operation (like Jobs for hooks) during test. diff --git a/docs/helmrelease-guide/tests.md b/docs/helmrelease-guide/tests.md index 7d2a43f42..22f7b7071 100644 --- a/docs/helmrelease-guide/tests.md +++ b/docs/helmrelease-guide/tests.md @@ -23,6 +23,19 @@ spec: When tests are enabled, [resource waiting](release-configuration.md#wait-for-resources-to-be-ready) defaults to `true` since this is likely needed for test pre-conditions to be satisfied. +## Uninstall/Rollback release on test failure + +The `spec.test.ignoreFailures` allows the helm release to be left in a released state if the tests fail. +Setting ignoreFailures to false will automatically uninstall/rollback the Helm Release if any of the tests fail. +If the tests are ignored, the `Released` condition will be left as true and `Tested` will be false. + +```yaml +spec: + test: + enable: true + ignoreFailures: false +``` + ## Test timeout Test timeout can be set via the `.test.timeout` option. diff --git a/docs/references/helmrelease-custom-resource.md b/docs/references/helmrelease-custom-resource.md index 009b10427..9c2cd4395 100644 --- a/docs/references/helmrelease-custom-resource.md +++ b/docs/references/helmrelease-custom-resource.md @@ -1722,6 +1722,19 @@ bool +ignoreFailures
+ +bool + + + +(Optional) +

IgnoreFailures will cause a Helm release to be rolled back +if it fails otherwise it will be left in a released state

+ + + + timeout
int64 diff --git a/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go b/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go index d8e725c08..d04507455 100644 --- a/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go +++ b/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go @@ -326,6 +326,10 @@ type Test struct { // Enable will mark this Helm release for tests. // +optional Enable bool `json:"enable,omitempty"` + // IgnoreFailures will cause a Helm release to be rolled back + // if it fails otherwise it will be left in a released state + // +optional + IgnoreFailures *bool `json:"ignoreFailures,omitempty"` // Timeout is the time to wait for any individual Kubernetes // operation (like Jobs for hooks) during test. // +optional @@ -336,6 +340,17 @@ type Test struct { Cleanup *bool `json:"cleanup,omitempty"` } +// IgnoreFailures returns the configured ignoreFailures flag, +// or the default of false to preserve backwards compatible +func (t Test) GetIgnoreFailures() bool { + switch t.IgnoreFailures { + case nil: + return false + default: + return *t.IgnoreFailures + } +} + // GetTimeout returns the configured timout for the Helm release, // or the default of 300s. func (t Test) GetTimeout() time.Duration { diff --git a/pkg/apis/helm.fluxcd.io/v1/zz_generated.deepcopy.go b/pkg/apis/helm.fluxcd.io/v1/zz_generated.deepcopy.go index 0d28feb92..9e1a0f053 100644 --- a/pkg/apis/helm.fluxcd.io/v1/zz_generated.deepcopy.go +++ b/pkg/apis/helm.fluxcd.io/v1/zz_generated.deepcopy.go @@ -434,6 +434,11 @@ func (in *SecretKeySelector) DeepCopy() *SecretKeySelector { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Test) DeepCopyInto(out *Test) { *out = *in + if in.IgnoreFailures != nil { + in, out := &in.IgnoreFailures, &out.IgnoreFailures + *out = new(bool) + **out = **in + } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(int64) diff --git a/pkg/helm/v3/converter.go b/pkg/helm/v3/converter.go index 76fcc3263..132595634 100644 --- a/pkg/helm/v3/converter.go +++ b/pkg/helm/v3/converter.go @@ -1,6 +1,8 @@ package v3 import ( + "strings" + "github.com/helm/helm-2to3/pkg/common" helm2 "github.com/helm/helm-2to3/pkg/v2" helm3 "github.com/helm/helm-2to3/pkg/v3" @@ -22,7 +24,10 @@ func (c Converter) V2ReleaseExists(releaseName string) (bool, error) { File: c.KubeConfig, } v2Releases, err := helm2.GetReleaseVersions(retrieveOpts, kubeConfig) - if err != nil { + + // We check for the error message content because + // Helm 2to3 returns an error if it doesn't find release versions + if err != nil && !strings.Contains(err.Error(), "has no deployed releases") { return false, err } return len(v2Releases) > 0, nil diff --git a/pkg/install/generated_templates.gogen.go b/pkg/install/generated_templates.gogen.go index c136a0ee5..f358897ef 100644 --- a/pkg/install/generated_templates.gogen.go +++ b/pkg/install/generated_templates.gogen.go @@ -24,9 +24,9 @@ var templates = func() http.FileSystem { "/crds.yaml.tmpl": &vfsgen۰CompressedFileInfo{ name: "crds.yaml.tmpl", modTime: time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC), - uncompressedSize: 17504, + uncompressedSize: 17736, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\xdb\x72\x1b\xb9\xb1\xef\xfa\x8a\x3e\x3a\x0f\xb4\xab\xc8\xd1\xda\x3e\x75\x92\xa8\x6a\x2b\xeb\x48\xf2\x65\xd7\x96\x55\x24\xed\x3c\x6c\x6d\x59\xe0\x4c\x93\x83\x68\x06\x98\x05\x30\x94\x94\x54\xfe\x3d\xd5\xb8\xcc\x85\x73\x21\x25\xaf\x9d\x6c\x55\xf8\xa0\x22\x07\x8d\x9e\xee\x46\xdf\x01\x68\x36\x9b\x1d\xb1\x82\x7f\x42\xa5\xb9\x14\xa7\xc0\x0a\x8e\x77\x06\x05\xfd\xd2\xd1\xcd\x1f\x75\xc4\xe5\xc9\xf6\xd9\x0a\x0d\x7b\x76\x74\xc3\x45\x72\x0a\x67\xa5\x36\x32\x9f\xa3\x96\xa5\x8a\xf1\x1c\xd7\x5c\x70\xc3\xa5\x38\xca\xd1\xb0\x84\x19\x76\x7a\x04\x20\x58\x8e\xa7\x90\x62\x96\x2b\xcc\x90\x69\xd4\x11\xfd\x88\xd6\x59\x79\x17\x27\x11\x97\x47\xba\xc0\x98\x20\x59\x92\xd8\xe9\x2c\xbb\x52\x5c\x18\x54\x67\x32\x2b\x73\xa1\x69\x6c\x06\x3f\x2e\x3e\x5c\x5e\x31\x93\x9e\x42\xa4\x0d\x33\xa5\x8e\x3c\xbe\x4b\x96\xe3\x11\x40\x78\xd3\xdc\x3d\xb5\x4f\xcc\x7d\x81\xa7\xa0\x8d\xe2\x62\x63\x1f\x24\xa8\x63\xc5\x0b\x63\x39\x9c\xd7\xf3\x81\x6b\x30\x29\x5a\x14\x20\xd7\xf6\xfb\x1b\xcc\x72\xf0\xef\x80\x9c\x09\xb6\xc1\x04\x56\xf7\xd5\x98\x9f\x3e\xb5\x88\x01\x98\x86\x0d\xdf\xa2\x20\x10\x1a\x8e\x06\xa8\x2e\xd2\x40\x9d\xa3\xf7\x2a\x3d\x8c\x5a\x0b\x17\xe8\x8c\x4b\xa5\x50\x98\x8a\x3c\x8b\x14\x56\xc8\xc5\x06\x0a\x54\x6b\xa9\x72\x4c\x60\x2d\xd5\x2e\xb5\x43\x54\x79\x44\x0b\xfb\xab\x41\x5d\xe3\xc1\x41\xc2\x74\xf0\x81\x4c\x87\xfc\x2b\x0b\x34\x96\xc2\xe9\x8d\xfe\xf9\xcf\x4f\x7e\x88\x88\xcc\xef\xbf\x3f\xf6\xc8\x92\xe3\xa7\xbf\x44\x39\x6a\xcd\x36\x4d\xa1\xbf\x6f\x3c\xd9\xe1\xab\xf5\x8a\xa0\xc8\x51\xac\x90\xd1\x3b\x96\x3c\x47\x6d\x58\x5e\x74\x25\x70\xb6\x0b\x42\x52\x60\x60\xaa\x9f\x0a\x0b\x85\x1a\x85\xa1\x55\xb2\xe2\x41\xb5\x45\x65\x21\xe0\x36\x45\xe1\x19\x37\x29\xd7\x20\x57\x7f\xc3\xd8\xc0\x2d\xd3\x60\xdf\x8d\x49\x04\x6f\x0d\xa1\x14\xd2\xc0\xa6\x64\x8a\x09\x83\x98\x80\x91\xb0\x22\x54\x06\xb8\x80\x94\x15\x05\x0a\x3d\x5b\xe1\x5a\x2a\x04\xa9\x12\x54\x41\x9c\xb1\x92\x5a\x83\xc6\x82\x29\x66\x10\x64\x81\xca\xd2\xab\x23\x38\xcb\x38\x0a\xa3\x21\x67\xf7\x16\x3d\x61\xb3\x54\x6c\x59\x56\x62\x78\x71\x45\x3f\x26\x1e\x27\x17\x30\x7f\x75\xf6\xe2\xc5\x8b\x3f\x91\xae\xe5\xc0\x44\x42\x80\x5c\xc0\xc7\xe5\x59\xd4\x90\xf7\xcb\x96\xac\x13\x66\xe8\xe7\x46\xc9\xb2\x70\xae\xa1\xe1\x0d\xdc\x14\x6b\xf4\x00\xce\xcf\x34\x94\xc3\x3e\xcd\xb8\x36\x3f\xed\x8e\xbc\xe3\xda\xd8\xd1\x22\x2b\x15\xcb\xda\x2e\xc7\x0e\xe8\x54\x2a\x73\x59\x23\x9f\x41\xaa\xaa\x2f\x1e\x84\x8b\x4d\x99\x31\xd5\x9a\x7d\x04\xa0\x63\x49\x84\xdb\xc9\x05\x8b\xad\x00\x74\xb9\x52\xde\xf5\x79\x84\x4e\x21\x4f\xe1\x1f\xff\x3c\x02\x12\x1d\x4f\xac\x80\xdd\xa0\x2c\x50\xbc\xbc\x7a\xfb\xe9\xc5\x22\x4e\x31\x67\xa7\x5e\x84\x2d\x15\x6a\xb0\xe3\x95\xe7\xbe\x40\x5a\xe1\x4a\xf4\xc0\x5a\x66\x14\x05\x95\xb1\x72\x75\x3a\xe3\x1f\x29\xfc\xb5\xe4\x0a\x93\xf0\xa2\x19\x04\x65\xae\x1e\x90\xe3\xf5\x3f\x0a\x45\xfa\x60\x78\x60\xc5\x6a\x4c\x1d\x0d\xaa\x67\x3b\x04\x4f\x88\x23\x07\x03\x09\xf9\x7f\x74\x86\xbf\x75\xcf\x30\x01\x6d\xb9\x75\x2e\xa0\xa9\x43\x56\x32\x0d\xb4\x40\x20\x4c\x78\x1e\x22\x58\x58\xdb\xd0\xb4\x68\x65\x96\x40\x2c\xc5\x16\x15\x39\xbc\x58\x6e\x04\xff\x7b\x85\x59\x93\x78\xe8\x95\x19\x33\xa8\x4d\x0b\xa3\x0d\x22\x82\x65\x4e\x8d\xa7\x56\x3d\x49\xc5\x15\x5a\xdb\x2a\x45\x03\x9b\x05\xd1\x11\xbc\x27\xbb\xe1\x62\x2d\x4f\x21\x35\xa6\xd0\xa7\x27\x27\x1b\x6e\x42\xfc\x8b\x65\x9e\x97\x82\x9b\xfb\x93\x58\x0a\xa3\xf8\xaa\x34\x52\xe9\x93\x04\xb7\x98\x9d\x68\xbe\x99\x31\x15\xa7\xdc\x60\x6c\x4a\x85\x27\xac\xe0\x33\x4b\xb8\x70\x76\x96\x27\xff\x5b\x69\xcc\xa4\x41\x69\xc7\xb3\x56\xaa\x3f\x28\x77\x52\x7f\xa7\x22\x6e\x9a\xa3\xbf\xeb\x62\xe6\x17\x8b\x25\x84\x97\xda\x25\x68\xcb\xdc\x79\x99\x6a\x9a\xae\x05\x4f\x82\xe2\x62\x4d\xfe\x89\x16\x6e\xad\x64\x6e\x31\xa2\x48\x0a\xc9\x85\x71\x71\xc8\x3a\x8e\x16\x4a\x5d\xae\x72\x6e\xb4\xd5\x3f\xd4\x86\xd6\x27\x82\x33\x26\xc8\xaf\xac\x10\xca\x22\xf1\xce\x4c\xc0\x19\xcb\x31\x3b\x23\x35\xfe\xda\x62\x27\x09\xeb\x19\x89\x74\xbf\xe0\x9b\xc9\x4b\x1b\xb0\x65\x5f\x00\x21\x6f\x19\x05\xea\x1a\xa2\xb3\xbd\x38\x65\xaa\x09\xd5\x67\x80\xf4\xb1\x70\xed\x47\x83\x6f\x1a\xc3\x53\xe1\xba\x2a\xb3\x6c\x81\xb1\xc2\x0e\x56\xe8\x44\xb4\x36\x3c\xa4\x32\x4b\x9c\x7d\x2b\x5c\xa3\x42\x11\x63\xb0\x3e\x56\x9a\x94\xe4\x1d\x77\xed\xba\x12\x97\x43\x42\x49\x09\x8b\x63\xd4\x3a\xe8\xa8\x77\x68\x85\xd4\xdc\x48\x75\x0f\xa5\x1d\x79\xb3\x5c\x5e\x2d\x60\xc5\x34\x8f\x2d\xf6\xa8\x17\xe9\xe5\x87\x25\xbc\x7d\x7f\xf5\xee\xe2\xfd\xc5\xe5\xf2\xe2\xfc\x7f\x7a\x80\x46\x84\x05\x03\xcb\x13\x3e\x33\x1b\x8b\x7a\x06\xc6\xa4\x0c\x21\xea\xf5\x8e\x0c\x28\x5d\xf8\x6c\xf8\xfe\x65\x79\xcd\x0d\x7c\x9c\xbf\x0b\x49\x16\x7d\xf5\x19\x16\x8d\xd4\x82\x9c\x02\x46\x9b\x08\xae\x37\xdc\xfc\xb0\xe1\x26\x2d\x57\x51\x2c\xf3\x53\xa9\x36\x27\x04\x74\x3d\xed\x25\xf0\x9a\xec\xcf\x99\x9f\x9f\x71\x52\xcf\x00\xa9\xe0\x5a\xeb\xd4\x8d\xff\x80\x77\x2c\x2f\x32\xb4\x68\x9f\x3f\x7f\xfe\xbc\x82\x8c\x36\xdc\x5c\xf7\xad\xd8\x28\xf3\x43\x52\x6b\x71\x3f\x9a\xae\x5b\x0d\x87\xcf\xb7\xdc\xa4\xb2\x34\x9f\x29\xa0\xb0\x8c\x33\xdd\xcf\xaa\x15\x8f\xc2\x84\x6b\x78\x42\x6a\x79\x4d\x41\x1f\xca\x62\xa3\x58\x82\xf0\xf3\x3a\x63\x1b\xfd\x0b\x45\xf5\x55\x86\x27\x16\xee\xfa\xe9\x83\x99\x2a\x28\x93\xdc\xc7\x14\xa5\x9b\x81\x29\x9a\x10\xcc\xca\xf1\xa3\x30\x63\x86\x6f\x2b\x63\xab\x97\xb8\x97\x2d\x25\xa5\x79\x30\x99\x0a\xd7\x7b\xa9\x9c\xe3\x3a\x10\x49\x9a\xb6\x52\x4c\xc4\x29\x3c\x91\x0a\xa4\x49\x51\xd5\x5e\xe1\x29\x51\x5a\xd6\xe9\x49\xfb\x73\x8e\x6b\x56\x66\x36\x32\xc0\x24\x67\xda\xa0\x9a\x58\xcd\xb2\x1c\x4b\xb1\xe6\x9b\x52\x61\x42\x09\x05\xc1\x79\xad\x5e\x3f\x82\xa5\x20\xa6\x03\x38\x2b\x64\xbf\x49\xed\x38\xa7\x60\x53\x21\x48\xdd\x94\x2b\x54\x02\x0d\xea\x99\x5d\x2b\x1d\x69\x23\x15\xdb\x60\xb4\x91\x72\x93\x21\x2b\x38\x55\x28\xf9\x75\xaf\x24\xac\xce\x79\x4c\x7e\x7a\xc3\xa4\x1e\x6e\x40\xce\xc5\xce\x0f\x58\xca\x45\x80\x6c\x38\xf5\xb6\x0f\xef\xf5\xd7\xbd\x5c\x74\x3d\x0f\x3c\x91\x54\xd8\x58\x17\xfe\x34\x82\x25\xad\xab\xc2\x84\x90\xb3\x4c\xc3\x2d\xcf\x32\xca\x05\x58\x92\x54\xa5\xc4\x0e\x4a\x49\xa6\xeb\x42\xc0\x6b\x6e\x68\x3d\x7c\x49\x43\x2f\xcb\xb9\x52\x52\xd1\x62\x69\xc3\x14\x65\x13\xbf\x77\xb7\x1f\x26\xdb\xe2\xe2\x51\x18\xf4\x0d\x2f\xce\xb1\xf8\x68\xd3\xab\xfd\xcb\xdf\x84\x76\xeb\x61\x90\xfe\xa4\xa1\x30\x24\x73\x94\x16\x2b\xa8\x52\x88\x21\xa2\x27\xd6\x65\x26\x58\xf8\xc4\x6e\x12\xd6\x89\x0b\x6d\x58\x96\x51\x24\x97\xca\xfb\xd4\x10\xf0\xad\xaa\x4f\xe9\x6b\x2f\x4e\xe7\xf4\x12\x2c\x50\x24\x28\x62\x8e\x1a\x3e\xe7\xa5\x36\x9f\x49\x67\x42\x1d\xe4\x7a\x1b\xdc\x3a\x11\x5d\xc6\x31\x8e\x69\xc1\x4a\xca\x0c\x59\x37\x2d\xd9\x76\xcb\x9b\x5e\x71\x85\x12\xc7\xbb\x07\xc3\xd4\x06\x0d\x26\xcd\x98\xe3\x51\x79\xff\xf0\x87\xe8\xbb\xe8\xd9\x83\xcc\x77\x2d\x55\x8c\x1f\x5d\xe8\xd9\xa5\xa7\x45\xcb\x2b\x02\x74\x4b\x96\x33\x75\xe3\x84\xd0\x6a\xad\x18\x09\xd7\xb3\x99\x45\x78\x1d\xa2\x99\xee\x12\xb3\xb4\x69\x3d\x41\x85\x9c\xce\x57\x09\x6e\x25\xe9\xa1\x92\xe5\x26\x85\x04\x33\x34\x14\x00\x5d\x23\x02\xf8\x1a\x04\x62\xd2\x15\xf8\xb0\xb0\x49\x4b\x7a\x6a\xc9\x0e\x73\x93\x37\x35\x60\x90\xb6\x97\x2c\x39\x64\xcb\x26\x05\x41\xbb\x00\x11\xbc\x5d\xbb\x76\x45\x59\x14\x19\xc7\xa4\x1b\xe5\x6d\x61\x28\x6f\x51\x1b\xf8\x8c\x82\xe2\xb8\x5f\x34\x8f\xf4\x73\xe5\x8b\xc2\x9a\x46\xf0\x89\x0a\x77\x68\x10\xd2\x55\x1b\x5b\x2b\x02\x53\x78\x0a\xc7\xdb\xe7\xc7\x53\x38\xde\xbe\x38\x9e\xf4\x4a\xa3\xd7\x5c\x51\x94\xf9\xae\x1c\x66\xb0\x7d\xde\x7d\xf4\xa2\xf5\x28\x67\x77\x6f\xb8\xee\x8b\x68\x2d\x29\xbe\xaf\xc0\x82\x0c\x73\x76\xc7\xf3\x32\x07\x96\xcb\x52\x18\x12\xa5\xc2\x2d\xb7\xad\x5d\x92\xe7\x0d\x62\x41\xaa\xd0\x2b\xbf\x56\xbf\xa1\x23\x72\xe0\x26\x04\x6a\x8b\xea\xd9\x77\xfd\x5a\x41\xb5\xf8\x06\xdb\x6f\x68\x34\x70\x47\xf9\xd9\xd3\xa8\x5d\x0e\x10\xd9\xf5\x91\x4d\xa2\xc3\xc2\x6f\x50\x90\xbf\x73\xad\x48\xb6\x5e\xf3\xbb\xe0\xa6\x2a\x87\x5c\xe7\x5d\xce\x42\x7a\x13\xd7\x7e\xb6\x7b\x96\x9f\x1c\x98\xf9\x64\x55\x68\x0f\xd7\x15\xdc\x3e\x73\xb7\x28\x9d\xb1\x58\xf8\xee\x3a\x3a\x06\xaa\x85\xf2\x92\xab\x1c\x99\xf3\x61\xde\x75\xfb\x06\x32\x89\x81\x89\xe0\x40\xba\xfe\xe3\x52\x1a\xc0\xbb\x22\xe3\x31\x37\xd9\x3d\x68\x34\xbe\xeb\xe0\x9c\xf2\xf5\x9a\x65\x1a\xaf\x01\x7f\x2d\x29\xe6\xd3\x13\xa3\x4a\xbc\x86\xa4\x0c\x02\xed\xa0\x4c\x30\xce\x98\x72\xb9\xae\x60\x54\xcc\x07\x4a\x43\x50\x3a\xdc\xe5\x28\x99\x65\x2b\x16\xdf\x8c\xca\x98\x54\x27\x00\x06\x0e\x74\x1d\x5b\xfa\x5a\x6d\xed\x37\x3f\xb8\x06\x4f\xb8\x26\x37\xf4\x46\xca\x9b\xde\x24\xa2\x45\xde\x79\x03\x78\x9f\x0e\x14\x0a\xb7\xbb\xbd\x98\xf0\x49\x2d\x02\xdb\xc2\xf1\xc1\x1c\x92\x52\x05\x3d\x0f\x02\x78\x78\xfc\x74\x2e\x75\x2f\x1b\x17\x16\x6c\x94\x01\x12\x79\xa0\xa3\x27\x56\xed\x23\xc4\x86\xb1\xbd\x74\x3c\x30\x74\x8e\xd2\xf3\x35\xe2\xe7\x7e\x3e\x73\x76\x37\x47\xa3\x06\x12\xd0\xdd\x20\xe0\x41\x87\x83\x40\x28\x75\x95\x03\x1c\xcc\xee\xab\x94\xd0\x77\x63\x73\x76\x83\xc1\x5b\xac\x18\xa7\x2c\x6f\x98\x97\x3e\xcf\x5f\xad\x5a\xce\x8c\x85\xf8\xff\xff\xeb\x29\xdf\x9c\xbc\x0e\x28\xde\xbc\x60\xf7\xaf\x6c\xc0\x39\x2b\x64\xa2\xfb\x6b\x32\xd2\x44\xbe\x06\x46\xa1\x22\x26\xbd\x8d\xdc\x4a\x7b\xaf\xa8\xa1\x90\x09\xad\xb5\xb1\xe5\xda\x83\x57\x90\x44\x7d\x48\x3d\x6a\xd4\xfd\x5e\x83\x39\x64\xf9\xd8\xda\xa0\x02\xf6\x05\x46\x6e\x78\x8e\xb2\xdc\xdf\x96\x5a\x3a\xb8\x2a\x49\xe6\xb9\x95\xfa\x2d\xe3\xbe\x88\x14\xf7\xc0\x45\xc2\xb7\x3c\x29\x59\x06\x3f\x55\x95\x73\x7f\x69\x1c\xb6\xa7\xe0\x49\xc6\x6f\x10\x7e\x94\x2b\xe7\x98\xad\x2f\x7b\x1a\xfc\xd7\x7e\xb6\x1e\xab\x7e\x44\xf7\x5e\x9e\xff\xca\x42\x26\x31\xac\x76\x56\x00\xa5\x30\x3c\x03\x96\x65\xbd\xcc\x5e\xc9\x44\x4f\xe1\xea\xd3\x99\x9e\xda\xfe\x3b\x8f\x51\xfb\xed\x0a\x2e\xac\xcd\x8a\x32\x5f\xa1\x22\x9b\x25\x58\xbb\x57\x02\xe7\x58\x64\xf2\x3e\x47\x61\xfa\xdb\x5b\x0b\xc3\x0c\xae\xcb\x6c\x81\xc6\xb6\x57\xe6\x68\x55\x7a\x81\x86\x52\x57\xe0\x82\xd4\x02\x59\x72\x6f\x37\xae\x2a\x83\x26\x4e\xc6\x4a\xfd\xc0\x1a\xd3\xae\xf0\xd2\x7a\x5d\x66\x0f\x53\x2b\x2a\x2b\xcf\xe6\xe7\xe3\xf9\xcf\xc2\x03\xed\x93\xaf\xad\x51\x8d\x6b\x31\xf4\x77\x9f\xe5\x1a\x2c\x22\xaf\x33\x7e\x0b\xed\x45\xa8\x51\xed\xa4\xc3\x13\x0b\x97\x34\x5d\x0e\x55\xeb\x6d\x9b\x68\xc3\x82\xdc\xa2\x52\x3c\xc1\x9d\x3a\xb2\xce\x34\xfd\x96\x7d\x87\x85\x76\x7e\xbb\xac\x73\xb9\xc6\xdc\x3a\xd3\x6a\x67\xaf\x2e\x85\xea\x45\x19\x36\x1b\x43\xec\x3a\x38\x89\x35\xa8\x3b\xd6\xd1\xc9\xac\x08\xe8\xdb\x64\x55\x31\xad\x52\x59\xec\xdf\xd1\x70\x70\x53\xbb\xdd\xee\xe5\x6f\x37\x1b\x88\xa4\xe7\x53\x48\xd0\x20\x65\xbe\x94\x72\xa7\x68\xd2\x5e\xbf\x61\xd3\x69\x17\xd4\x1d\x8b\x14\x4c\x60\x85\xe6\x16\x51\x00\xb2\x38\x75\x8f\x55\x29\xc0\x9e\x88\x09\xd5\x45\xa8\xa6\x7a\x71\x7e\x18\xc8\x70\xe1\x1b\x67\x61\x44\xfa\x23\xe2\xda\x7f\x74\x94\x20\x9e\x7e\xdb\x08\x31\xc0\xee\x57\x62\xf5\x40\x36\x9b\xfe\xcc\x46\x8f\x90\x20\x34\xce\x7a\x1c\x5c\x9c\x8f\x71\x6f\xab\xcc\x57\x3c\x43\xd7\x46\x1e\xf7\xe3\x9f\x76\x80\x1b\x1d\xe7\x4c\xc6\x2c\x73\xb5\x7c\xb5\x77\xe0\x3a\x7a\x0e\xb4\xbb\x66\xe7\x17\x57\xf3\x8b\xb3\x97\xcb\x8b\xf3\x29\x94\x1a\x1d\x72\xfd\x4a\xc9\x3c\x72\x73\x7e\xc2\x7b\xbb\x4d\x21\xb4\x41\x36\xd0\xa1\x62\x4a\xb1\xdd\xad\x13\x6e\x30\xef\x71\x2c\xa3\x5d\xe4\xe1\x1e\xf2\x40\x07\x79\xbc\x7f\x3c\xdc\x3d\x1e\x74\xc3\xdb\xfd\x6d\x04\xdf\x41\xa8\x85\xee\xbb\x57\x5f\xe6\x8e\xb7\x95\xdc\xfb\xf7\xa6\x7f\x2b\x11\x8f\x4b\xcc\xb6\x2d\x48\xb5\x06\xb6\x3c\xfa\xaa\xfd\xe6\xce\x35\xf3\x1a\xe8\xda\x1f\x6b\x6e\xdd\xa3\x49\x41\x35\x0e\x1b\x75\x3f\xfe\xa8\xc8\xc8\x4a\x0d\xee\x3a\x8c\xef\x3b\x90\xde\x14\xcc\xa4\xbd\x43\xfb\xf6\x1e\xc8\x4b\xb8\xd3\x93\x43\xe3\x3b\xd2\xf8\xe0\xc1\x77\x23\xc2\x59\x10\xea\x02\x33\x8c\xa9\xea\x63\xfd\xce\xb7\xfd\xd6\xc8\x8b\x57\x53\x52\x12\x8e\xfb\x30\xbb\x63\xc3\x4c\xc3\x03\xd9\x67\x05\x45\x59\x63\x06\x76\x7f\xdc\xc7\x6f\xe2\xba\x93\x72\x36\x3b\x99\x86\xde\x11\x37\xae\xcd\xee\x0e\x3c\x1a\xcc\x0b\xa9\x98\xe2\xd9\x3d\x94\x82\x6d\x19\xcf\x6c\xdd\x36\x88\x7b\x3c\x92\x79\x71\x0f\x6c\xdb\xf6\x08\xb2\xb9\x79\x6b\x75\xa8\xb9\x83\xeb\x7b\x02\x61\x0b\x77\x84\xdf\xf6\x96\xef\xc0\x1e\x6e\x93\x81\xc1\xbd\x24\xb7\x87\xfa\x9e\x15\xce\x19\x3e\xce\x32\x1c\x12\xc8\x59\xd1\xb2\x89\xaf\xab\xfd\x03\xfb\x6e\x87\x68\xff\x0d\xf6\x96\xd5\x4d\xc2\x46\x36\xdf\xc6\xf7\xee\x0e\x46\x30\xba\x7f\x77\x10\x96\xfd\x46\xbc\x4f\x7b\xf1\xce\x9d\x7a\x5b\x58\xcd\x7b\xec\xfa\x8b\x0a\x4f\x50\xe1\x7f\xb7\x67\x2c\x55\x7f\xf1\xfc\xcd\x1c\xe3\x45\x4b\xb0\xc1\x3b\x8e\x58\x34\xd3\x8f\xf2\x8e\x23\x18\x2b\xbf\xf9\x28\xef\x38\x82\xf8\x37\xf3\x9b\xa5\x3a\x54\xcc\xfd\xe7\x2d\x76\xb4\xee\xd1\x3e\xb0\x99\x0d\x3e\xce\x01\xfa\xf3\x0f\xff\x75\x7e\xbf\x0f\xe7\xd7\xd7\xaf\xfb\xc2\x5e\x9d\xeb\xcb\x75\x68\xf9\x82\x3e\x5d\xab\x27\xd7\x2d\xf3\x1e\xda\xa3\x3b\xbc\x1f\xd7\x2f\x37\x7f\x60\xfd\x68\x40\x62\x8d\x0e\x91\xbf\xd7\x11\x4b\x61\x18\x17\x3a\xdc\xec\xe0\xc2\x15\x89\xb6\xe0\x5c\x91\x3f\x62\x62\xf7\xba\x49\x9b\x84\x8e\x7d\x0c\x1e\x7c\xad\xae\x75\x8c\xae\xea\x59\x05\x56\x13\x27\x57\x1a\xd5\xd6\x3b\x54\xef\x57\x42\x87\x6b\xe2\x68\xc7\xae\xf4\xc9\x67\x4e\x21\x65\xba\x91\x86\xdd\xa6\x3c\x4e\xc1\x9d\x3f\x43\xa5\xdd\x65\x0b\x14\xb0\x46\x13\xa7\x43\x07\x20\xbe\x45\x79\xa9\xeb\x7b\x39\xed\x01\xc2\xf8\xc0\x2a\x2a\x63\xda\x2c\x15\x13\x9a\x87\xeb\x2b\x07\x38\xcc\x77\x9d\x49\xcd\x3e\x87\xbb\xf0\x12\x4b\xa5\x50\x17\xb4\x42\x83\x26\x5f\x9d\xde\xd7\x26\x28\x55\x9c\x32\xb1\xc1\x2a\x4a\x56\x8a\x30\xe6\x76\x47\xdc\x4a\x68\x63\x24\xcc\xe0\x8c\x88\x1b\x10\x81\x3b\x0c\xf5\x00\xf6\xeb\x09\x7b\x58\x07\x23\x87\xb8\xdf\x61\xdd\x6d\x1d\x7e\x53\xd6\xfd\xe5\xa8\x03\x78\xf6\x97\xa6\xdc\xb5\x83\xb4\xcc\x99\xb0\xae\xc9\x76\x15\x1b\x80\xc1\xe2\x12\x34\x8c\x67\x43\xa5\xa3\x07\xb2\xcc\x9b\x4a\x8f\xa6\x10\xcb\xbc\xc8\x30\xf7\x57\x18\x14\x32\xfd\x48\xee\xdd\xd4\x03\xd8\x9a\x5b\x40\xc7\xd5\x4a\x71\x5c\x43\xce\xe2\x94\x0b\xac\xb9\xc3\xbb\x22\x63\xc2\xb9\xb9\xbe\x63\x32\x9e\x20\x77\x7c\xd5\xad\xd8\x44\xef\xf2\xf6\x28\x2e\xba\x1e\x7a\x80\x8b\x45\xeb\xaa\x5d\x45\xc6\x14\xa4\xb0\xfa\xf4\x64\xb2\x54\x25\x4e\xa6\x30\x79\xc5\x32\x8d\x93\xfe\x2d\x23\x80\xc9\x47\x71\x23\xe4\xad\x98\xf4\x9e\x74\x3e\x40\xe7\xfa\xce\x36\xb9\xcf\x0c\x8e\x89\x86\xe3\xa1\x41\x4b\xd8\xd0\xa8\x27\xab\x67\xd4\x52\x74\x40\x86\x77\x5f\xe0\x98\x78\x5c\xdb\xc3\xf9\x75\x12\x93\x8b\xda\xf4\x7d\x48\x52\xe1\x8a\x21\x41\xcf\x65\x96\x61\xf2\x17\x16\xdf\xd0\xaf\x25\x6a\x83\xc9\x57\x11\x61\x93\xcc\x01\x90\x40\xf9\xc0\x70\x20\x7b\x68\xb8\xe2\x64\x00\xc0\x31\xd7\x1a\x24\x4d\x7f\x69\xa8\xd2\x30\x98\xcc\xfd\xc9\xb2\xd1\xb0\xfd\xae\x6f\x46\x70\xa3\xe1\x6c\x5a\xed\x24\xec\x7e\xca\xee\x95\x19\xf7\xd1\xf7\x22\xae\xaf\x76\xad\xd0\xe5\x5c\x6b\xc6\x33\x4c\xc6\xdb\x9a\x3d\x2b\xe0\x32\x07\x4c\x5e\xbb\x43\x61\xfb\xb8\xf8\xd0\x01\xaf\xce\x5a\x48\x6d\x2f\xab\xa1\x30\xe1\x84\x99\x65\xc8\x4f\xe8\x70\xe1\x77\x87\xc6\x8f\x39\x3d\xb4\x4d\x6f\x6f\x05\x8f\x32\xe0\x2e\x15\x37\xb3\x48\x7b\x7d\x73\xc4\x2c\xea\xdf\xaf\xac\x88\x7b\xcc\x63\xf2\xb6\x3a\xfb\x4b\x33\x3e\x86\xb3\xbf\x6d\xab\x0a\xdf\x03\x1a\x67\x35\x16\xac\x8b\x91\x86\xda\x80\xee\xdb\xc2\x9d\xfc\xad\x6d\x90\x8b\x4d\x30\xc2\xa6\x49\x76\x31\xce\xfd\xc1\x01\x8f\xf5\xe9\xa1\x1a\x32\x74\x78\x73\xc4\x2e\x9b\x83\xee\x75\x1d\x80\x5a\x62\x9d\xa1\x4a\x7c\x9d\x91\x01\x3b\x0f\x03\x03\xaf\xf2\x52\xee\x7d\x3e\x32\xa5\xe7\x71\x25\xfc\xce\xc8\x00\x9e\xc6\x02\xf5\x8e\xf5\xba\x1d\x37\x54\x2f\x55\x6b\xf8\x4b\x4f\x90\x32\x0d\xc8\xed\xdd\x95\x70\x36\x94\x8a\xb0\xea\x48\xe8\x03\xce\x74\x36\xaa\xa4\x43\x28\xe9\xbd\x27\xbf\x7b\xe3\xbd\xba\xc0\x3f\xd4\x75\x6b\x5d\xa2\xb7\xb7\x6b\x1f\xb8\x8d\xaf\x0e\xf1\xd5\x95\x7b\xae\xf7\x90\x5e\x73\x43\x95\x52\x4a\xd2\x6a\x9c\xcf\xae\x0b\x27\xff\x0f\x0a\x7a\x7a\x4e\x89\xd7\xda\xc3\x69\xf4\xcb\x7f\x26\x4b\x31\x5e\xe1\xcf\x9b\x90\xf6\xaa\xb0\x0a\x57\x5b\xea\x73\xcf\xe1\xb4\x27\x73\xd1\x47\x43\xce\x92\x9e\x6a\x90\x1b\xe7\x0a\x63\x65\x93\x51\x4c\x3a\x27\xa9\x6c\x8c\x29\x15\xda\xd8\xe3\x4e\xe0\x06\x90\xba\x0e\xef\xe0\xad\xb6\x64\x55\x1d\xe6\x5c\xc1\xf3\x25\x3e\x3f\x5c\x64\x80\xed\xb3\xfa\x97\xff\xc7\x19\xee\x06\xbe\x1d\x00\xf7\x2f\x07\x92\x53\x30\xaa\x74\xea\xe4\xaf\x2b\xf9\x27\x75\xba\xc9\xe2\x18\x29\x36\x5f\xee\x5e\xc6\x3f\x76\x19\x5a\xb8\x65\x6f\x7f\x36\x6a\x75\xf8\xf9\x97\x23\x87\x15\x93\x4f\x81\x0e\x7a\xf8\xaf\x00\x00\x00\xff\xff\xab\x9d\xb1\xa8\x60\x44\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x6b\x6f\x1b\xbb\x72\xdf\xfd\x2b\xa6\xee\x07\x25\x80\xb4\xbe\x49\x8a\x3e\x0c\x5c\xf4\x9c\xda\xce\x49\xee\x49\x1c\x43\x52\xd2\x0f\x07\x07\x31\xb5\x3b\xab\x65\xbd\x4b\xee\x25\xb9\xb2\xdd\xa2\xff\xbd\x18\x3e\xf6\xa1\x7d\x48\x76\x4e\x52\xdc\xa2\xfa\x60\x58\xcb\xe1\xec\xcc\x70\xde\x24\xb5\x58\x2c\x4e\x58\xc9\xbf\xa0\xd2\x5c\x8a\x73\x60\x25\xc7\x07\x83\x82\xbe\xe9\xe8\xee\x9f\x75\xc4\xe5\xd9\xee\xd5\x06\x0d\x7b\x75\x72\xc7\x45\x72\x0e\x17\x95\x36\xb2\x58\xa2\x96\x95\x8a\xf1\x12\x53\x2e\xb8\xe1\x52\x9c\x14\x68\x58\xc2\x0c\x3b\x3f\x01\x10\xac\xc0\x73\xc8\x30\x2f\x14\xe6\xc8\x34\xea\x88\xbe\x44\x69\x5e\x3d\xc4\x49\xc4\xe5\x89\x2e\x31\x26\x48\x96\x24\x76\x3a\xcb\x6f\x14\x17\x06\xd5\x85\xcc\xab\x42\x68\x1a\x5b\xc0\x5f\x56\x9f\xae\x6f\x98\xc9\xce\x21\xd2\x86\x99\x4a\x47\x1e\xdf\x35\x2b\xf0\x04\x20\xbc\x69\xe9\x9e\xda\x27\xe6\xb1\xc4\x73\xd0\x46\x71\xb1\xb5\x0f\x12\xd4\xb1\xe2\xa5\xb1\x1c\x2e\x9b\xf9\xc0\x35\x98\x0c\x2d\x0a\x90\xa9\xfd\xff\x1d\xe6\x05\xf8\x77\x40\xc1\x04\xdb\x62\x02\x9b\xc7\x7a\xcc\x4f\x9f\x5b\xc4\x00\x4c\xc3\x96\xef\x50\x10\x08\x0d\x47\x23\x54\x97\x59\xa0\xce\xd1\x7b\x93\x1d\x47\xad\x85\x0b\x74\xc6\x95\x52\x28\x4c\x4d\x9e\x45\x0a\x1b\xe4\x62\x0b\x25\xaa\x54\xaa\x02\x13\x48\xa5\xda\xa7\x76\x8c\x2a\x8f\x68\x65\xbf\xb5\xa8\x6b\x3d\x38\x4a\x98\x0e\x3e\x90\xe9\x90\x7f\x67\x81\xc6\x52\x38\xbd\xd1\xbf\xfd\xeb\x8b\x9f\x22\x22\xf3\xcf\x7f\x3e\xf5\xc8\x92\xd3\x97\xbf\x47\x05\x6a\xcd\xb6\x6d\xa1\x7f\x6c\x3d\xd9\xe3\xab\xf3\x8a\xa0\xc8\x51\xac\x90\xd1\x3b\xd6\xbc\x40\x6d\x58\x51\xf6\x25\x70\xb1\x0f\x42\x52\x60\x60\xea\xaf\x0a\x4b\x85\x1a\x85\xa1\x55\xb2\xe2\x41\xb5\x43\x65\x21\xe0\x3e\x43\xe1\x19\x37\x19\xd7\x20\x37\xff\x81\xb1\x81\x7b\xa6\xc1\xbe\x1b\x93\x08\xde\x1b\x42\x29\xa4\x81\x6d\xc5\x14\x13\x06\x31\x01\x23\x61\x43\xa8\x0c\x70\x01\x19\x2b\x4b\x14\x7a\xb1\xc1\x54\x2a\x04\xa9\x12\x54\x41\x9c\xb1\x92\x5a\x83\xc6\x92\x29\x66\x10\x64\x89\xca\xd2\xab\x23\xb8\xc8\x39\x0a\xa3\xa1\x60\x8f\x16\x3d\x61\xb3\x54\xec\x58\x5e\x61\x78\x71\x4d\x3f\x26\x1e\x27\x17\xb0\x7c\x7b\xf1\xe6\xcd\x9b\x7f\x21\x5d\x2b\x80\x89\x84\x00\xb9\x80\xcf\xeb\x8b\xa8\x25\xef\x9f\x3b\xb2\x4e\x98\xa1\xaf\x5b\x25\xab\xd2\xb9\x86\x96\x37\x70\x53\xac\xd1\x03\x38\x3f\xd3\x52\x0e\xfb\x34\xe7\xda\xfc\xba\x3f\xf2\x81\x6b\x63\x47\xcb\xbc\x52\x2c\xef\xba\x1c\x3b\xa0\x33\xa9\xcc\x75\x83\x7c\x01\x99\xaa\xff\xf1\x20\x5c\x6c\xab\x9c\xa9\xce\xec\x13\x00\x1d\x4b\x22\xdc\x4e\x2e\x59\x6c\x05\xa0\xab\x8d\xf2\xae\xcf\x23\x74\x0a\x79\x0e\xff\xf5\xdf\x27\x40\xa2\xe3\x89\x15\xb0\x1b\x94\x25\x8a\x9f\x6f\xde\x7f\x79\xb3\x8a\x33\x2c\xd8\xb9\x17\x61\x47\x85\x5a\xec\x78\xe5\x79\x2c\x91\x56\xb8\x16\x3d\xb0\x8e\x19\x45\x41\x65\xac\x5c\x9d\xce\xf8\x47\x0a\xff\x5a\x71\x85\x49\x78\xd1\x02\x82\x32\xd7\x0f\xc8\xf1\xfa\x2f\xa5\x22\x7d\x30\x3c\xb0\x62\x35\xa6\x89\x06\xf5\xb3\x3d\x82\x67\xc4\x91\x83\x81\x84\xfc\x3f\x3a\xc3\xdf\xb9\x67\x98\x80\xb6\xdc\x3a\x17\xd0\xd6\x21\x2b\x99\x16\x5a\x20\x10\x26\x3c\x0f\x11\xac\xac\x6d\x68\x5a\xb4\x2a\x4f\x20\x96\x62\x87\x8a\x1c\x5e\x2c\xb7\x82\xff\x67\x8d\x59\x93\x78\xe8\x95\x39\x33\xa8\x4d\x07\xa3\x0d\x22\x82\xe5\x4e\x8d\xe7\x56\x3d\x49\xc5\x15\x5a\xdb\xaa\x44\x0b\x9b\x05\xd1\x11\x7c\x24\xbb\xe1\x22\x95\xe7\x90\x19\x53\xea\xf3\xb3\xb3\x2d\x37\x21\xfe\xc5\xb2\x28\x2a\xc1\xcd\xe3\x59\x2c\x85\x51\x7c\x53\x19\xa9\xf4\x59\x82\x3b\xcc\xcf\x34\xdf\x2e\x98\x8a\x33\x6e\x30\x36\x95\xc2\x33\x56\xf2\x85\x25\x5c\x38\x3b\x2b\x92\xbf\xaf\x35\x66\xd6\xa2\xb4\xe7\x59\x6b\xd5\x1f\x95\x3b\xa9\xbf\x53\x11\x37\xcd\xd1\xdf\x77\x31\xcb\xab\xd5\x1a\xc2\x4b\xed\x12\x74\x65\xee\xbc\x4c\x3d\x4d\x37\x82\x27\x41\x71\x91\x92\x7f\xa2\x85\x4b\x95\x2c\x2c\x46\x14\x49\x29\xb9\x30\x2e\x0e\x59\xc7\xd1\x41\xa9\xab\x4d\xc1\x8d\xb6\xfa\x87\xda\xd0\xfa\x44\x70\xc1\x04\xf9\x95\x0d\x42\x55\x26\xde\x99\x09\xb8\x60\x05\xe6\x17\xa4\xc6\xdf\x5b\xec\x24\x61\xbd\x20\x91\x1e\x16\x7c\x3b\x79\xe9\x02\x76\xec\x0b\x20\xe4\x2d\x93\x40\x7d\x43\x74\xb6\x17\x67\x4c\xb5\xa1\x86\x0c\x90\x3e\x16\xae\xfb\x68\xf4\x4d\x53\x78\x6a\x5c\x37\x55\x9e\xaf\x30\x56\xd8\xc3\x0a\xbd\x88\xd6\x85\x87\x4c\xe6\x89\xb3\x6f\x85\x29\x2a\x14\x31\x06\xeb\x63\x95\xc9\x48\xde\x71\xdf\xae\x6b\x71\x39\x24\x94\x94\xb0\x38\x46\xad\x83\x8e\x7a\x87\x56\x4a\xcd\x8d\x54\x8f\x50\xd9\x91\x77\xeb\xf5\xcd\x0a\x36\x4c\xf3\xd8\x62\x8f\x06\x91\x5e\x7f\x5a\xc3\xfb\x8f\x37\x1f\xae\x3e\x5e\x5d\xaf\xaf\x2e\xff\x6e\x00\x68\x42\x58\x30\xb2\x3c\xe1\xb3\xb0\xb1\x68\x60\x60\x4a\xca\x10\xa2\xde\xe0\xc8\x88\xd2\x85\xcf\x96\x1f\x5e\x96\x5f\xb8\x81\xcf\xcb\x0f\x21\xc9\xa2\x7f\x7d\x86\x45\x23\x8d\x20\xe7\x80\xd1\x36\x82\xdb\x2d\x37\x3f\x6d\xb9\xc9\xaa\x4d\x14\xcb\xe2\x5c\xaa\xed\x19\x01\xdd\xce\x07\x09\xbc\x25\xfb\x73\xe6\xe7\x67\x9c\x35\x33\x40\x2a\xb8\xd5\x3a\x73\xe3\x3f\xe1\x03\x2b\xca\x1c\x2d\xda\xd7\xaf\x5f\xbf\xae\x21\xa3\x2d\x37\xb7\x43\x2b\x36\xc9\xfc\x98\xd4\x3a\xdc\x4f\xa6\xeb\x56\xc3\xe1\xeb\x3d\x37\x99\xac\xcc\x57\x0a\x28\x2c\xe7\x4c\x0f\xb3\x6a\xc5\xa3\x30\xe1\x1a\x5e\x90\x5a\xde\x52\xd0\x87\xaa\xdc\x2a\x96\x20\xfc\x96\xe6\x6c\xab\x7f\xa7\xa8\xbe\xc9\xf1\xcc\xc2\xdd\xbe\x7c\x32\x53\x25\x65\x92\x87\x98\xa2\x74\x33\x30\x45\x13\x82\x59\x39\x7e\x14\xe6\xcc\xf0\x5d\x6d\x6c\xcd\x12\x0f\xb2\xa5\xa4\x34\x4f\x26\x53\x61\x7a\x90\xca\x25\xa6\x81\x48\xd2\xb4\x8d\x62\x22\xce\xe0\x85\x54\x20\x4d\x86\xaa\xf1\x0a\x2f\x89\xd2\xaa\x49\x4f\xba\x9f\x4b\x4c\x59\x95\xdb\xc8\x00\xb3\x82\x69\x83\x6a\x66\x35\xcb\x72\x2c\x45\xca\xb7\x95\xc2\x84\x12\x0a\x82\xf3\x5a\x9d\x3e\x83\xa5\x20\xa6\x23\x38\x2b\xe5\xb0\x49\xed\x39\xa7\x60\x53\x21\x48\xdd\x55\x1b\x54\x02\x0d\xea\x85\x5d\x2b\x1d\x69\x23\x15\xdb\x62\xb4\x95\x72\x9b\x23\x2b\x39\x55\x28\xc5\xed\xa0\x24\xac\xce\x79\x4c\x7e\x7a\xcb\xa4\x9e\x6e\x40\xce\xc5\x2e\x8f\x58\xca\x55\x80\x6c\x39\xf5\xae\x0f\x1f\xf4\xd7\x83\x5c\xf4\x3d\x0f\xbc\x90\x54\xd8\x58\x17\xfe\x32\x82\x35\xad\xab\xc2\x84\x90\xb3\x5c\xc3\x3d\xcf\x73\xca\x05\x58\x92\xd4\xa5\xc4\x1e\x4a\x49\xa6\xeb\x42\xc0\x2f\xdc\xd0\x7a\xf8\x92\x86\x5e\x56\x70\xa5\xa4\xa2\xc5\xd2\x86\x29\xca\x26\xfe\xd6\xdd\x7e\x98\x6c\x8b\x8b\x67\x61\xd0\x77\xbc\xbc\xc4\xf2\xb3\x4d\xaf\x0e\x2f\x7f\x1b\xda\xad\x87\x41\xfa\x93\x85\xc2\x90\xcc\x51\x5a\xac\xa0\x2a\x21\xc6\x88\x9e\x59\x97\x99\x60\xe9\x13\xbb\x59\x58\x27\x2e\xb4\x61\x79\x4e\x91\x5c\x2a\xef\x53\x43\xc0\xb7\xaa\x3e\xa7\x7f\x07\x71\x3a\xa7\x97\x60\x89\x22\x41\x11\x73\xd4\xf0\xb5\xa8\xb4\xf9\x4a\x3a\x13\xea\x20\xd7\xdb\xe0\xd6\x89\xe8\x2a\x8e\x71\x4a\x0b\x36\x52\xe6\xc8\xfa\x69\xc9\xae\x5f\xde\x0c\x8a\x2b\x94\x38\xde\x3d\x18\xa6\xb6\x68\x30\x69\xc7\x1c\x8f\xca\xfb\x87\x7f\x8a\xfe\x14\xbd\x7a\x92\xf9\xa6\x52\xc5\xf8\xd9\x85\x9e\x7d\x7a\x3a\xb4\xbc\x25\x40\xb7\x64\x05\x53\x77\x4e\x08\x9d\xd6\x8a\x91\x70\xbb\x58\x58\x84\xb7\x21\x9a\xe9\x3e\x31\x6b\x9b\xd6\x13\x54\xc8\xe9\x7c\x95\xe0\x56\x92\x1e\x2a\x59\x6d\x33\x48\x30\x47\x43\x01\xd0\x35\x22\x80\xa7\x20\x10\x93\xbe\xc0\xc7\x85\x4d\x5a\x32\x50\x4b\xf6\x98\x9b\xbd\x6b\x00\x83\xb4\xbd\x64\xc9\x21\x5b\x36\x29\x08\xda\x05\x88\xe0\x7d\xea\xda\x15\x55\x59\xe6\x1c\x93\x7e\x94\xb7\x85\xa1\xbc\x47\x6d\xe0\x2b\x0a\x8a\xe3\x7e\xd1\x3c\xd2\xaf\xb5\x2f\x0a\x6b\x1a\xc1\x17\x2a\xdc\xa1\x45\x48\x5f\x6d\x6c\xad\x08\x4c\xe1\x39\x9c\xee\x5e\x9f\xce\xe1\x74\xf7\xe6\x74\x36\x28\x8d\x41\x73\x45\x51\x15\xfb\x72\x58\xc0\xee\x75\xff\xd1\x9b\xce\xa3\x82\x3d\xbc\xe3\x7a\x28\xa2\x75\xa4\xf8\xb1\x06\x0b\x32\x2c\xd8\x03\x2f\xaa\x02\x58\x21\x2b\x61\x48\x94\x0a\x77\xdc\xb6\x76\x49\x9e\x77\x88\x25\xa9\xc2\xa0\xfc\x3a\xfd\x86\x9e\xc8\x81\x9b\x10\xa8\x2d\xaa\x57\x7f\x1a\xd6\x0a\xaa\xc5\xb7\xd8\x7d\x43\xab\x81\x3b\xc9\xcf\x81\x46\xed\x7a\x84\xc8\xbe\x8f\x6c\x13\x1d\x16\x7e\x8b\x82\xfc\x9d\x6b\x45\xb2\x34\xe5\x0f\xc1\x4d\xd5\x0e\xb9\xc9\xbb\x9c\x85\x0c\x26\xae\xc3\x6c\x0f\x2c\x3f\x39\x30\xf3\xc5\xaa\xd0\x01\xae\x6b\xb8\x43\xe6\x6e\x51\x3a\x63\xb1\xf0\xfd\x75\x74\x0c\xd4\x0b\xe5\x25\x57\x3b\x32\xe7\xc3\xbc\xeb\xf6\x0d\x64\x12\x03\x13\xc1\x81\xf4\xfd\xc7\xb5\x34\x80\x0f\x65\xce\x63\x6e\xf2\x47\xd0\x68\x7c\xd7\xc1\x39\xe5\xdb\x94\xe5\x1a\x6f\x01\xff\x5a\x51\xcc\xa7\x27\x46\x55\x78\x0b\x49\x15\x04\xda\x43\x99\x60\x9c\x33\xe5\x72\x5d\xc1\xa8\x98\x0f\x94\x86\xa0\x74\xbc\xcb\x51\x32\xcf\x37\x2c\xbe\x9b\x94\x31\xa9\x4e\x00\x0c\x1c\xe8\x26\xb6\x0c\xb5\xda\xba\x6f\x7e\x72\x0d\x9e\x70\x4d\x6e\xe8\x9d\x94\x77\x83\x49\x44\x87\xbc\xcb\x16\xf0\x21\x1d\x28\x15\xee\xf6\x7b\x31\xe1\x93\x59\x04\xb6\x85\xe3\x83\x39\x24\x95\x0a\x7a\x1e\x04\xf0\xf4\xf8\xe9\x5c\xea\x41\x36\xae\x2c\xd8\x24\x03\x24\xf2\x40\xc7\x40\xac\x3a\x44\x88\x0d\x63\x07\xe9\x78\x62\xe8\x9c\xa4\xe7\x7b\xc4\xcf\xc3\x7c\x16\xec\x61\x89\x46\x8d\x24\xa0\xfb\x41\xc0\x83\x8e\x07\x81\x50\xea\x2a\x07\x38\x9a\xdd\xd7\x29\xa1\xef\xc6\x16\xec\x0e\x83\xb7\xd8\x30\x4e\x59\xde\x38\x2f\x43\x9e\xbf\x5e\xb5\x82\x19\x0b\xf1\x8f\xff\x30\x50\xbe\x39\x79\x1d\x51\xbc\x79\xc1\x1e\x5e\xd9\x80\x73\x51\xca\x44\x0f\xd7\x64\xa4\x89\x3c\x05\x46\xa1\x22\x26\xbd\x8d\xdc\x4a\x7b\xaf\xa8\xa1\x94\x09\xad\xb5\xb1\xe5\xda\x93\x57\x90\x44\x7d\x4c\x3d\x6a\xd4\xe3\x41\x83\x39\x66\xf9\x58\x6a\x50\x01\xfb\x06\x23\x37\xbc\x40\x59\x1d\x6e\x4b\xad\x1d\x5c\x9d\x24\xf3\xc2\x4a\xfd\x9e\x71\x5f\x44\x8a\x47\xe0\x22\xe1\x3b\x9e\x54\x2c\x87\x5f\xeb\xca\x79\xb8\x34\x0e\xdb\x53\xf0\x22\xe7\x77\x08\x7f\x91\x1b\xe7\x98\xad\x2f\x7b\x19\xfc\xd7\x61\xb6\x9e\xab\x7e\x44\xf7\x41\x9e\xff\x9d\x85\x4c\x62\x5c\xed\xac\x00\x2a\x61\x78\x0e\x2c\xcf\x07\x99\xbd\x91\x89\x9e\xc3\xcd\x97\x0b\x3d\xb7\xfd\x77\x1e\xa3\xf6\xdb\x15\x5c\x58\x9b\x15\x55\xb1\x41\x45\x36\x4b\xb0\x76\xaf\x04\x2e\xb1\xcc\xe5\x63\x81\xc2\x0c\xb7\xb7\x56\x86\x19\x4c\xab\x7c\x85\xc6\xb6\x57\x96\x68\x55\x7a\x85\x86\x52\x57\xe0\x82\xd4\x02\x59\xf2\x68\x37\xae\x6a\x83\x26\x4e\xa6\x4a\xfd\xc0\x1a\xd3\xae\xf0\xd2\x3a\xad\xf2\xa7\xa9\x15\x95\x95\x17\xcb\xcb\xe9\xfc\x67\xe5\x81\x0e\xc9\xd7\xd6\xa8\xc6\xb5\x18\x86\xbb\xcf\x32\x05\x8b\xc8\xeb\x8c\xdf\x42\x7b\x13\x6a\x54\x3b\xe9\xf8\xc4\xc2\x25\x4d\xd7\x63\xd5\x7a\xd7\x26\xba\xb0\x20\x77\xa8\x14\x4f\x70\xaf\x8e\x6c\x32\x4d\xbf\x65\xdf\x63\xa1\x9b\xdf\xae\x9b\x5c\xae\x35\xb7\xc9\xb4\xba\xd9\xab\x4b\xa1\x06\x51\x86\xcd\xc6\x10\xbb\x8e\x4e\x62\x0d\xea\x9e\x75\xf4\x32\x2b\x02\xfa\x31\x59\x55\x4c\xab\x54\x95\x87\x77\x34\x1c\xdc\xdc\x6e\xb7\x7b\xf9\xdb\xcd\x06\x22\xe9\xf5\x1c\x12\x34\x48\x99\x2f\xa5\xdc\x19\x9a\x6c\xd0\x6f\xd8\x74\xda\x05\x75\xc7\x22\x05\x13\xd8\xa0\xb9\x47\x14\x80\x2c\xce\xdc\x63\x55\x09\xb0\x27\x62\x42\x75\x11\xaa\xa9\x41\x9c\x9f\x46\x32\x5c\xf8\xc1\x59\x18\x91\xfe\x8c\xb8\xc6\xb7\x42\x2a\x7c\xcb\x78\x5e\xa9\x23\xb2\x93\xf7\x1d\x70\x47\x54\xcc\x2a\x72\x2b\x3d\x03\xdf\xb8\x14\x75\xa4\x55\x68\x53\x77\x9e\x52\x49\x97\x32\x9e\x6b\xd7\x8b\xbe\xe7\x1a\xdb\x55\x5e\x8e\xa9\x09\x1e\xcf\x1d\x0c\x71\x4e\xef\xff\x56\x34\xa4\xb5\xfb\x63\x23\xe1\x08\xbb\xdf\x89\xd5\x23\xd9\x6c\xfb\x6d\x1b\x25\x43\x22\xd4\x3a\xd3\x72\x74\x13\x62\x8a\x7b\x5b\x4d\xbf\xe5\x39\xba\x76\xf9\x74\xbc\xfa\xb2\x07\xdc\xea\xac\xe7\x32\x66\xb9\xeb\x59\xd4\x7b\x24\xae\x73\xe9\x40\xfb\x6b\x76\x79\x75\xb3\xbc\xba\xf8\x79\x7d\x75\x39\x07\xb2\x0a\xd7\x07\x78\xab\x64\x11\xb9\x39\xbf\xe2\xa3\xdd\x8e\x11\xda\x20\x1b\xe9\xc4\x31\xa5\xd8\xfe\x16\x11\x37\x58\x0c\x98\xe7\x64\xb7\x7c\xbc\x57\x3e\xd2\x29\x9f\xee\x93\x8f\x77\xc9\x47\xc3\xcd\xee\x70\xbb\xc4\x77\x4a\x1a\xa1\xfb\x2e\xdd\xb7\x85\x9d\x5d\x2d\xf7\xe1\x3d\xf8\x3f\x4a\xc4\xd3\x12\xb3\xed\x19\x52\xad\x91\xad\x9d\xa1\xae\x46\x7b\x87\x9e\x79\x0d\x74\x6d\x9e\x94\xdb\x30\x60\x32\x50\xad\x43\x55\xfd\x8f\x3f\x12\x33\xb1\x52\xa3\xbb\x2b\xd3\xfb\x2b\xa4\x37\x25\x33\xd9\xe0\xd0\xa1\x3d\x16\xf2\x12\xee\x94\xe8\xd8\xf8\x9e\x34\x3e\x79\xf0\xfd\xc8\x77\x11\x84\xba\xc2\x1c\x63\xaa\x6e\xd9\xb0\xf3\xed\xbe\x35\xf2\xe2\xd5\x94\x7c\x85\x63\x4d\xcc\xee\x4c\x31\xd3\xf2\x40\xf6\x59\x49\xd9\x84\x31\x23\xa1\xcb\x7d\xfc\x66\xb5\x3b\x11\x68\xb3\xb0\x79\xe8\x91\x71\xe3\xb6\x13\xdc\xc1\x4e\x83\x45\x29\x15\x53\x3c\x7f\x84\x4a\xb0\x1d\xe3\xb9\xad\x4f\x47\x71\x4f\x47\x32\x2f\xee\x91\xed\xe9\x01\x41\xb6\x37\xa9\xad\x0e\xb5\x77\xaa\x7d\xef\x23\x6c\x55\x4f\xf0\xdb\xdd\xda\x1e\xd9\xab\x6e\x33\x30\xba\x67\xe6\xf6\x8a\x3f\xb2\xd2\x39\xc3\xe7\x59\x86\x43\x02\x05\x2b\x3b\x36\xf1\x7d\xb5\x7f\x64\x7f\xf1\x18\xed\xbf\xc3\xc1\xf6\x41\x9b\xb0\x89\x4d\xc6\xe9\x3d\xca\xa3\x11\x4c\xee\x53\x1e\x85\xe5\xb0\x11\x1f\xd2\x5e\x7c\x70\xa7\xfb\x56\x56\xf3\x9e\xbb\xfe\xa2\xc6\x13\x54\xf8\x7f\xdb\x33\x56\x6a\xb8\x49\xf0\xc3\x1c\xe3\x55\x47\xb0\xc1\x3b\x4e\x58\x34\xd3\xcf\xf2\x8e\x13\x18\x6b\xbf\xf9\x2c\xef\x38\x81\xf8\x0f\xf3\x9b\x95\x3a\x56\xcc\xc3\xe7\x4a\xf6\xb4\xee\xd9\x3e\xb0\x9d\x0d\x3e\xcf\x01\xfa\x73\x1e\xff\xef\xfc\xfe\x36\x9c\xdf\x50\x5f\xf2\x1b\x7b\x92\xae\xff\xd8\xa3\xe5\x1b\xfa\x91\x9d\xde\x63\xbf\xcc\x7b\x6a\x2f\xf2\xf8\xbe\xe3\xb0\xdc\xfc\xc1\xfc\x93\x11\x89\xb5\x3a\x61\xfe\xfe\x4a\x2c\x85\x61\x5c\xe8\x70\x83\x85\x0b\x57\x24\xda\x82\x73\x43\xfe\x88\x89\xfd\x6b\x35\x5d\x12\x7a\xf6\x31\x7a\xc0\xb7\xbe\xbe\x32\xb9\xaa\x17\x35\x58\x43\x9c\xdc\x68\x54\x3b\xef\x50\xbd\x5f\x09\x9d\xbc\x99\xa3\x1d\xfb\xd2\x27\x9f\x39\x87\x8c\xe9\x56\x1a\x76\x9f\xf1\x38\x03\x77\xce\x0e\x95\x76\x5d\x17\x14\x90\xa2\x89\xb3\xb1\x83\x1e\x3f\xa2\xbc\xd4\xcd\xfd\xa3\xee\x00\x61\x7c\x62\x15\x95\x33\x6d\xd6\x8a\x09\xcd\xc3\x35\x9d\x23\x1c\xe6\x87\xde\xa4\x76\x9f\xc3\x5d\xec\x89\xa5\x52\xa8\x4b\x5a\xa1\x51\x93\xaf\x6f\x29\x68\x13\x94\x2a\xce\x98\xd8\x62\x1d\x25\x6b\x45\x98\x72\xbb\x13\x6e\x25\xb4\x31\x12\x66\x70\x41\xc4\x8d\x88\xc0\x1d\xfa\x7a\x02\xfb\xcd\x84\x03\xac\x83\x91\x63\xdc\xef\xb1\xee\xb6\x48\x7f\x28\xeb\xfe\x12\xd8\x11\x3c\xfb\xcb\x61\xee\x7a\x45\x56\x15\x4c\x58\xd7\x64\xbb\xa7\x2d\xc0\x60\x71\x09\x1a\xc6\xf3\xb1\xd2\xd1\x03\x59\xe6\x4d\xad\x47\x73\x88\x65\x51\xe6\x58\xf8\xab\x1a\x0a\x99\x7e\x26\xf7\x6e\xea\x11\x6c\x2d\x2d\xa0\xe3\x6a\xa3\x38\xa6\x50\xb0\x38\xe3\x02\x1b\xee\xf0\xa1\xcc\x99\x70\x6e\x6e\xe8\x38\x90\x27\xc8\x1d\xd3\x75\x2b\x36\xd3\xfb\xbc\x3d\x8b\x8b\xbe\x87\x1e\xe1\x62\xd5\xb9\x52\x58\x93\x31\x07\x29\xac\x3e\xbd\x98\xad\x55\x85\xb3\x39\xcc\xde\xb2\x5c\xe3\x6c\x78\x6b\x0c\x60\xf6\x59\xdc\x09\x79\x2f\x66\x83\x27\xba\x8f\xd0\xb9\xa1\x33\x5c\xee\xb3\x80\x53\xa2\xe1\x74\x6c\xd0\x12\x36\x36\xea\xc9\x1a\x18\xb5\x14\x1d\x91\xe1\x3d\x96\x38\x25\x1e\xd7\xf6\x70\x7e\x9d\xc4\xe4\xa2\x36\xfd\x3f\x26\xa9\x70\x95\x92\xa0\x97\xb6\x11\xff\x6f\x2c\xbe\xa3\x6f\x6b\xd4\x06\x93\xef\x22\xc2\x36\x99\x23\x20\x81\xf2\x91\xe1\x40\xf6\xd8\x70\xcd\xc9\x08\x80\x63\xae\x33\x48\x9a\xfe\xb3\xa1\x4a\xc3\x60\xb2\xf4\x27\xe8\x26\xc3\xf6\x87\xa1\x19\xc1\x8d\x86\x33\x78\x8d\x93\xb0\xfb\x46\xfb\x57\x83\xdc\x47\x3f\x8a\xb8\xb9\xc2\xb6\x41\x97\x73\xa5\x8c\xe7\x98\x4c\xb7\x35\x07\x56\xc0\x65\x0e\x98\xfc\xe2\x0e\xbf\x1d\xe2\xe2\x53\x0f\xbc\x3e\x53\x22\xb5\xbd\x94\x87\xc2\x84\x93\x74\x96\x21\x3f\xa1\xc7\x85\xdf\x05\x9b\x3e\xce\xf5\xd4\x36\xbd\xbd\xfd\x3c\xc9\x80\xbb\x3c\xdd\xce\x22\xed\x35\xd5\x09\xb3\x68\xbe\xbf\xb5\x22\x1e\x30\x8f\xd9\xfb\xfa\x8c\x33\xcd\xf8\x1c\xce\x38\x77\xad\x2a\xfc\x1f\xd0\x38\xab\xb1\x60\x7d\x8c\x34\xd4\x05\x74\xff\xad\xdc\x09\xe7\xc6\x06\xb9\xd8\x06\x23\x6c\x9b\x64\x1f\xe3\xd2\x1f\x90\xf0\x58\x5f\x1e\xab\x21\x63\x87\x54\x27\xec\xb2\x3d\xe8\x5e\xd7\x03\x68\x24\xd6\x1b\xaa\xc5\xd7\x1b\x19\xb1\xf3\x30\x30\xf2\x2a\x2f\xe5\xc1\xe7\x13\x53\x06\x1e\xd7\xc2\xef\x8d\x8c\xe0\x69\x2d\xd0\xe0\xd8\xa0\xdb\x71\x43\xcd\x52\x75\x86\xbf\xf5\xa4\x2c\xd3\x80\xdc\xde\xd1\x09\x67\x60\xa9\x08\xab\x8f\xbe\x3e\xe1\xec\x6a\xab\x4a\x3a\x86\x92\xc1\xdf\x03\xd8\xbf\xd9\x5f\xff\x50\xc1\x58\xd7\xad\xf3\x63\x01\xf6\x16\xf1\x13\x8f\x2b\xa8\x63\x7c\x75\xed\x9e\x9b\x3d\xa4\x5f\xb8\xa1\x4a\x29\x23\x69\xb5\xce\xa1\x37\x85\x93\xff\x21\x86\x81\x9e\x53\xe2\xb5\xf6\x78\x1a\xfd\xf2\x5f\xc8\x4a\x4c\x57\xf8\xcb\x36\xa4\xbd\x12\xad\xc2\x15\x9e\xe6\x7c\x77\x38\xd5\xca\x5c\xf4\xd1\x50\xb0\x64\xa0\x1a\xe4\xc6\xb9\xc2\x58\xd9\x64\x14\x93\xde\x89\x31\x1b\x63\x2a\x85\x36\xf6\xb8\x93\xc6\x01\xa4\xa9\xc3\x7b\x78\xeb\x2d\x59\xd5\x84\x39\x57\xf0\x7c\x8b\xcf\x0f\x17\x36\x60\xf7\xaa\xf9\xe6\x7f\x20\xc4\xfd\xd2\x80\x1d\x00\xf7\xd3\x0a\xc9\x39\x18\x55\x39\x75\xf2\xd7\xb2\xfc\x93\x26\xdd\x64\x71\x8c\x14\x9b\xaf\xf7\x7f\x74\xe0\xd4\x65\x68\xe1\xd7\x04\xec\xd7\x56\xad\x0e\xbf\xfd\x7e\xe2\xb0\x62\xf2\x25\xd0\x41\x0f\xff\x27\x00\x00\xff\xff\x00\x54\x85\xaa\x48\x45\x00\x00"), }, "/deployment.yaml.tmpl": &vfsgen۰CompressedFileInfo{ name: "deployment.yaml.tmpl", diff --git a/pkg/install/templates/crds.yaml.tmpl b/pkg/install/templates/crds.yaml.tmpl index 9efd418d4..f0426fbb0 100644 --- a/pkg/install/templates/crds.yaml.tmpl +++ b/pkg/install/templates/crds.yaml.tmpl @@ -206,6 +206,10 @@ spec: enable: description: Enable will mark this Helm release for tests. type: boolean + ignoreFailures: + description: IgnoreFailures will cause a Helm release to be rolled + back if it fails otherwise it will be left in a released state + type: boolean timeout: description: Timeout is the time to wait for any individual Kubernetes operation (like Jobs for hooks) during test. diff --git a/pkg/release/release.go b/pkg/release/release.go index 3abe9d1a3..3205fc3df 100644 --- a/pkg/release/release.go +++ b/pkg/release/release.go @@ -218,7 +218,7 @@ func (r *Release) determineSyncAction(client helm.Client, hr *apiV1.HelmRelease, case string(apiV1.HelmV3): v2ReleaseExists, err := r.converter.V2ReleaseExists(hr.GetReleaseName()) if err != nil { - return SkipAction, nil, fmt.Errorf("failed to retrieve Helm v2 release whil attempting migration: %w", err) + return SkipAction, nil, fmt.Errorf("failed to retrieve Helm v2 release while attempting migration: %w", err) } if v2ReleaseExists { return MigrateAction, nil, nil @@ -364,19 +364,24 @@ next: case TestAction: if hr.Spec.Test.Enable { logger.Log("info", "running test", "action", TestAction) + if err = r.test(client, hr); err != nil { logger.Log("error", err, "action", TestAction) errs = append(errs, err) - if curRel == nil { - action = UninstallAction + if !hr.Spec.Test.GetIgnoreFailures() { + if curRel == nil { + action = UninstallAction + } else { + action = RollbackAction + } + goto next } else { - action = RollbackAction + logger.Log("info", "test failed - ignoring failures", "revision", chart.revision) } - goto next + } else { + logger.Log("info", "test succeeded", "revision", chart.revision, "action", action) } - - logger.Log("info", "test succeeded", "revision", chart.revision, "action", action) } status.SetStatusPhaseWithRevision(r.hrClient.HelmReleases(hr.Namespace), hr, apiV1.HelmReleasePhaseSucceeded, chart.revision) diff --git a/pkg/status/conditions.go b/pkg/status/conditions.go index ec3601a6a..c72d230f3 100644 --- a/pkg/status/conditions.go +++ b/pkg/status/conditions.go @@ -133,11 +133,13 @@ func ConditionsForPhase(hr *v1.HelmRelease, phase v1.HelmReleasePhase) ([]v1.Hel condition.Type = v1.HelmReleaseTested condition.Status = v1.ConditionFalse condition.Message = message - conditions = append(conditions, &v1.HelmReleaseCondition{ - Type: v1.HelmReleaseReleased, - Status: v1.ConditionFalse, - Message: message, - }) + if !hr.Spec.Test.GetIgnoreFailures() { + conditions = append(conditions, &v1.HelmReleaseCondition{ + Type: v1.HelmReleaseReleased, + Status: v1.ConditionFalse, + Message: message, + }) + } case v1.HelmReleasePhaseRollingBack: condition.Type = v1.HelmReleaseRolledBack condition.Status = v1.ConditionUnknown diff --git a/test/e2e/40_tests.bats b/test/e2e/40_tests.bats index 130094bfe..f5b920076 100644 --- a/test/e2e/40_tests.bats +++ b/test/e2e/40_tests.bats @@ -36,7 +36,7 @@ function setup() { poll_until_equals 'release deploy' 'True' "kubectl -n $DEMO_NAMESPACE get helmrelease/podinfo-helm-repository -o jsonpath='{.status.conditions[?(@.type==\"Tested\")].status}'" } -@test "When test.enable is set, releases with failed tests are uninstalled" { +@test "When test.enable is set and test.ignoreFailures is false, releases with failed tests are uninstalled" { # Apply the HelmRelease kubectl apply -f "$FIXTURES_DIR/releases/test/fail.yaml" >&3 @@ -49,7 +49,7 @@ function setup() { } # TODO: Fail tests on install instead of upgrade once install retries can be disabled. -@test "When tests fail, Tested and Released conditions are False" { +@test "When tests fail and test.ignoreFailures is false, Tested and Released conditions are False" { # Apply the HelmRelease kubectl apply -f "$FIXTURES_DIR/releases/test/success.yaml" >&3 @@ -70,7 +70,24 @@ function setup() { [ "$output" = 'False' ] } -@test "When test.enable and rollback.enable are set, releases with failed tests are rolled back" { +@test "When tests fail and test.ignoreFailures is true, release has phase 'TestFailed' and Released condition is True & Tested condition is False" { + # Apply the HelmRelease that has test failure + kubectl apply -f "$FIXTURES_DIR/releases/test/fail-ignored.yaml" >&3 + + # Wait for test failure + poll_until_true 'test failure' "kubectl -n $E2E_NAMESPACE logs deploy/helm-operator | grep -E \"test failed\"" + + # Assert `Tested` condition is `False` + poll_until_equals 'tested condition False' 'False' "kubectl -n $DEMO_NAMESPACE get helmrelease/podinfo-helm-repository -o jsonpath='{.status.conditions[?(@.type==\"Tested\")].status}'" + + # Assert test failures are ignored but logged + poll_until_true 'test failure - ignore failures' "kubectl -n $E2E_NAMESPACE logs deploy/helm-operator | grep -E \"test failed - ignoring failures\"" + + # Assert `Released` condition is `True` + poll_until_equals 'released condition True' 'True' "kubectl -n $DEMO_NAMESPACE get helmrelease/podinfo-helm-repository -o jsonpath='{.status.conditions[?(@.type==\"Released\")].status}'" +} + +@test "When test.enable and rollback.enable are set and test.ignoreFailures is false, releases with failed tests are rolled back" { # Apply the HelmRelease kubectl apply -f "$FIXTURES_DIR/releases/test/success.yaml" >&3 diff --git a/test/e2e/45_convert_2to3.bats b/test/e2e/45_convert_2to3.bats index bbd9b0162..3869ab9c1 100644 --- a/test/e2e/45_convert_2to3.bats +++ b/test/e2e/45_convert_2to3.bats @@ -15,7 +15,7 @@ function setup() { kubectl create namespace "$DEMO_NAMESPACE" } -@test "When migrate annotations exist, migration succeeds" { +@test "Migration succeeds from v2 to v3" { # Apply the HelmRelease kubectl apply -f "$FIXTURES_DIR/releases/convert-2to3-v2.yaml" >&3 @@ -28,6 +28,15 @@ function setup() { poll_until_equals 'helm2 no longer shows helm release' '0' "HELM_VERSION=v2 helm ls | grep podinfo-helm-repository | wc -l | awk '{\$1=\$1};1'" poll_until_equals 'helm3 shows helm release' 'podinfo-helm-repository' "HELM_VERSION=v3 helm ls -n $DEMO_NAMESPACE | grep podinfo-helm-repository | awk '{print \$1}'" poll_until_equals 'release migrated' 'True' "kubectl -n $DEMO_NAMESPACE get helmrelease/podinfo-helm-repository -o jsonpath='{.status.conditions[?(@.type==\"Released\")].status}'" + + kubectl apply -f "$FIXTURES_DIR/releases/convert-2to3-v3-upgrade.yaml" >&3 + poll_until_equals 'upgrades work after migration' '1' "kubectl get deploy/podinfo-helm-repository -n "$DEMO_NAMESPACE" -o jsonpath='{.spec.replicas}'" +} + +@test "Migration is skipped and install works when no v2 release exists" { + kubectl apply -f "$FIXTURES_DIR/releases/convert-2to3-v3.yaml" >&3 + poll_until_equals 'helm3 shows helm release' 'podinfo-helm-repository' "HELM_VERSION=v3 helm ls -n $DEMO_NAMESPACE | grep podinfo-helm-repository | awk '{print \$1}'" + poll_until_equals 'install successful' 'True' "kubectl -n $DEMO_NAMESPACE get helmrelease/podinfo-helm-repository -o jsonpath='{.status.conditions[?(@.type==\"Released\")].status}'" } function teardown() { @@ -42,4 +51,4 @@ function teardown() { kubectl delete namespace "$E2E_NAMESPACE" # Only remove the demo workloads after the operator, so that they cannot be recreated. kubectl delete namespace "$DEMO_NAMESPACE" -} +} \ No newline at end of file diff --git a/test/e2e/fixtures/releases/convert-2to3-v3-upgrade.yaml b/test/e2e/fixtures/releases/convert-2to3-v3-upgrade.yaml new file mode 100644 index 000000000..c547e8038 --- /dev/null +++ b/test/e2e/fixtures/releases/convert-2to3-v3-upgrade.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: helm.fluxcd.io/v1 +kind: HelmRelease +metadata: + name: podinfo-helm-repository + namespace: demo + annotations: + helm.fluxcd.io/migrate: "true" +spec: + helmVersion: v3 + releaseName: podinfo-helm-repository + timeout: 30 + test: + enable: true + timeout: 30 + rollback: + enable: true + wait: true + chart: + repository: https://stefanprodan.github.io/podinfo + name: podinfo + version: 4.0.1 + values: + replicaCount: 1 diff --git a/test/e2e/fixtures/releases/test/fail-no-rollback.yaml b/test/e2e/fixtures/releases/test/fail-ignored.yaml similarity index 84% rename from test/e2e/fixtures/releases/test/fail-no-rollback.yaml rename to test/e2e/fixtures/releases/test/fail-ignored.yaml index d72609ac6..0390c367f 100644 --- a/test/e2e/fixtures/releases/test/fail-no-rollback.yaml +++ b/test/e2e/fixtures/releases/test/fail-ignored.yaml @@ -9,7 +9,11 @@ spec: timeout: 30 test: enable: true + ignoreFailures: true timeout: 30 + rollback: + enable: true + wait: true chart: repository: https://stefanprodan.github.io/podinfo name: podinfo diff --git a/test/e2e/fixtures/releases/test/fail.yaml b/test/e2e/fixtures/releases/test/fail.yaml index 083262cf6..f73c6c943 100644 --- a/test/e2e/fixtures/releases/test/fail.yaml +++ b/test/e2e/fixtures/releases/test/fail.yaml @@ -9,6 +9,7 @@ spec: timeout: 30 test: enable: true + ignoreFailures: false timeout: 30 rollback: enable: true