diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 088d05106..218ad7c22 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -85,7 +85,7 @@ There are five different ways you can express the chart you want to install: 2. By path to a packaged chart: helm install ./nginx-1.2.3.tgz 3. By path to an unpacked chart directory: helm install ./nginx 4. By absolute URL: helm install https://example.com/charts/nginx-1.2.3.tgz -5. By chart reference and repo url: helm install --repo https://example.com/charts nginx +5. By chart reference and repo url: helm install --repo https://example.com/charts/ nginx CHART REFERENCES @@ -425,22 +425,7 @@ func locateChartPath(repoURL, name, version string, verify bool, keyring, if err != nil { return "", err } - - parsedChartURL, err := url.Parse(chartURL) - if err != nil { - return "", err - } - - if parsedChartURL.IsAbs() { - name = chartURL - } else { - parsedRepoURL, err := url.Parse(repoURL) - if err != nil { - return "", err - } - name = parsedRepoURL.ResolveReference(parsedChartURL).String() - } - + name = chartURL } if _, err := os.Stat(settings.Home.Archive()); os.IsNotExist(err) { @@ -459,7 +444,7 @@ func locateChartPath(repoURL, name, version string, verify bool, keyring, return filename, err } - return filename, fmt.Errorf("file %q not found", name) + return filename, fmt.Errorf("failed to download %q", name) } func generateName(nameTemplate string) (string, error) { diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 6ddb56cee..7e206f721 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -46,7 +46,7 @@ There are five different ways you can express the chart you want to install: 2. By path to a packaged chart: helm install ./nginx-1.2.3.tgz 3. By path to an unpacked chart directory: helm install ./nginx 4. By absolute URL: helm install https://example.com/charts/nginx-1.2.3.tgz -5. By chart reference and repo url: helm install --repo https://example.com/charts nginx +5. By chart reference and repo url: helm install --repo https://example.com/charts/ nginx CHART REFERENCES diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 236032eef..a7e0305c5 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -184,7 +184,7 @@ func (r *ChartRepository) generateIndex() error { } // FindChartInRepoURL finds chart in chart repository pointed by repoURL -// without adding repo to repostiories +// without adding repo to repositories func FindChartInRepoURL(repoURL, chartName, chartVersion, certFile, keyFile, caFile string, getters getter.Providers) (string, error) { // Download and write the index file to a temporary location @@ -227,5 +227,28 @@ func FindChartInRepoURL(repoURL, chartName, chartVersion, certFile, keyFile, caF return "", fmt.Errorf("%s has no downloadable URLs", errMsg) } - return cv.URLs[0], nil + chartURL := cv.URLs[0] + + absoluteChartURL, err := MakeAbsoluteChartURL(repoURL, chartURL) + if err != nil { + return "", err + } + + return absoluteChartURL, nil +} + +// MakeAbsoluteChartURL resolves chartURL relative to repoURL. +// If chartURL is absolute, it returns chartURL. +func MakeAbsoluteChartURL(repoURL, chartURL string) (string, error) { + parsedRepoURL, err := url.Parse(repoURL) + if err != nil { + return "", err + } + + parsedChartURL, err := url.Parse(chartURL) + if err != nil { + return "", err + } + + return parsedRepoURL.ResolveReference(parsedChartURL).String(), nil } diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 9f1bc995a..cc19fd0b0 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -277,3 +277,21 @@ func TestErrorFindChartInRepoURL(t *testing.T) { t.Errorf("Expected error for chart not found, but got a different error (%v)", err) } } + +func TestMakeAbsoluteChartURL(t *testing.T) { + chartURL, err := MakeAbsoluteChartURL("http://localhost:8123/charts/", "nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "http://localhost:8123/charts/nginx-0.2.0.tgz" { + t.Errorf("%s", chartURL) + } + + chartURL, err = MakeAbsoluteChartURL("http://localhost:8123", "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz" { + t.Errorf("%s", chartURL) + } +}