replace as many github error deps as possible from pkg/action

Signed-off-by: James Sheppard <jgsheppa@protonmail.com>
pull/12063/head
James Sheppard 2 years ago
parent 5a1c5f737c
commit 2baeac3d95

@ -18,6 +18,7 @@ package action
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"os" "os"
"path" "path"
@ -25,7 +26,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"github.com/pkg/errors" githubErrors "github.com/pkg/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"
@ -223,7 +224,7 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu
if pr != nil { if pr != nil {
b, err = pr.Run(b) b, err = pr.Run(b)
if err != nil { 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() dc, err := cfg.RESTClientGetter.ToDiscoveryClient()
if err != nil { 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. // force a discovery cache invalidation to always fetch the latest server version/capabilities.
dc.Invalidate() dc.Invalidate()
kubeVersion, err := dc.ServerVersion() kubeVersion, err := dc.ServerVersion()
if err != nil { 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: // Issue #6361:
// Client-Go emits an error when an API service is registered but unimplemented. // 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: The Kubernetes server has an orphaned API service. Server reports: %s", err)
cfg.Log("WARNING: To fix this, kubectl delete apiservice <service-name>") cfg.Log("WARNING: To fix this, kubectl delete apiservice <service-name>")
} else { } 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) { func (cfg *Configuration) KubernetesClientSet() (kubernetes.Interface, error) {
conf, err := cfg.RESTClientGetter.ToRESTConfig() conf, err := cfg.RESTClientGetter.ToRESTConfig()
if err != nil { 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) 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) { func GetVersionSet(client discovery.ServerResourcesInterface) (chartutil.VersionSet, error) {
groups, resources, err := client.ServerGroupsAndResources() groups, resources, err := client.ServerGroupsAndResources()
if err != nil && !discovery.IsGroupDiscoveryFailedError(err) { 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 // FIXME: The Kubernetes test fixture for cli appears to always return nil

@ -17,7 +17,7 @@ limitations under the License.
package action package action
import ( import (
"github.com/pkg/errors" "fmt"
"helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/chartutil"
"helm.sh/helm/v3/pkg/release" "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 { 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) h.cfg.Log("getting history for release %s", name)

@ -17,10 +17,11 @@ package action
import ( import (
"bytes" "bytes"
"errors"
"sort" "sort"
"time" "time"
"github.com/pkg/errors" githubErrors "github.com/pkg/errors"
"helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/release"
helmtime "helm.sh/helm/v3/pkg/time" 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) resources, err := cfg.KubeClient.Build(bytes.NewBufferString(h.Manifest), true)
if err != nil { 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 // 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 { if _, err := cfg.KubeClient.Create(resources); err != nil {
h.LastRun.CompletedAt = helmtime.Now() h.LastRun.CompletedAt = helmtime.Now()
h.LastRun.Phase = release.HookPhaseFailed 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 // 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) { if hookHasDeletePolicy(h, policy) {
resources, err := cfg.KubeClient.Build(bytes.NewBufferString(h.Manifest), false) resources, err := cfg.KubeClient.Build(bytes.NewBufferString(h.Manifest), false)
if err != nil { 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) _, errs := cfg.KubeClient.Delete(resources)
if len(errs) > 0 { if len(errs) > 0 {

@ -19,6 +19,7 @@ package action
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"net/url" "net/url"
@ -31,7 +32,7 @@ import (
"time" "time"
"github.com/Masterminds/sprig/v3" "github.com/Masterminds/sprig/v3"
"github.com/pkg/errors" githubErrors "github.com/pkg/errors"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -149,7 +150,7 @@ func (i *Install) installCRDs(crds []chart.CRD) error {
// Read in the resources // Read in the resources
res, err := i.cfg.KubeClient.Build(bytes.NewBuffer(obj.File.Data), false) res, err := i.cfg.KubeClient.Build(bytes.NewBuffer(obj.File.Data), false)
if err != nil { 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 // 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) i.cfg.Log("CRD %s is already present. Skipping.", crdName)
continue 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...) totalItems = append(totalItems, res...)
} }
@ -299,7 +300,7 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma
var toBeAdopted kube.ResourceList var toBeAdopted kube.ResourceList
resources, err := i.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), !i.DisableOpenAPIValidation) resources, err := i.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), !i.DisableOpenAPIValidation)
if err != nil { 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. // 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 { if !i.ClientOnly && !isUpgrade && len(resources) > 0 {
toBeAdopted, err = existingResourceConflict(resources, rel.Name, rel.Namespace) toBeAdopted, err = existingResourceConflict(resources, rel.Name, rel.Namespace)
if err != nil { 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.KeepHistory = false
uninstall.Timeout = i.Timeout uninstall.Timeout = i.Timeout
if _, uninstallErr := uninstall.Run(i.ReleaseName); uninstallErr != nil { 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. i.recordRelease(rel) // Ignore the error, since we have another error to deal with.
return rel, err return rel, err
@ -493,7 +494,7 @@ func (i *Install) availableName() error {
start := i.ReleaseName start := i.ReleaseName
if err := chartutil.ValidateReleaseName(start); err != nil { 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 { if i.DryRun {
return nil return nil

@ -19,12 +19,13 @@ package action
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/pkg/errors" githubErrors "github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/resource" "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 // 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 // Ref: https://github.com/helm/helm/issues/7219
if strings.Contains(err.Error(), "unable to recognize \"\": no matches for kind") { 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 "+ "kubernetes version and it is therefore unable to build the kubernetes "+
"objects for performing the diff. error from 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) target, err := u.cfg.KubeClient.Build(bytes.NewBufferString(upgradedRelease.Manifest), !u.DisableOpenAPIValidation)
if err != nil { 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. // 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) toBeUpdated, err := existingResourceConflict(toBeCreated, upgradedRelease.Name, upgradedRelease.Namespace)
if err != nil { 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 { 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 { for _, e := range errs {
errorList = append(errorList, e.Error()) 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") 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) hist := NewHistory(u.cfg)
fullHistory, herr := hist.Run(rel.Name) fullHistory, herr := hist.Run(rel.Name)
if herr != nil { 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 // 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 return r.Info.Status == release.StatusSuperseded || r.Info.Status == release.StatusDeployed
}).Filter(fullHistory) }).Filter(fullHistory)
if len(filteredHistory) == 0 { 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) 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.Force = u.Force
rollin.Timeout = u.Timeout rollin.Timeout = u.Timeout
if rollErr := rollin.Run(rel.Name); rollErr != nil { 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 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: // We have to regenerate the old coalesced values:
oldVals, err := chartutil.CoalesceValues(current.Chart, current.Config) oldVals, err := chartutil.CoalesceValues(current.Chart, current.Config)
if err != nil { 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) newVals = chartutil.CoalesceTables(newVals, current.Config)
@ -555,21 +556,21 @@ func recreate(cfg *Configuration, resources kube.ResourceList) error {
client, err := cfg.KubernetesClientSet() client, err := cfg.KubernetesClientSet()
if err != nil { 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{ pods, err := client.CoreV1().Pods(res.Namespace).List(context.Background(), metav1.ListOptions{
LabelSelector: selector.String(), LabelSelector: selector.String(),
}) })
if err != nil { 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 // Restart pods
for _, pod := range pods.Items { for _, pod := range pods.Items {
// Delete each pod for get them restarted with changed spec. // 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 { 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)
} }
} }
} }

@ -17,9 +17,10 @@ limitations under the License.
package action package action
import ( import (
"errors"
"fmt" "fmt"
"github.com/pkg/errors" githubErrors "github.com/pkg/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
@ -51,7 +52,7 @@ func existingResourceConflict(resources kube.ResourceList, releaseName, releaseN
if apierrors.IsNotFound(err) { if apierrors.IsNotFound(err) {
return nil 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. // 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 { if len(errs) > 0 {
err := errors.New("invalid ownership metadata") err := githubErrors.New("invalid ownership metadata")
for _, e := range errs { for _, e := range errs {
err = fmt.Errorf("%w; %s", err, e) err = fmt.Errorf("%w; %s", err, e)
} }

Loading…
Cancel
Save