Add insecure skip tls verify support (#882)
* feat: add insecure-skip-tls-verify support Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									e67eb0c973
								
							
						
					
					
						commit
						1843cc447e
					
				|  | @ -72,7 +72,7 @@ jobs: | |||
|            # we will mark this combination as failable, | ||||
|            # and instruct users to upgrade helm and helm-secrets at once. | ||||
|            plugin-secrets-version: 4.0.0 | ||||
|            plugin-diff-version: 3.8.0 | ||||
|            plugin-diff-version: 3.8.1 | ||||
|            extra-helmfile-flags: | ||||
|            v1mode: | ||||
|          - helm-version: v3.12.0 | ||||
|  | @ -84,14 +84,14 @@ jobs: | |||
|          - helm-version: v3.12.0 | ||||
|            kustomize-version: v4.5.7 | ||||
|            plugin-secrets-version: 4.0.0 | ||||
|            plugin-diff-version: 3.8.0 | ||||
|            plugin-diff-version: 3.8.1 | ||||
|            extra-helmfile-flags: | ||||
|            v1mode: | ||||
|          # Helmfile v1 | ||||
|          - helm-version: v3.12.0 | ||||
|            kustomize-version: v4.5.7 | ||||
|            plugin-secrets-version: 4.0.0 | ||||
|            plugin-diff-version: 3.8.0 | ||||
|            plugin-diff-version: 3.8.1 | ||||
|            extra-helmfile-flags: | ||||
|            v1mode: "true" | ||||
|          # In case you need to test some optional helmfile features, | ||||
|  | @ -99,7 +99,7 @@ jobs: | |||
|          - helm-version: v3.12.0 | ||||
|            kustomize-version: v4.5.7 | ||||
|            plugin-secrets-version: 4.0.0 | ||||
|            plugin-diff-version: 3.8.0 | ||||
|            plugin-diff-version: 3.8.1 | ||||
|            extra-helmfile-flags: "--enable-live-output" | ||||
|            v1mode: | ||||
|     steps: | ||||
|  |  | |||
|  | @ -92,7 +92,7 @@ RUN set -x && \ | |||
|     [ "$(age --version)" = "${AGE_VERSION}" ] && \ | ||||
|     [ "$(age-keygen --version)" = "${AGE_VERSION}" ] | ||||
| 
 | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.0 && \ | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.1 && \ | ||||
|     helm plugin install https://github.com/jkroepke/helm-secrets --version v4.1.1 && \ | ||||
|     helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.14.0 && \ | ||||
|     helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.12.0 && \ | ||||
|  |  | |||
|  | @ -97,7 +97,7 @@ RUN set -x && \ | |||
|     [ "$(age --version)" = "${AGE_VERSION}" ] && \ | ||||
|     [ "$(age-keygen --version)" = "${AGE_VERSION}" ] | ||||
| 
 | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.0 && \ | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.1 && \ | ||||
|     helm plugin install https://github.com/jkroepke/helm-secrets --version v4.1.1 && \ | ||||
|     helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.14.0 && \ | ||||
|     helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.12.0 && \ | ||||
|  |  | |||
|  | @ -97,7 +97,7 @@ RUN set -x && \ | |||
|     [ "$(age --version)" = "${AGE_VERSION}" ] && \ | ||||
|     [ "$(age-keygen --version)" = "${AGE_VERSION}" ] | ||||
| 
 | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.0 && \ | ||||
| RUN helm plugin install https://github.com/databus23/helm-diff --version v3.8.1 && \ | ||||
|     helm plugin install https://github.com/jkroepke/helm-secrets --version v4.1.1 && \ | ||||
|     helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.14.0 && \ | ||||
|     helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.12.0 && \ | ||||
|  |  | |||
|  | @ -211,6 +211,8 @@ helmDefaults: | |||
|   postRenderer: "path/to/postRenderer" | ||||
|   #	cascade `--cascade` to helmv3 delete, available values: background, foreground, or orphan, default: background | ||||
|   cascade: "background"  | ||||
|   # insecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart | ||||
|   insecureSkipTLSVerify: false | ||||
| 
 | ||||
| # these labels will be applied to all releases in a Helmfile. Useful in templating if you have a helmfile per environment or customer and don't want to copy the same label to each release | ||||
| commonLabels: | ||||
|  | @ -311,6 +313,8 @@ releases: | |||
|     postRenderer: "path/to/postRenderer" | ||||
|     # cascade `--cascade` to helmv3 delete, available values: background, foreground, or orphan, default: background | ||||
|     cascade: "background"  | ||||
|     # insecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart | ||||
|     insecureSkipTLSVerify: false | ||||
| 
 | ||||
|   # Local chart example | ||||
|   - name: grafana                            # name of this release | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ import ( | |||
| const ( | ||||
| 	HelmRequiredVersion           = "v3.10.3" | ||||
| 	HelmRecommendedVersion        = "v3.12.0" | ||||
| 	HelmDiffRecommendedVersion    = "v3.4.0" | ||||
| 	HelmDiffRecommendedVersion    = "v3.8.1" | ||||
| 	HelmSecretsRecommendedVersion = "v4.1.1" | ||||
| 	HelmGitRecommendedVersion     = "v0.12.0" | ||||
| 	HelmS3RecommendedVersion      = "v0.14.0" | ||||
|  |  | |||
|  | @ -309,8 +309,7 @@ func (c *StateCreator) scatterGatherEnvSecretFiles(st *HelmState, envSecretFiles | |||
| 		func(id int) { | ||||
| 			for secret := range secrets { | ||||
| 				release := &ReleaseSpec{} | ||||
| 				flags := st.appendConnectionFlags([]string{}, release) | ||||
| 				decFile, err := helm.DecryptSecret(st.createHelmContext(release, 0), secret.path, flags...) | ||||
| 				decFile, err := helm.DecryptSecret(st.createHelmContext(release, 0), secret.path) | ||||
| 				if err != nil { | ||||
| 					results <- secretResult{secret.id, nil, err, secret.path} | ||||
| 					continue | ||||
|  |  | |||
|  | @ -103,7 +103,7 @@ func TestEnvValsLoad_EnvironmentNameFile(t *testing.T) { | |||
| func TestEnvValsLoad_SingleValuesFileRemote(t *testing.T) { | ||||
| 	l := newLoader() | ||||
| 
 | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"git::https://github.com/helm/helm.git@cmd/helm/testdata/output/values.yaml?ref=v3.8.0"}, nil, "") | ||||
| 	actual, err := l.LoadEnvironmentValues(nil, []interface{}{"git::https://github.com/helm/helm.git@cmd/helm/testdata/output/values.yaml?ref=v3.8.1"}, nil, "") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -18,11 +18,13 @@ import ( | |||
| 	"text/template" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/Masterminds/semver/v3" | ||||
| 	"github.com/helmfile/chartify" | ||||
| 	"github.com/helmfile/vals" | ||||
| 	"github.com/imdario/mergo" | ||||
| 	"github.com/tatsushid/go-prettytable" | ||||
| 	"go.uber.org/zap" | ||||
| 	"helm.sh/helm/v3/pkg/cli" | ||||
| 
 | ||||
| 	"github.com/helmfile/helmfile/pkg/environment" | ||||
| 	"github.com/helmfile/helmfile/pkg/event" | ||||
|  | @ -192,6 +194,8 @@ type HelmSpec struct { | |||
| 
 | ||||
| 	DisableValidation        *bool `yaml:"disableValidation,omitempty"` | ||||
| 	DisableOpenAPIValidation *bool `yaml:"disableOpenAPIValidation,omitempty"` | ||||
| 	// InsecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart
 | ||||
| 	InsecureSkipTLSVerify bool `yaml:"insecureSkipTLSVerify,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // RepositorySpec that defines values for a helm repo
 | ||||
|  | @ -310,6 +314,9 @@ type ReleaseSpec struct { | |||
| 
 | ||||
| 	KubeContext string `yaml:"kubeContext,omitempty"` | ||||
| 
 | ||||
| 	// InsecureSkipTLSVerify is true if the TLS verification should be skipped when fetching remote chart.
 | ||||
| 	InsecureSkipTLSVerify bool `yaml:"insecureSkipTLSVerify,omitempty"` | ||||
| 
 | ||||
| 	// These values are used in templating
 | ||||
| 	VerifyTemplate    *string `yaml:"verifyTemplate,omitempty"` | ||||
| 	WaitTemplate      *string `yaml:"waitTemplate,omitempty"` | ||||
|  | @ -983,7 +990,7 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme | |||
| } | ||||
| 
 | ||||
| func (st *HelmState) listReleases(context helmexec.HelmContext, helm helmexec.Interface, release *ReleaseSpec) (string, error) { | ||||
| 	flags := st.connectionFlags(release) | ||||
| 	flags := st.kubeConnectionFlags(release) | ||||
| 	if release.Namespace != "" { | ||||
| 		flags = append(flags, "--namespace", release.Namespace) | ||||
| 	} | ||||
|  | @ -2113,6 +2120,7 @@ func (st *HelmState) TestReleases(helm helmexec.Interface, cleanup bool, timeout | |||
| 		} | ||||
| 
 | ||||
| 		flags = st.appendConnectionFlags(flags, &release) | ||||
| 		flags = st.appendChartDownloadTLSFlags(flags, &release) | ||||
| 
 | ||||
| 		return helm.TestRelease(st.createHelmContext(&release, workerIndex), release.Name, flags...) | ||||
| 	}) | ||||
|  | @ -2428,12 +2436,12 @@ func findChartDirectory(topLevelDir string) (string, error) { | |||
| 
 | ||||
| // appendConnectionFlags append all the helm command-line flags related to K8s API including the kubecontext
 | ||||
| func (st *HelmState) appendConnectionFlags(flags []string, release *ReleaseSpec) []string { | ||||
| 	adds := st.connectionFlags(release) | ||||
| 	flags = append(flags, adds...) | ||||
| 	kubeFlagAdds := st.kubeConnectionFlags(release) | ||||
| 	flags = append(flags, kubeFlagAdds...) | ||||
| 	return flags | ||||
| } | ||||
| 
 | ||||
| func (st *HelmState) connectionFlags(release *ReleaseSpec) []string { | ||||
| func (st *HelmState) kubeConnectionFlags(release *ReleaseSpec) []string { | ||||
| 	flags := []string{} | ||||
| 	if release.KubeContext != "" { | ||||
| 		flags = append(flags, "--kube-context", release.KubeContext) | ||||
|  | @ -2442,7 +2450,16 @@ func (st *HelmState) connectionFlags(release *ReleaseSpec) []string { | |||
| 	} else if st.HelmDefaults.KubeContext != "" { | ||||
| 		flags = append(flags, "--kube-context", st.HelmDefaults.KubeContext) | ||||
| 	} | ||||
| 	return flags | ||||
| } | ||||
| 
 | ||||
| func (st *HelmState) appendChartDownloadTLSFlags(flags []string, release *ReleaseSpec) []string { | ||||
| 	switch { | ||||
| 	case release.InsecureSkipTLSVerify: | ||||
| 		flags = append(flags, "--insecure-skip-tls-verify") | ||||
| 	case st.HelmDefaults.InsecureSkipTLSVerify: | ||||
| 		flags = append(flags, "--insecure-skip-tls-verify") | ||||
| 	} | ||||
| 	return flags | ||||
| } | ||||
| 
 | ||||
|  | @ -2515,6 +2532,7 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp | |||
| 	} | ||||
| 
 | ||||
| 	flags = st.appendConnectionFlags(flags, release) | ||||
| 	flags = st.appendChartDownloadTLSFlags(flags, release) | ||||
| 
 | ||||
| 	flags = st.appendHelmXFlags(flags, release) | ||||
| 
 | ||||
|  | @ -2555,6 +2573,7 @@ func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseS | |||
| } | ||||
| 
 | ||||
| func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, disableValidation bool, workerIndex int, opt *DiffOpts) ([]string, []string, error) { | ||||
| 	settings := cli.New() | ||||
| 	flags := st.chartVersionFlags(release) | ||||
| 
 | ||||
| 	disableOpenAPIValidation := false | ||||
|  | @ -2586,6 +2605,20 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, | |||
| 
 | ||||
| 	flags = st.appendConnectionFlags(flags, release) | ||||
| 
 | ||||
| 	if st.HelmDefaults.InsecureSkipTLSVerify || release.InsecureSkipTLSVerify { | ||||
| 		diffVersion, err := helmexec.GetPluginVersion("diff", settings.PluginsDirectory) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		dv, _ := semver.NewVersion("v3.8.1") | ||||
| 
 | ||||
| 		if diffVersion.LessThan(dv) { | ||||
| 			return nil, nil, fmt.Errorf("insecureSkipTLSVerify is not supported by helm-diff plugin version %s, please use at least v3.8.1", diffVersion) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	flags = st.appendChartDownloadTLSFlags(flags, release) | ||||
| 
 | ||||
| 	flags = st.appendHelmXFlags(flags, release) | ||||
| 
 | ||||
| 	postRenderer := "" | ||||
|  | @ -2930,8 +2963,7 @@ func (st *HelmState) generateSecretValuesFiles(helm helmexec.Interface, release | |||
| 		} | ||||
| 		path := paths[0] | ||||
| 
 | ||||
| 		decryptFlags := st.appendConnectionFlags([]string{}, release) | ||||
| 		valfile, err := helm.DecryptSecret(st.createHelmContext(release, workerIndex), path, decryptFlags...) | ||||
| 		valfile, err := helm.DecryptSecret(st.createHelmContext(release, workerIndex), path) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  |  | |||
|  | @ -3344,3 +3344,44 @@ func TestCommonDiffFlags(t *testing.T) { | |||
| 		require.Equal(t, tt.expected, result) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestAppendChartDownloadTLSFlags(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		name                         string | ||||
| 		defaultInsecureSkipTLSVerify bool | ||||
| 		releaseInsecureSkipTLSVerify bool | ||||
| 		expected                     []string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:                         "defaultInsecureSkipTLSVerify is true and releaseInsecureSkipTLSVerify is false", | ||||
| 			defaultInsecureSkipTLSVerify: true, | ||||
| 			releaseInsecureSkipTLSVerify: false, | ||||
| 			expected:                     []string{"--insecure-skip-tls-verify"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:                         "defaultInsecureSkipTLSVerify is false and releaseInsecureSkipTLSVerify is true", | ||||
| 			defaultInsecureSkipTLSVerify: false, | ||||
| 			releaseInsecureSkipTLSVerify: true, | ||||
| 			expected:                     []string{"--insecure-skip-tls-verify"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:                         "defaultInsecureSkipTLSVerify is false and releaseInsecureSkipTLSVerify is false", | ||||
| 			defaultInsecureSkipTLSVerify: false, | ||||
| 			releaseInsecureSkipTLSVerify: false, | ||||
| 			expected:                     []string{}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			st := &HelmState{} | ||||
| 			release := &ReleaseSpec{} | ||||
| 			st.HelmDefaults.InsecureSkipTLSVerify = tt.defaultInsecureSkipTLSVerify | ||||
| 			release.InsecureSkipTLSVerify = tt.releaseInsecureSkipTLSVerify | ||||
| 
 | ||||
| 			result := st.appendChartDownloadTLSFlags([]string{}, release) | ||||
| 
 | ||||
| 			require.Equal(t, tt.expected, result) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) { | |||
| 	run(testcase{ | ||||
| 		subject: "baseline", | ||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||
| 		want:    "foo-values-fc7df494d", | ||||
| 		want:    "foo-values-58d856f487", | ||||
| 	}) | ||||
| 
 | ||||
| 	run(testcase{ | ||||
| 		subject: "different bytes content", | ||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||
| 		data:    []byte(`{"k":"v"}`), | ||||
| 		want:    "foo-values-56b47664f5", | ||||
| 		want:    "foo-values-6d96d874f6", | ||||
| 	}) | ||||
| 
 | ||||
| 	run(testcase{ | ||||
| 		subject: "different map content", | ||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, | ||||
| 		data:    map[string]interface{}{"k": "v"}, | ||||
| 		want:    "foo-values-558ff84c89", | ||||
| 		want:    "foo-values-77cdb7dbb6", | ||||
| 	}) | ||||
| 
 | ||||
| 	run(testcase{ | ||||
| 		subject: "different chart", | ||||
| 		release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, | ||||
| 		want:    "foo-values-5595f4fc5c", | ||||
| 		want:    "foo-values-66cd476bbb", | ||||
| 	}) | ||||
| 
 | ||||
| 	run(testcase{ | ||||
| 		subject: "different name", | ||||
| 		release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, | ||||
| 		want:    "bar-values-5bf654bff9", | ||||
| 		want:    "bar-values-5d59565d5b", | ||||
| 	}) | ||||
| 
 | ||||
| 	run(testcase{ | ||||
| 		subject: "specific ns", | ||||
| 		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, | ||||
| 		want:    "myns-foo-values-c685d945", | ||||
| 		want:    "myns-foo-values-644b7dfd78", | ||||
| 	}) | ||||
| 
 | ||||
| 	for id, n := range ids { | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ export HELM_DATA_HOME="${helm_dir}/data" | |||
| export HELM_HOME="${HELM_DATA_HOME}" | ||||
| export HELM_PLUGINS="${HELM_DATA_HOME}/plugins" | ||||
| export HELM_CONFIG_HOME="${helm_dir}/config" | ||||
| HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.8.0}" | ||||
| HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.8.1}" | ||||
| HELM_SECRETS_VERSION="${HELM_SECRETS_VERSION:-3.15.0}" | ||||
| export GNUPGHOME="${PWD}/${dir}/.gnupg" | ||||
| export SOPS_PGP_FP="B2D6D7BBEC03B2E66571C8C00AD18E16CFDEF700" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue