fix: OCI Url and Version parse error
Signed-off-by: xiaomudk <xiaomudk@gmail.com>
This commit is contained in:
		
							parent
							
								
									6dc1736f15
								
							
						
					
					
						commit
						59ffa687df
					
				|  | @ -423,9 +423,7 @@ func (helm *execer) ChartPull(chart string, flags ...string) error { | |||
| 	helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0") | ||||
| 	var helmArgs []string | ||||
| 	if helmVersionConstraint.Check(&helm.version) { | ||||
| 		ociChartURLSplit := strings.Split(chart, ":") | ||||
| 		ociChartURL := fmt.Sprintf("oci://%s", ociChartURLSplit[0]) | ||||
| 		ociChartTag := ociChartURLSplit[1] | ||||
| 		ociChartURL, ociChartTag := resolveOciChart(chart) | ||||
| 		tempDir, err := os.MkdirTemp("", "chart*") | ||||
| 		if err != nil { | ||||
| 			return err | ||||
|  | @ -447,9 +445,7 @@ func (helm *execer) ChartExport(chart string, path string, flags ...string) erro | |||
| 	helmVersionConstraint, _ := semver.NewConstraint(">= 3.7.0") | ||||
| 	var helmArgs []string | ||||
| 	if helmVersionConstraint.Check(&helm.version) { | ||||
| 		ociChartURLSplit := strings.Split(chart, ":") | ||||
| 		ociChartURL := fmt.Sprintf("oci://%s", ociChartURLSplit[0]) | ||||
| 		ociChartTag := ociChartURLSplit[1] | ||||
| 		ociChartURL, ociChartTag := resolveOciChart(chart) | ||||
| 		helmArgs = []string{"pull", ociChartURL, "--version", ociChartTag, "--untar"} | ||||
| 	} else { | ||||
| 		helmArgs = []string{"chart", "export", chart} | ||||
|  | @ -546,3 +542,21 @@ func (helm *execer) IsVersionAtLeast(versionStr string) bool { | |||
| 	ver := semver.MustParse(versionStr) | ||||
| 	return helm.version.Equal(ver) || helm.version.GreaterThan(ver) | ||||
| } | ||||
| 
 | ||||
| func resolveOciChart(ociChart string) (ociChartURL, ociChartTag string) { | ||||
| 	var urlTagIndex int | ||||
| 	// Get the last : index
 | ||||
| 	// e.g.,
 | ||||
| 	// 1. registry:443/helm-charts
 | ||||
| 	// 2. registry/helm-charts:latest
 | ||||
| 	// 3. registry:443/helm-charts:latest
 | ||||
| 	if strings.LastIndex(ociChart, ":") <= strings.LastIndex(ociChart, "/") { | ||||
| 		urlTagIndex = len(ociChart) | ||||
| 		ociChartTag = "" | ||||
| 	} else { | ||||
| 		urlTagIndex = strings.LastIndex(ociChart, ":") | ||||
| 		ociChartTag = ociChart[urlTagIndex+1:] | ||||
| 	} | ||||
| 	ociChartURL = fmt.Sprintf("oci://%s", ociChart[:urlTagIndex]) | ||||
| 	return ociChartURL, ociChartTag | ||||
| } | ||||
|  |  | |||
|  | @ -843,3 +843,42 @@ func Test_IsVersionAtLeast(t *testing.T) { | |||
| 		t.Error("helmexec.IsVersionAtLeast - 2.16.1 is atleast 3.2") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Test_resolveOciChart(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		name        string | ||||
| 		chartPath   string | ||||
| 		ociChartURL string | ||||
| 		ociChartTag string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name:        "normal", | ||||
| 			chartPath:   "chart/nginx:v1", | ||||
| 			ociChartURL: "oci://chart/nginx", | ||||
| 			ociChartTag: "v1", | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:        "contains the port", | ||||
| 			chartPath:   "chart:5000/nginx:v1", | ||||
| 			ociChartURL: "oci://chart:5000/nginx", | ||||
| 			ociChartTag: "v1", | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:        "no tag", | ||||
| 			chartPath:   "chart:5000/nginx", | ||||
| 			ociChartURL: "oci://chart:5000/nginx", | ||||
| 			ociChartTag: "", | ||||
| 		}, | ||||
| 	} | ||||
| 	for i := range tests { | ||||
| 		tt := tests[i] | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			url, tag := resolveOciChart(tt.chartPath) | ||||
| 			if tt.ociChartURL != url || tt.ociChartTag != tag { | ||||
| 				actual := fmt.Sprintf("ociChartURL->%s  ociChartTag->%s", url, tag) | ||||
| 				expected := fmt.Sprintf("ociChartURL->%s ociChartTag->%s", tt.ociChartURL, tt.ociChartTag) | ||||
| 				t.Errorf("resolveOciChart()\nactual = %v\nexpect = %v", actual, expected) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue