feat: use new helm version parse function (#760)
* feat: use new helm version parse function Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
		
							parent
							
								
									bfb94314be
								
							
						
					
					
						commit
						5e8a502b41
					
				|  | @ -12,6 +12,7 @@ import ( | |||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/Masterminds/semver/v3" | ||||
| 	"github.com/helmfile/chartify" | ||||
| 	"go.uber.org/zap" | ||||
| 	"go.uber.org/zap/zapcore" | ||||
| 	"helm.sh/helm/v3/pkg/chart" | ||||
|  | @ -30,7 +31,7 @@ type decryptedSecret struct { | |||
| type execer struct { | ||||
| 	helmBinary           string | ||||
| 	enableLiveOutput     bool | ||||
| 	version              semver.Version | ||||
| 	version              *semver.Version | ||||
| 	runner               Runner | ||||
| 	logger               *zap.SugaredLogger | ||||
| 	kubeContext          string | ||||
|  | @ -57,27 +58,30 @@ func NewLogger(writer io.Writer, logLevel string) *zap.SugaredLogger { | |||
| 	return zap.New(core).Sugar() | ||||
| } | ||||
| 
 | ||||
| func parseHelmVersion(versionStr string) (semver.Version, error) { | ||||
| func parseHelmVersion(versionStr string) (*semver.Version, error) { | ||||
| 	if len(versionStr) == 0 { | ||||
| 		return semver.Version{}, nil | ||||
| 		return nil, fmt.Errorf("empty helm version") | ||||
| 	} | ||||
| 
 | ||||
| 	versionStr = strings.TrimLeft(versionStr, "Client: ") | ||||
| 	versionStr = strings.TrimRight(versionStr, "\n") | ||||
| 	v, err := chartify.FindSemVerInfo(versionStr) | ||||
| 
 | ||||
| 	ver, err := semver.NewVersion(versionStr) | ||||
| 	if err != nil { | ||||
| 		return semver.Version{}, fmt.Errorf("error parsing helm version '%s'", versionStr) | ||||
| 		return nil, fmt.Errorf("error find helm srmver version '%s': %w", versionStr, err) | ||||
| 	} | ||||
| 
 | ||||
| 	return *ver, nil | ||||
| 	ver, err := semver.NewVersion(v) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error parsing helm version '%s'", versionStr) | ||||
| 	} | ||||
| 
 | ||||
| 	return ver, nil | ||||
| } | ||||
| 
 | ||||
| func GetHelmVersion(helmBinary string, runner Runner) (semver.Version, error) { | ||||
| func GetHelmVersion(helmBinary string, runner Runner) (*semver.Version, error) { | ||||
| 	// Autodetect from `helm version`
 | ||||
| 	outBytes, err := runner.Execute(helmBinary, []string{"version", "--client", "--short"}, nil, false) | ||||
| 	if err != nil { | ||||
| 		return semver.Version{}, fmt.Errorf("error determining helm version: %w", err) | ||||
| 		return nil, fmt.Errorf("error determining helm version: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return parseHelmVersion(string(outBytes)) | ||||
|  | @ -152,7 +156,7 @@ func (helm *execer) AddRepo(name, repository, cafile, certfile, keyfile, usernam | |||
| 
 | ||||
| 		// See https://github.com/helm/helm/pull/8777
 | ||||
| 		if cons, err := semver.NewConstraint(">= 3.3.2"); err == nil { | ||||
| 			if cons.Check(&helm.version) { | ||||
| 			if cons.Check(helm.version) { | ||||
| 				args = append(args, "--force-update") | ||||
| 			} | ||||
| 		} else { | ||||
|  | @ -450,7 +454,7 @@ func (helm *execer) ChartPull(chart string, path string, flags ...string) error | |||
| 	var helmArgs []string | ||||
| 	helm.logger.Infof("Pulling %v", chart) | ||||
| 	helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0") | ||||
| 	if helmVersionConstraint.Check(&helm.version) { | ||||
| 	if helmVersionConstraint.Check(helm.version) { | ||||
| 		// in the 3.7.0 version, the chart pull has been replaced with helm pull
 | ||||
| 		// https://github.com/helm/helm/releases/tag/v3.7.0
 | ||||
| 		ociChartURL, ociChartTag := resolveOciChart(chart) | ||||
|  | @ -465,7 +469,7 @@ func (helm *execer) ChartPull(chart string, path string, flags ...string) error | |||
| 
 | ||||
| func (helm *execer) ChartExport(chart string, path string, flags ...string) error { | ||||
| 	helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0") | ||||
| 	if helmVersionConstraint.Check(&helm.version) { | ||||
| 	if helmVersionConstraint.Check(helm.version) { | ||||
| 		// in the 3.7.0 version, the chart export has been removed
 | ||||
| 		// https://github.com/helm/helm/releases/tag/v3.7.0
 | ||||
| 		return nil | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ import ( | |||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/Masterminds/semver/v3" | ||||
|  | @ -27,6 +28,10 @@ func (mock *mockRunner) ExecuteStdIn(cmd string, args []string, env map[string]s | |||
| } | ||||
| 
 | ||||
| func (mock *mockRunner) Execute(cmd string, args []string, env map[string]string, enableLiveOutput bool) ([]byte, error) { | ||||
| 	if len(mock.output) == 0 && strings.Join(args, " ") == "version --client --short" { | ||||
| 		return []byte("v3.2.4+ge29ce2a"), nil | ||||
| 	} | ||||
| 
 | ||||
| 	return mock.output, mock.err | ||||
| } | ||||
| 
 | ||||
|  | @ -94,7 +99,7 @@ func Test_AddRepo_Helm_3_3_2(t *testing.T) { | |||
| 	logger := NewLogger(&buffer, "debug") | ||||
| 	helm := &execer{ | ||||
| 		helmBinary:  "helm", | ||||
| 		version:     *semver.MustParse("3.3.2"), | ||||
| 		version:     semver.MustParse("3.3.2"), | ||||
| 		logger:      logger, | ||||
| 		kubeContext: "dev", | ||||
| 		runner:      &mockRunner{}, | ||||
|  | @ -737,7 +742,7 @@ exec: helm --kube-context dev pull oci://repo/helm-charts --version 0.14.0 --des | |||
| 			buffer.Reset() | ||||
| 			helm := &execer{ | ||||
| 				helmBinary:  tt.helmBin, | ||||
| 				version:     *semver.MustParse(tt.helmVersion), | ||||
| 				version:     semver.MustParse(tt.helmVersion), | ||||
| 				logger:      logger, | ||||
| 				kubeContext: "dev", | ||||
| 				runner:      &mockRunner{}, | ||||
|  | @ -786,7 +791,7 @@ exec: helm --kube-context dev chart export chart --destination path1 --untar --u | |||
| 			buffer.Reset() | ||||
| 			helm := &execer{ | ||||
| 				helmBinary:  tt.helmBin, | ||||
| 				version:     *semver.MustParse(tt.helmVersion), | ||||
| 				version:     semver.MustParse(tt.helmVersion), | ||||
| 				logger:      logger, | ||||
| 				kubeContext: "dev", | ||||
| 				runner:      &mockRunner{}, | ||||
|  | @ -975,7 +980,7 @@ func Test_ShowChart(t *testing.T) { | |||
| 	showChartRunner := mockRunner{output: []byte("name: my-chart\nversion: 3.2.0\n")} | ||||
| 	helm := &execer{ | ||||
| 		helmBinary:  "helm", | ||||
| 		version:     *semver.MustParse("3.3.2"), | ||||
| 		version:     semver.MustParse("3.3.2"), | ||||
| 		logger:      NewLogger(os.Stdout, "info"), | ||||
| 		kubeContext: "dev", | ||||
| 		runner:      &showChartRunner, | ||||
|  | @ -992,3 +997,55 @@ func Test_ShowChart(t *testing.T) { | |||
| 		t.Errorf("helmexec.ShowChart() - expected chart version was %s, received: %s", "3.2.0", metadata.Version) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestParseHelmVersion(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		name    string | ||||
| 		version string | ||||
| 		want    *semver.Version | ||||
| 		wantErr bool | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:    "helm 2", | ||||
| 			version: "Client: v2.16.1+ge13bc94\n", | ||||
| 			want:    semver.MustParse("v2.16.1+ge13bc94"), | ||||
| 			wantErr: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:    "helm 3", | ||||
| 			version: "Client: v3.2.4+ge29ce2a\n", | ||||
| 			want:    semver.MustParse("v3.2.4+ge29ce2a"), | ||||
| 			wantErr: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:    "helm 3 with os arch and build info", | ||||
| 			version: "Client v3.7.1+7.el8+g8f33223\n", | ||||
| 			want:    semver.MustParse("v3.7.1+7.el8"), | ||||
| 			wantErr: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:    "empty version", | ||||
| 			version: "", | ||||
| 			want:    nil, | ||||
| 			wantErr: true, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:    "invalid version", | ||||
| 			version: "oooooo", | ||||
| 			want:    nil, | ||||
| 			wantErr: true, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got, err := parseHelmVersion(tt.version) | ||||
| 			if (err != nil) != tt.wantErr { | ||||
| 				t.Errorf("parseHelmVersion() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("parseHelmVersion() = %v, want %v", got, tt.want) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue