From 2baeac3d9505b5c8b7ea007a13e115ac73b6cadb Mon Sep 17 00:00:00 2001 From: James Sheppard Date: Sun, 7 May 2023 19:54:45 +0000 Subject: [PATCH] replace as many github error deps as possible from pkg/action Signed-off-by: James Sheppard --- pkg/action/action.go | 15 ++++++++------- pkg/action/history.go | 4 ++-- pkg/action/hooks.go | 9 +++++---- pkg/action/install.go | 17 +++++++++-------- pkg/action/upgrade.go | 29 +++++++++++++++-------------- pkg/action/validate.go | 7 ++++--- 6 files changed, 43 insertions(+), 38 deletions(-) diff --git a/pkg/action/action.go b/pkg/action/action.go index c9a8e4e9e..5eff603fb 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -18,6 +18,7 @@ package action import ( "bytes" + "errors" "fmt" "os" "path" @@ -25,7 +26,7 @@ import ( "regexp" "strings" - "github.com/pkg/errors" + githubErrors "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/discovery" @@ -223,7 +224,7 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu if pr != nil { b, err = pr.Run(b) if err != nil { - return hs, b, notes, errors.Wrap(err, "error while running post render on files") + return hs, b, notes, githubErrors.Wrap(err, "error while running post render on files") } } @@ -247,13 +248,13 @@ func (cfg *Configuration) getCapabilities() (*chartutil.Capabilities, error) { } dc, err := cfg.RESTClientGetter.ToDiscoveryClient() if err != nil { - return nil, errors.Wrap(err, "could not get Kubernetes discovery client") + return nil, githubErrors.Wrap(err, "could not get Kubernetes discovery client") } // force a discovery cache invalidation to always fetch the latest server version/capabilities. dc.Invalidate() kubeVersion, err := dc.ServerVersion() if err != nil { - return nil, errors.Wrap(err, "could not get server version from Kubernetes") + return nil, githubErrors.Wrap(err, "could not get server version from Kubernetes") } // Issue #6361: // Client-Go emits an error when an API service is registered but unimplemented. @@ -266,7 +267,7 @@ func (cfg *Configuration) getCapabilities() (*chartutil.Capabilities, error) { cfg.Log("WARNING: The Kubernetes server has an orphaned API service. Server reports: %s", err) cfg.Log("WARNING: To fix this, kubectl delete apiservice ") } else { - return nil, errors.Wrap(err, "could not get apiVersions from Kubernetes") + return nil, githubErrors.Wrap(err, "could not get apiVersions from Kubernetes") } } @@ -286,7 +287,7 @@ func (cfg *Configuration) getCapabilities() (*chartutil.Capabilities, error) { func (cfg *Configuration) KubernetesClientSet() (kubernetes.Interface, error) { conf, err := cfg.RESTClientGetter.ToRESTConfig() if err != nil { - return nil, errors.Wrap(err, "unable to generate config for kubernetes client") + return nil, githubErrors.Wrap(err, "unable to generate config for kubernetes client") } return kubernetes.NewForConfig(conf) @@ -316,7 +317,7 @@ func (cfg *Configuration) releaseContent(name string, version int) (*release.Rel func GetVersionSet(client discovery.ServerResourcesInterface) (chartutil.VersionSet, error) { groups, resources, err := client.ServerGroupsAndResources() if err != nil && !discovery.IsGroupDiscoveryFailedError(err) { - return chartutil.DefaultVersionSet, errors.Wrap(err, "could not get apiVersions from Kubernetes") + return chartutil.DefaultVersionSet, githubErrors.Wrap(err, "could not get apiVersions from Kubernetes") } // FIXME: The Kubernetes test fixture for cli appears to always return nil diff --git a/pkg/action/history.go b/pkg/action/history.go index 0430aaf7a..125d9a317 100644 --- a/pkg/action/history.go +++ b/pkg/action/history.go @@ -17,7 +17,7 @@ limitations under the License. package action import ( - "github.com/pkg/errors" + "fmt" "helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/release" @@ -50,7 +50,7 @@ func (h *History) Run(name string) ([]*release.Release, error) { } if err := chartutil.ValidateReleaseName(name); err != nil { - return nil, errors.Errorf("release name is invalid: %s", name) + return nil, fmt.Errorf("release name is invalid: %s", name) } h.cfg.Log("getting history for release %s", name) diff --git a/pkg/action/hooks.go b/pkg/action/hooks.go index 40c1ffdb6..49d3d35ee 100644 --- a/pkg/action/hooks.go +++ b/pkg/action/hooks.go @@ -17,10 +17,11 @@ package action import ( "bytes" + "errors" "sort" "time" - "github.com/pkg/errors" + githubErrors "github.com/pkg/errors" "helm.sh/helm/v3/pkg/release" helmtime "helm.sh/helm/v3/pkg/time" @@ -57,7 +58,7 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, resources, err := cfg.KubeClient.Build(bytes.NewBufferString(h.Manifest), true) if err != nil { - return errors.Wrapf(err, "unable to build kubernetes object for %s hook %s", hook, h.Path) + return githubErrors.Wrapf(err, "unable to build kubernetes object for %s hook %s", hook, h.Path) } // Record the time at which the hook was applied to the cluster @@ -76,7 +77,7 @@ func (cfg *Configuration) execHook(rl *release.Release, hook release.HookEvent, if _, err := cfg.KubeClient.Create(resources); err != nil { h.LastRun.CompletedAt = helmtime.Now() h.LastRun.Phase = release.HookPhaseFailed - return errors.Wrapf(err, "warning: Hook %s %s failed", hook, h.Path) + return githubErrors.Wrapf(err, "warning: Hook %s %s failed", hook, h.Path) } // Watch hook resources until they have completed @@ -129,7 +130,7 @@ func (cfg *Configuration) deleteHookByPolicy(h *release.Hook, policy release.Hoo if hookHasDeletePolicy(h, policy) { resources, err := cfg.KubeClient.Build(bytes.NewBufferString(h.Manifest), false) if err != nil { - return errors.Wrapf(err, "unable to build kubernetes object for deleting hook %s", h.Path) + return githubErrors.Wrapf(err, "unable to build kubernetes object for deleting hook %s", h.Path) } _, errs := cfg.KubeClient.Delete(resources) if len(errs) > 0 { diff --git a/pkg/action/install.go b/pkg/action/install.go index f9d56505e..f985844ff 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -19,6 +19,7 @@ package action import ( "bytes" "context" + "errors" "fmt" "io" "net/url" @@ -31,7 +32,7 @@ import ( "time" "github.com/Masterminds/sprig/v3" - "github.com/pkg/errors" + githubErrors "github.com/pkg/errors" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -149,7 +150,7 @@ func (i *Install) installCRDs(crds []chart.CRD) error { // Read in the resources res, err := i.cfg.KubeClient.Build(bytes.NewBuffer(obj.File.Data), false) if err != nil { - return errors.Wrapf(err, "failed to install CRD %s", obj.Name) + return githubErrors.Wrapf(err, "failed to install CRD %s", obj.Name) } // Send them to Kube @@ -160,7 +161,7 @@ func (i *Install) installCRDs(crds []chart.CRD) error { i.cfg.Log("CRD %s is already present. Skipping.", crdName) continue } - return errors.Wrapf(err, "failed to install CRD %s", obj.Name) + return githubErrors.Wrapf(err, "failed to install CRD %s", obj.Name) } totalItems = append(totalItems, res...) } @@ -299,7 +300,7 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma var toBeAdopted kube.ResourceList resources, err := i.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), !i.DisableOpenAPIValidation) if err != nil { - return nil, errors.Wrap(err, "unable to build kubernetes objects from release manifest") + return nil, githubErrors.Wrap(err, "unable to build kubernetes objects from release manifest") } // It is safe to use "force" here because these are resources currently rendered by the chart. @@ -317,7 +318,7 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma if !i.ClientOnly && !isUpgrade && len(resources) > 0 { toBeAdopted, err = existingResourceConflict(resources, rel.Name, rel.Namespace) if err != nil { - return nil, errors.Wrap(err, "rendered manifests contain a resource that already exists. Unable to continue with install") + return nil, githubErrors.Wrap(err, "rendered manifests contain a resource that already exists. Unable to continue with install") } } @@ -473,9 +474,9 @@ func (i *Install) failRelease(rel *release.Release, err error) (*release.Release uninstall.KeepHistory = false uninstall.Timeout = i.Timeout if _, uninstallErr := uninstall.Run(i.ReleaseName); uninstallErr != nil { - return rel, errors.Wrapf(uninstallErr, "an error occurred while uninstalling the release. original install error: %s", err) + return rel, githubErrors.Wrapf(uninstallErr, "an error occurred while uninstalling the release. original install error: %s", err) } - return rel, errors.Wrapf(err, "release %s failed, and has been uninstalled due to atomic being set", i.ReleaseName) + return rel, githubErrors.Wrapf(err, "release %s failed, and has been uninstalled due to atomic being set", i.ReleaseName) } i.recordRelease(rel) // Ignore the error, since we have another error to deal with. return rel, err @@ -493,7 +494,7 @@ func (i *Install) availableName() error { start := i.ReleaseName if err := chartutil.ValidateReleaseName(start); err != nil { - return errors.Wrapf(err, "release name %q", start) + return githubErrors.Wrapf(err, "release name %q", start) } if i.DryRun { return nil diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index 8f4c6cd3b..ce963e88d 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -19,12 +19,13 @@ package action import ( "bytes" "context" + "errors" "fmt" "strings" "sync" "time" - "github.com/pkg/errors" + githubErrors "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/cli-runtime/pkg/resource" @@ -274,15 +275,15 @@ func (u *Upgrade) performUpgrade(ctx context.Context, originalRelease, upgradedR // Checking for removed Kubernetes API error so can provide a more informative error message to the user // Ref: https://github.com/helm/helm/issues/7219 if strings.Contains(err.Error(), "unable to recognize \"\": no matches for kind") { - return upgradedRelease, errors.Wrap(err, "current release manifest contains removed kubernetes api(s) for this "+ + return upgradedRelease, githubErrors.Wrap(err, "current release manifest contains removed kubernetes api(s) for this "+ "kubernetes version and it is therefore unable to build the kubernetes "+ "objects for performing the diff. error from kubernetes") } - return upgradedRelease, errors.Wrap(err, "unable to build kubernetes objects from current release manifest") + return upgradedRelease, githubErrors.Wrap(err, "unable to build kubernetes objects from current release manifest") } target, err := u.cfg.KubeClient.Build(bytes.NewBufferString(upgradedRelease.Manifest), !u.DisableOpenAPIValidation) if err != nil { - return upgradedRelease, errors.Wrap(err, "unable to build kubernetes objects from new release manifest") + return upgradedRelease, githubErrors.Wrap(err, "unable to build kubernetes objects from new release manifest") } // It is safe to use force only on target because these are resources currently rendered by the chart. @@ -306,7 +307,7 @@ func (u *Upgrade) performUpgrade(ctx context.Context, originalRelease, upgradedR toBeUpdated, err := existingResourceConflict(toBeCreated, upgradedRelease.Name, upgradedRelease.Namespace) if err != nil { - return nil, errors.Wrap(err, "rendered manifests contain a resource that already exists. Unable to continue with update") + return nil, githubErrors.Wrap(err, "rendered manifests contain a resource that already exists. Unable to continue with update") } toBeUpdated.Visit(func(r *resource.Info, err error) error { @@ -452,7 +453,7 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e for _, e := range errs { errorList = append(errorList, e.Error()) } - return rel, errors.Wrapf(fmt.Errorf("unable to cleanup resources: %s", strings.Join(errorList, ", ")), "an error occurred while cleaning up resources. original upgrade error: %s", err) + return rel, githubErrors.Wrapf(fmt.Errorf("unable to cleanup resources: %s", strings.Join(errorList, ", ")), "an error occurred while cleaning up resources. original upgrade error: %s", err) } u.cfg.Log("Resource cleanup complete") } @@ -464,7 +465,7 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e hist := NewHistory(u.cfg) fullHistory, herr := hist.Run(rel.Name) if herr != nil { - return rel, errors.Wrapf(herr, "an error occurred while finding last successful release. original upgrade error: %s", err) + return rel, githubErrors.Wrapf(herr, "an error occurred while finding last successful release. original upgrade error: %s", err) } // There isn't a way to tell if a previous release was successful, but @@ -474,7 +475,7 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e return r.Info.Status == release.StatusSuperseded || r.Info.Status == release.StatusDeployed }).Filter(fullHistory) if len(filteredHistory) == 0 { - return rel, errors.Wrap(err, "unable to find a previously successful release when attempting to rollback. original upgrade error") + return rel, githubErrors.Wrap(err, "unable to find a previously successful release when attempting to rollback. original upgrade error") } releaseutil.Reverse(filteredHistory, releaseutil.SortByRevision) @@ -488,9 +489,9 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e rollin.Force = u.Force rollin.Timeout = u.Timeout if rollErr := rollin.Run(rel.Name); rollErr != nil { - return rel, errors.Wrapf(rollErr, "an error occurred while rolling back the release. original upgrade error: %s", err) + return rel, githubErrors.Wrapf(rollErr, "an error occurred while rolling back the release. original upgrade error: %s", err) } - return rel, errors.Wrapf(err, "release %s failed, and has been rolled back due to atomic being set", rel.Name) + return rel, githubErrors.Wrapf(err, "release %s failed, and has been rolled back due to atomic being set", rel.Name) } return rel, err @@ -518,7 +519,7 @@ func (u *Upgrade) reuseValues(chart *chart.Chart, current *release.Release, newV // We have to regenerate the old coalesced values: oldVals, err := chartutil.CoalesceValues(current.Chart, current.Config) if err != nil { - return nil, errors.Wrap(err, "failed to rebuild old values") + return nil, githubErrors.Wrap(err, "failed to rebuild old values") } newVals = chartutil.CoalesceTables(newVals, current.Config) @@ -555,21 +556,21 @@ func recreate(cfg *Configuration, resources kube.ResourceList) error { client, err := cfg.KubernetesClientSet() if err != nil { - return errors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) + return githubErrors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) } pods, err := client.CoreV1().Pods(res.Namespace).List(context.Background(), metav1.ListOptions{ LabelSelector: selector.String(), }) if err != nil { - return errors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) + return githubErrors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) } // Restart pods for _, pod := range pods.Items { // Delete each pod for get them restarted with changed spec. if err := client.CoreV1().Pods(pod.Namespace).Delete(context.Background(), pod.Name, *metav1.NewPreconditionDeleteOptions(string(pod.UID))); err != nil { - return errors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) + return githubErrors.Wrapf(err, "unable to recreate pods for object %s/%s because an error occurred", res.Namespace, res.Name) } } } diff --git a/pkg/action/validate.go b/pkg/action/validate.go index 73eb1937b..c67f25134 100644 --- a/pkg/action/validate.go +++ b/pkg/action/validate.go @@ -17,9 +17,10 @@ limitations under the License. package action import ( + "errors" "fmt" - "github.com/pkg/errors" + githubErrors "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" @@ -51,7 +52,7 @@ func existingResourceConflict(resources kube.ResourceList, releaseName, releaseN if apierrors.IsNotFound(err) { return nil } - return errors.Wrapf(err, "could not get information about the resource %s", resourceString(info)) + return githubErrors.Wrapf(err, "could not get information about the resource %s", resourceString(info)) } // Allow adoption of the resource if it is managed by Helm and is annotated with correct release name and namespace. @@ -88,7 +89,7 @@ func checkOwnership(obj runtime.Object, releaseName, releaseNamespace string) er } if len(errs) > 0 { - err := errors.New("invalid ownership metadata") + err := githubErrors.New("invalid ownership metadata") for _, e := range errs { err = fmt.Errorf("%w; %s", err, e) }