From 16828956360910fd5ce8fbaf95f4fa8d0e7fadc5 Mon Sep 17 00:00:00 2001 From: Stephen Murray Date: Tue, 22 Apr 2025 20:19:34 +0100 Subject: [PATCH] ref(helm): Export Chart Not Found error Closes #30746 Signed-off-by: Stephen Murray --- pkg/repo/chartrepo.go | 5 ++++- pkg/repo/chartrepo_test.go | 4 ++++ pkg/repo/error.go | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 pkg/repo/error.go diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 2667dc2b1..3b9f2bfea 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -219,7 +219,10 @@ func FindChartInRepoURL(repoURL string, chartName string, getters getter.Provide } cv, err := repoIndex.Get(chartName, opts.ChartVersion) if err != nil { - return "", errors.Errorf("%s not found in %s repository", errMsg, repoURL) + return "", ChartNotFoundError{ + Chart: errMsg, + RepoURL: repoURL, + } } if len(cv.URLs) == 0 { diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 41bac9827..c29c95a7e 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -18,6 +18,7 @@ package repo import ( "bytes" + "errors" "net/http" "net/http/httptest" "os" @@ -202,6 +203,9 @@ func TestErrorFindChartInRepoURL(t *testing.T) { } else if err.Error() != `chart "nginx1" not found in `+srv.URL+` repository` { t.Errorf("Expected error for chart not found, but got a different error (%v)", err) } + if !errors.Is(err, ChartNotFoundError{}) { + t.Errorf("error is not of correct error type structure") + } if _, err = FindChartInRepoURL(srv.URL, "nginx1", g, WithChartVersion("0.1.0")); err == nil { t.Errorf("Expected error for chart not found, but did not get any errors") diff --git a/pkg/repo/error.go b/pkg/repo/error.go new file mode 100644 index 000000000..16264ed26 --- /dev/null +++ b/pkg/repo/error.go @@ -0,0 +1,35 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package repo + +import ( + "fmt" +) + +type ChartNotFoundError struct { + RepoURL string + Chart string +} + +func (e ChartNotFoundError) Error() string { + return fmt.Sprintf("%s not found in %s repository", e.Chart, e.RepoURL) +} + +func (e ChartNotFoundError) Is(err error) bool { + _, ok := err.(ChartNotFoundError) + return ok +}