parent
							
								
									a9aa7af572
								
							
						
					
					
						commit
						90a41222e6
					
				|  | @ -48,40 +48,28 @@ func NewLogger(writer io.Writer, logLevel string) *zap.SugaredLogger { | ||||||
| 	return zap.New(core).Sugar() | 	return zap.New(core).Sugar() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getHelmVersion(helmBinary string, logger *zap.SugaredLogger, runner Runner) Version { | // versionRegex matches versions like v1.1.1 and v1.1
 | ||||||
|  | var versionRegex = regexp.MustCompile("v(?P<major>\\d+)\\.(?P<minor>\\d+)(?:\\.(?P<patch>\\d+))?") | ||||||
| 
 | 
 | ||||||
| 	// Autodetect from `helm verison`
 | func parseHelmVersion(versionStr string) (Version, error) { | ||||||
| 	bytes, err := runner.Execute(helmBinary, []string{"version", "--client", "--short"}, nil) | 	if len(versionStr) == 0 { | ||||||
| 	if err != nil { | 		return Version{}, nil | ||||||
| 		panic(err) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if bytes == nil || len(bytes) == 0 { | 	matches := versionRegex.FindStringSubmatch(versionStr) | ||||||
| 		return Version{} | 	if len(matches) == 0 { | ||||||
|  | 		return Version{}, fmt.Errorf("error parsing helm verion '%s'", versionStr) | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	re := regexp.MustCompile("v(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)") |  | ||||||
| 	matches := re.FindStringSubmatch(string(bytes)) |  | ||||||
| 
 |  | ||||||
| 	result := make(map[string]string) | 	result := make(map[string]string) | ||||||
| 	for i, name := range re.SubexpNames() { | 	for i, name := range versionRegex.SubexpNames() { | ||||||
| 		result[name] = matches[i] | 		result[name] = matches[i] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	major, err := strconv.Atoi(result["major"]) | 	// We ignore errors because regex matches only integers
 | ||||||
| 	if err != nil { | 	// If any of the parts does not exist - default "0" will be used
 | ||||||
| 		panic(err) | 	major, _ := strconv.Atoi(result["major"]) | ||||||
| 	} | 	minor, _ := strconv.Atoi(result["minor"]) | ||||||
| 
 | 	patch, _ := strconv.Atoi(result["patch"]) | ||||||
| 	minor, err := strconv.Atoi(result["minor"]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		panic(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	patch, err := strconv.Atoi(result["patch"]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		panic(err) |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	// Support explicit helm3 opt-in via environment variable
 | 	// Support explicit helm3 opt-in via environment variable
 | ||||||
| 	if os.Getenv("HELMFILE_HELM3") != "" && major < 3 { | 	if os.Getenv("HELMFILE_HELM3") != "" && major < 3 { | ||||||
|  | @ -89,21 +77,37 @@ func getHelmVersion(helmBinary string, logger *zap.SugaredLogger, runner Runner) | ||||||
| 			Major: 3, | 			Major: 3, | ||||||
| 			Minor: 0, | 			Minor: 0, | ||||||
| 			Patch: 0, | 			Patch: 0, | ||||||
| 		} | 		}, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return Version{ | 	return Version{ | ||||||
| 		Major: major, | 		Major: major, | ||||||
| 		Minor: minor, | 		Minor: minor, | ||||||
| 		Patch: patch, | 		Patch: patch, | ||||||
|  | 	}, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func getHelmVersion(helmBinary string, runner Runner) (Version, error) { | ||||||
|  | 
 | ||||||
|  | 	// Autodetect from `helm verison`
 | ||||||
|  | 	bytes, err := runner.Execute(helmBinary, []string{"version", "--client", "--short"}, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return Version{}, fmt.Errorf("error determining helm version: %w", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return parseHelmVersion(string(bytes)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // New for running helm commands
 | // New for running helm commands
 | ||||||
| func New(helmBinary string, logger *zap.SugaredLogger, kubeContext string, runner Runner) *execer { | func New(helmBinary string, logger *zap.SugaredLogger, kubeContext string, runner Runner) *execer { | ||||||
|  | 	// TODO: proper error handling
 | ||||||
|  | 	version, err := getHelmVersion(helmBinary, runner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
| 	return &execer{ | 	return &execer{ | ||||||
| 		helmBinary:       helmBinary, | 		helmBinary:       helmBinary, | ||||||
| 		version:          getHelmVersion(helmBinary, logger, runner), | 		version:          version, | ||||||
| 		logger:           logger, | 		logger:           logger, | ||||||
| 		kubeContext:      kubeContext, | 		kubeContext:      kubeContext, | ||||||
| 		runner:           runner, | 		runner:           runner, | ||||||
|  |  | ||||||
|  | @ -570,3 +570,50 @@ func Test_IsVersionAtLeast(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func Test_parseHelmVersion(t *testing.T) { | ||||||
|  | 	tests := []struct { | ||||||
|  | 		ver     string | ||||||
|  | 		want    Version | ||||||
|  | 		wantErr bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			ver: "v1.2.3", | ||||||
|  | 			want: Version{ | ||||||
|  | 				Major: 1, | ||||||
|  | 				Minor: 2, | ||||||
|  | 				Patch: 3, | ||||||
|  | 			}, | ||||||
|  | 			wantErr: false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			ver: "v1.2", | ||||||
|  | 			want: Version{ | ||||||
|  | 				Major: 1, | ||||||
|  | 				Minor: 2, | ||||||
|  | 				Patch: 0, | ||||||
|  | 			}, | ||||||
|  | 			wantErr: false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			ver:     "v1", | ||||||
|  | 			wantErr: true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			ver:     "1.1.1", | ||||||
|  | 			wantErr: true, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		t.Run(tt.ver, func(t *testing.T) { | ||||||
|  | 			got, err := parseHelmVersion(tt.ver) | ||||||
|  | 			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() got = %v, want %v", got, tt.want) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue