diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index c0eabe0e..49340b3e 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -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 +} diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index c399e663..4f6f1863 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -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) + } + }) + } +}