From be5713a703a4578ed90c0c5139fc33e4172317cb Mon Sep 17 00:00:00 2001 From: Jim Minter Date: Thu, 27 Oct 2022 12:13:32 -0500 Subject: [PATCH] move github.com/pkg/errors -> errors (#339) --- .../clusterresourceplacement_webhook.go | 5 ++- cmd/memberagent/main.go | 14 ++++----- go.mod | 2 +- pkg/authtoken/providers/azure/azure_msi.go | 6 ++-- pkg/authtoken/providers/secret/k8s_secret.go | 5 ++- pkg/authtoken/token_writer.go | 4 +-- .../cluster_selector.go | 9 +++--- .../placement_controller.go | 2 +- .../resource_selector.go | 29 +++++++++-------- .../work_propagation.go | 13 ++++---- .../member_controller.go | 6 ++-- .../member_controller_test.go | 2 +- .../membercluster/membercluster_controller.go | 31 +++++++++---------- .../resourcechange_controller.go | 7 ++--- pkg/controllers/work/apply_controller_test.go | 2 +- pkg/controllers/work/patch_util.go | 7 +++-- pkg/utils/common.go | 7 ++--- .../validator/clusterresourceplacement.go | 5 ++- 18 files changed, 74 insertions(+), 82 deletions(-) diff --git a/apis/v1alpha1/clusterresourceplacement_webhook.go b/apis/v1alpha1/clusterresourceplacement_webhook.go index f31b3f161..f95ddc11e 100644 --- a/apis/v1alpha1/clusterresourceplacement_webhook.go +++ b/apis/v1alpha1/clusterresourceplacement_webhook.go @@ -8,7 +8,6 @@ package v1alpha1 import ( "fmt" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -53,7 +52,7 @@ func ValidateClusterResourcePlacement(clusterResourcePlacement *ClusterResourceP allErr = append(allErr, fmt.Errorf("the labelSelector and name fields are mutually exclusive in selector %+v", selector)) } if _, err := metav1.LabelSelectorAsSelector(selector.LabelSelector); err != nil { - allErr = append(allErr, errors.Wrap(err, fmt.Sprintf("the labelSelector in resource selector %+v is invalid", selector))) + allErr = append(allErr, fmt.Errorf("the labelSelector in resource selector %+v is invalid: %w", selector, err)) } } } @@ -62,7 +61,7 @@ func ValidateClusterResourcePlacement(clusterResourcePlacement *ClusterResourceP clusterResourcePlacement.Spec.Policy.Affinity.ClusterAffinity != nil { for _, selector := range clusterResourcePlacement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms { if _, err := metav1.LabelSelectorAsSelector(&selector.LabelSelector); err != nil { - allErr = append(allErr, errors.Wrap(err, fmt.Sprintf("the labelSelector in cluster selector %+v is invalid", selector))) + allErr = append(allErr, fmt.Errorf("the labelSelector in cluster selector %+v is invalid: %w", selector, err)) } } } diff --git a/cmd/memberagent/main.go b/cmd/memberagent/main.go index 79cf54af5..24cf6edc2 100644 --- a/cmd/memberagent/main.go +++ b/cmd/memberagent/main.go @@ -9,12 +9,12 @@ package main import ( "context" "encoding/base64" + "errors" "flag" "fmt" "os" "time" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/runtime" utilrand "k8s.io/apimachinery/pkg/util/rand" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -79,7 +79,7 @@ func main() { mcName := os.Getenv("MEMBER_CLUSTER_NAME") if mcName == "" { - klog.ErrorS(errors.New("Member cluster name cannot be empty"), "error has occurred retrieving MEMBER_CLUSTER_NAME") + klog.ErrorS(errors.New("member cluster name cannot be empty"), "error has occurred retrieving MEMBER_CLUSTER_NAME") os.Exit(1) } @@ -163,12 +163,12 @@ func main() { func Start(ctx context.Context, hubCfg, memberConfig *rest.Config, hubOpts, memberOpts ctrl.Options) error { hubMgr, err := ctrl.NewManager(hubCfg, hubOpts) if err != nil { - return errors.Wrap(err, "unable to start hub manager") + return fmt.Errorf("unable to start hub manager: %w", err) } memberMgr, err := ctrl.NewManager(memberConfig, memberOpts) if err != nil { - return errors.Wrap(err, "unable to start member manager") + return fmt.Errorf("unable to start member manager: %w", err) } if err := hubMgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { @@ -214,7 +214,7 @@ func Start(ctx context.Context, hubCfg, memberConfig *rest.Config, hubOpts, memb } if err = internalmembercluster.NewReconciler(hubMgr.GetClient(), memberMgr.GetClient(), workController).SetupWithManager(hubMgr); err != nil { - return errors.Wrap(err, "unable to create controller hub_member") + return fmt.Errorf("unable to create controller hub_member: %w", err) } klog.V(3).InfoS("starting hub manager") @@ -223,7 +223,7 @@ func Start(ctx context.Context, hubCfg, memberConfig *rest.Config, hubOpts, memb defer klog.V(3).InfoS("shutting down hub manager") err := hubMgr.Start(ctx) if err != nil { - startErr <- errors.Wrap(err, "problem starting hub manager") + startErr <- fmt.Errorf("problem starting hub manager: %w", err) return } }() @@ -231,7 +231,7 @@ func Start(ctx context.Context, hubCfg, memberConfig *rest.Config, hubOpts, memb klog.V(3).InfoS("starting member manager") defer klog.V(3).InfoS("shutting down member manager") if err := memberMgr.Start(ctx); err != nil { - return errors.Wrap(err, "problem starting member manager") + return fmt.Errorf("problem starting member manager: %w", err) } return nil diff --git a/go.mod b/go.mod index d45b406cb..caec03fe4 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/onsi/ginkgo/v2 v2.1.6 github.com/onsi/gomega v1.20.1 github.com/openkruise/kruise v1.2.0 - github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.12.1 github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 @@ -65,6 +64,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect diff --git a/pkg/authtoken/providers/azure/azure_msi.go b/pkg/authtoken/providers/azure/azure_msi.go index fd8909135..c01d7f7a1 100644 --- a/pkg/authtoken/providers/azure/azure_msi.go +++ b/pkg/authtoken/providers/azure/azure_msi.go @@ -6,11 +6,11 @@ package azure import ( "context" + "fmt" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" - "github.com/pkg/errors" "k8s.io/client-go/util/retry" "k8s.io/klog/v2" @@ -39,7 +39,7 @@ func (a *azureAuthTokenProvider) FetchToken(ctx context.Context) (interfaces.Aut klog.V(2).InfoS("FetchToken", "client ID", a.clientID) credential, err := azidentity.NewManagedIdentityCredential(opts) if err != nil { - return token, errors.Wrap(err, "failed to create managed identity cred") + return token, fmt.Errorf("failed to create managed identity cred: %w", err) } var azToken *azcore.AccessToken err = retry.OnError(retry.DefaultBackoff, @@ -56,7 +56,7 @@ func (a *azureAuthTokenProvider) FetchToken(ctx context.Context) (interfaces.Aut return err }) if err != nil { - return token, errors.Wrap(err, "failed to get a token") + return token, fmt.Errorf("failed to get a token: %w", err) } token.Token = azToken.Token diff --git a/pkg/authtoken/providers/secret/k8s_secret.go b/pkg/authtoken/providers/secret/k8s_secret.go index 8a3afb8cf..850e32fa0 100644 --- a/pkg/authtoken/providers/secret/k8s_secret.go +++ b/pkg/authtoken/providers/secret/k8s_secret.go @@ -9,7 +9,6 @@ import ( "fmt" "time" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/util/retry" @@ -33,7 +32,7 @@ type secretAuthTokenProvider struct { func New(secretName, namespace string) (interfaces.AuthTokenProvider, error) { client, err := getClient() if err != nil { - return nil, errors.Wrapf(err, "an error occurd will creating client") + return nil, fmt.Errorf("an error occurd will creating client: %w", err) } return &secretAuthTokenProvider{ client: client, @@ -47,7 +46,7 @@ func (s *secretAuthTokenProvider) FetchToken(ctx context.Context) (interfaces.Au token := interfaces.AuthToken{} secret, err := s.fetchSecret(ctx) if err != nil { - return token, errors.Wrapf(err, "cannot get the secret") + return token, fmt.Errorf("cannot get the secret: %w", err) } if len(secret.Data[tokenKey]) == 0 { diff --git a/pkg/authtoken/token_writer.go b/pkg/authtoken/token_writer.go index 7a03fee38..c3abbf9eb 100644 --- a/pkg/authtoken/token_writer.go +++ b/pkg/authtoken/token_writer.go @@ -5,10 +5,10 @@ Licensed under the MIT license. package authtoken import ( + "fmt" "io" "os" - "github.com/pkg/errors" "k8s.io/klog/v2" "go.goms.io/fleet/pkg/interfaces" @@ -53,7 +53,7 @@ func (w *Writer) WriteToken(token interfaces.AuthToken) error { }() _, err = io.WriteString(writer, token.Token) if err != nil { - return errors.Wrap(err, "cannot write the refresh token") + return fmt.Errorf("cannot write the refresh token: %w", err) } klog.V(2).InfoS("token has been saved to the file successfully") return nil diff --git a/pkg/controllers/clusterresourceplacement/cluster_selector.go b/pkg/controllers/clusterresourceplacement/cluster_selector.go index adbb4e995..9f6ecef92 100644 --- a/pkg/controllers/clusterresourceplacement/cluster_selector.go +++ b/pkg/controllers/clusterresourceplacement/cluster_selector.go @@ -8,7 +8,6 @@ package clusterresourceplacement import ( "fmt" - "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -66,11 +65,11 @@ func (r *Reconciler) selectClusters(placement *fleetv1alpha1.ClusterResourcePlac for _, clusterSelector := range placement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms { selector, err := metav1.LabelSelectorAsSelector(&clusterSelector.LabelSelector) if err != nil { - return nil, errors.Wrap(err, "cannot convert the label clusterSelector to a clusterSelector") + return nil, fmt.Errorf("cannot convert the label clusterSelector to a clusterSelector: %w", err) } matchClusters, err := r.listClusters(selector) if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("selector = %v", clusterSelector.LabelSelector)) + return nil, fmt.Errorf("selector = %v: %w", clusterSelector.LabelSelector, err) } klog.V(2).InfoS("selector matches some cluster", "clusterNum", len(matchClusters), "placement", placement.Name, "selector", clusterSelector.LabelSelector) for _, clusterName := range matchClusters { @@ -88,7 +87,7 @@ func (r *Reconciler) selectClusters(placement *fleetv1alpha1.ClusterResourcePlac func (r *Reconciler) listClusters(labelSelector labels.Selector) ([]string, error) { objs, err := r.InformerManager.Lister(utils.MemberClusterGVR).List(labelSelector) if err != nil { - return nil, errors.Wrap(err, "failed to list the clusters according to obj label selector") + return nil, fmt.Errorf("failed to list the clusters according to obj label selector: %w", err) } clusterNames := make([]string, 0) @@ -133,7 +132,7 @@ func convertObjToMemberCluster(obj runtime.Object) (*fleetv1alpha1.MemberCluster uObj := obj.DeepCopyObject().(*unstructured.Unstructured) var clusterObj fleetv1alpha1.MemberCluster if err := runtime.DefaultUnstructuredConverter.FromUnstructured(uObj.Object, &clusterObj); err != nil { - return nil, errors.Wrap(err, "cannot decode the member cluster object") + return nil, fmt.Errorf("cannot decode the member cluster object: %w", err) } return &clusterObj, nil } diff --git a/pkg/controllers/clusterresourceplacement/placement_controller.go b/pkg/controllers/clusterresourceplacement/placement_controller.go index 61cf84da7..5026cef92 100644 --- a/pkg/controllers/clusterresourceplacement/placement_controller.go +++ b/pkg/controllers/clusterresourceplacement/placement_controller.go @@ -7,10 +7,10 @@ package clusterresourceplacement import ( "context" + "errors" "fmt" "time" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/controllers/clusterresourceplacement/resource_selector.go b/pkg/controllers/clusterresourceplacement/resource_selector.go index 4cc580a13..9a3ada500 100644 --- a/pkg/controllers/clusterresourceplacement/resource_selector.go +++ b/pkg/controllers/clusterresourceplacement/resource_selector.go @@ -11,7 +11,6 @@ import ( "sort" "strings" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -79,7 +78,7 @@ func (r *Reconciler) gatherSelectedResource(ctx context.Context, placement *flee objs, err = r.fetchClusterScopedResources(ctx, selector, placement.GetName()) } if err != nil { - return nil, errors.Wrapf(err, "selector = %v", selector) + return nil, fmt.Errorf("selector = %v: %w", selector, err) } resources = append(resources, objs...) } @@ -112,7 +111,7 @@ func (r *Reconciler) fetchClusterScopedResources(ctx context.Context, selector f } restMapping, err := r.RestMapper.RESTMapping(gk, selector.Version) if err != nil { - return nil, errors.Wrap(err, "Failed to get GVR of the selector") + return nil, fmt.Errorf("failed to get GVR of the selector: %w", err) } gvr := restMapping.Resource gvk := schema.GroupVersionKind{ @@ -121,10 +120,10 @@ func (r *Reconciler) fetchClusterScopedResources(ctx context.Context, selector f Kind: selector.Kind, } if !r.InformerManager.IsClusterScopedResources(gvk) { - return nil, errors.New(fmt.Sprintf("%+v is not a cluster scoped resource", restMapping.Resource)) + return nil, fmt.Errorf("%+v is not a cluster scoped resource", restMapping.Resource) } if !r.InformerManager.IsInformerSynced(gvr) { - return nil, errors.New(fmt.Sprintf("informer cache for %+v is not synced yet", restMapping.Resource)) + return nil, fmt.Errorf("informer cache for %+v is not synced yet", restMapping.Resource) } lister := r.InformerManager.Lister(gvr) @@ -152,13 +151,13 @@ func (r *Reconciler) fetchClusterScopedResources(ctx context.Context, selector f // TODO: validator should enforce the validity of the labelSelector labelSelector, err = metav1.LabelSelectorAsSelector(selector.LabelSelector) if err != nil { - return nil, errors.Wrap(err, "cannot convert the label selector to a selector") + return nil, fmt.Errorf("cannot convert the label selector to a selector: %w", err) } } var selectedObjs []runtime.Object objects, err := lister.List(labelSelector) if err != nil { - return nil, errors.Wrap(err, "cannot list all the objets") + return nil, fmt.Errorf("cannot list all the objets: %w", err) } // go ahead and claim all objects by adding a finalizer and insert the placement in its annotation for i := 0; i < len(objects); i++ { @@ -198,18 +197,18 @@ func (r *Reconciler) fetchNamespaceResources(ctx context.Context, selector fleet } else { labelSelector, err = metav1.LabelSelectorAsSelector(selector.LabelSelector) if err != nil { - return nil, errors.Wrap(err, "cannot convert the label selector to a selector") + return nil, fmt.Errorf("cannot convert the label selector to a selector: %w", err) } } namespaces, err := r.InformerManager.Lister(utils.NamespaceGVR).List(labelSelector) if err != nil { - return nil, errors.Wrap(err, "cannot list all the namespaces given the label selector") + return nil, fmt.Errorf("cannot list all the namespaces given the label selector: %w", err) } for _, namespace := range namespaces { ns, err := meta.Accessor(namespace) if err != nil { - return nil, errors.Wrap(err, "cannot get the name of a namespace object") + return nil, fmt.Errorf("cannot get the name of a namespace object: %w", err) } objs, err := r.fetchAllResourcesInOneNamespace(ctx, ns.GetName(), placeName) if err != nil { @@ -226,7 +225,7 @@ func (r *Reconciler) fetchAllResourcesInOneNamespace(ctx context.Context, namesp var resources []runtime.Object if !utils.ShouldPropagateNamespace(namespaceName, r.SkippedNamespaces) { - return nil, errors.New(fmt.Sprintf("namespace %s is not allowed to propagate", namespaceName)) + return nil, fmt.Errorf("namespace %s is not allowed to propagate", namespaceName) } klog.V(2).InfoS("start to fetch all the resources inside a namespace", "namespace", namespaceName) @@ -256,13 +255,13 @@ func (r *Reconciler) fetchAllResourcesInOneNamespace(ctx context.Context, namesp lister := r.InformerManager.Lister(gvr) objs, err := lister.ByNamespace(namespaceName).List(labels.Everything()) if err != nil { - return nil, errors.Wrapf(err, "cannot list all the objects of type %+v in namespace %s", gvr, namespaceName) + return nil, fmt.Errorf("cannot list all the objects of type %+v in namespace %s: %w", gvr, namespaceName, err) } for _, obj := range objs { uObj := obj.DeepCopyObject().(*unstructured.Unstructured) shouldInclude, err := utils.ShouldPropagateObj(r.InformerManager, uObj) if err != nil { - return nil, errors.Wrap(err, "cannot determine if we should propagate an object") + return nil, fmt.Errorf("cannot determine if we should propagate an object: %w", err) } if shouldInclude { resources = append(resources, obj) @@ -339,13 +338,13 @@ func generateManifest(object *unstructured.Unstructured) (*workv1alpha1.Manifest } } if err != nil { - return nil, errors.Wrapf(err, "failed to get the ports field in Serivce object, name =%s", object.GetName()) + return nil, fmt.Errorf("failed to get the ports field in Serivce object, name =%s: %w", object.GetName(), err) } } rawContent, err := object.MarshalJSON() if err != nil { - return nil, errors.Wrapf(err, "failed to marshal the unstructured object gvk = %s, name =%s", object.GroupVersionKind(), object.GetName()) + return nil, fmt.Errorf("failed to marshal the unstructured object gvk = %s, name =%s: %w", object.GroupVersionKind(), object.GetName(), err) } return &workv1alpha1.Manifest{ RawExtension: runtime.RawExtension{Raw: rawContent}, diff --git a/pkg/controllers/clusterresourceplacement/work_propagation.go b/pkg/controllers/clusterresourceplacement/work_propagation.go index 467f1b30d..d069ca84a 100644 --- a/pkg/controllers/clusterresourceplacement/work_propagation.go +++ b/pkg/controllers/clusterresourceplacement/work_propagation.go @@ -12,7 +12,6 @@ import ( "reflect" "time" - "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -55,7 +54,7 @@ func (r *Reconciler) scheduleWork(ctx context.Context, placement *fleetv1alpha1. } specHash, err := generateSpecHash(workerSpec.Workload) if err != nil { - return errors.Wrap(err, "failed to calculate the spec hash of the newly generated work resource") + return fmt.Errorf("failed to calculate the spec hash of the newly generated work resource: %w", err) } workLabels := map[string]string{ utils.LabelWorkPlacementName: placement.GetName(), @@ -71,7 +70,7 @@ func (r *Reconciler) scheduleWork(ctx context.Context, placement *fleetv1alpha1. curWork, err := r.getResourceBinding(memberClusterNsName, workName) if err != nil { if !apierrors.IsNotFound(err) { - allErr = append(allErr, errors.Wrap(err, fmt.Sprintf("failed to get the work obj %s in namespace %s", workName, memberClusterName))) + allErr = append(allErr, fmt.Errorf("failed to get the work obj %s in namespace %s: %w", workName, memberClusterName, err)) continue } // create the work CR since it doesn't exist @@ -89,7 +88,7 @@ func (r *Reconciler) scheduleWork(ctx context.Context, placement *fleetv1alpha1. } if createErr := r.Client.Create(ctx, workCR, client.FieldOwner(utils.PlacementFieldManagerName)); createErr != nil { klog.ErrorS(createErr, "failed to create the work", "work", workName, "namespace", memberClusterNsName) - allErr = append(allErr, errors.Wrap(createErr, fmt.Sprintf("failed to create the work obj %s in namespace %s", workName, memberClusterNsName))) + allErr = append(allErr, fmt.Errorf("failed to create the work obj %s in namespace %s: %w", workName, memberClusterNsName, createErr)) continue } klog.V(2).InfoS("created work spec with manifests", @@ -109,7 +108,7 @@ func (r *Reconciler) scheduleWork(ctx context.Context, placement *fleetv1alpha1. curWork.SetOwnerReferences([]metav1.OwnerReference{workerOwnerRef}) curWork.SetAnnotations(workAnnotation) if updateErr := r.Client.Update(ctx, curWork, client.FieldOwner(utils.PlacementFieldManagerName)); updateErr != nil { - allErr = append(allErr, errors.Wrap(updateErr, fmt.Sprintf("failed to update the work obj %s in namespace %s", workName, memberClusterNsName))) + allErr = append(allErr, fmt.Errorf("failed to update the work obj %s in namespace %s: %w", workName, memberClusterNsName, updateErr)) continue } klog.V(2).InfoS("updated work spec with manifests", @@ -143,7 +142,7 @@ func (r *Reconciler) removeStaleWorks(ctx context.Context, placementName string, }, } if deleteErr := r.Client.Delete(ctx, workCR); deleteErr != nil && !apierrors.IsNotFound(deleteErr) { - allErr = append(allErr, errors.Wrap(deleteErr, fmt.Sprintf("failed to delete the work obj %s from namespace %s", workName, memberClusterNsName))) + allErr = append(allErr, fmt.Errorf("failed to delete the work obj %s from namespace %s: %w", workName, memberClusterNsName, deleteErr)) continue } removed++ @@ -170,7 +169,7 @@ func (r *Reconciler) collectAllManifestsStatus(placement *fleetv1alpha1.ClusterR hasPending = true continue } - return false, errors.Wrap(err, fmt.Sprintf("failed to get the work obj %s from namespace %s", workName, memberClusterNsName)) + return false, fmt.Errorf("failed to get the work obj %s from namespace %s: %w", workName, memberClusterNsName, err) } // check the overall condition appliedCond := meta.FindStatusCondition(work.Status.Conditions, workapi.ConditionTypeApplied) diff --git a/pkg/controllers/internalmembercluster/member_controller.go b/pkg/controllers/internalmembercluster/member_controller.go index 09bc855dc..3b50307e4 100644 --- a/pkg/controllers/internalmembercluster/member_controller.go +++ b/pkg/controllers/internalmembercluster/member_controller.go @@ -7,9 +7,9 @@ package internalmembercluster import ( "context" + "fmt" "time" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -148,7 +148,7 @@ func (r *Reconciler) updateHealth(ctx context.Context, imc *fleetv1alpha1.Intern klog.V(2).InfoS("updateHealth", "InternalMemberCluster", klog.KObj(imc)) if err := r.updateResourceStats(ctx, imc); err != nil { - r.markInternalMemberClusterUnhealthy(imc, errors.Wrapf(err, "failed to update resource stats %s", klog.KObj(imc))) + r.markInternalMemberClusterUnhealthy(imc, fmt.Errorf("failed to update resource stats %s: %w", klog.KObj(imc), err)) return err } @@ -161,7 +161,7 @@ func (r *Reconciler) updateResourceStats(ctx context.Context, imc *fleetv1alpha1 klog.V(2).InfoS("updateResourceStats", "InternalMemberCluster", klog.KObj(imc)) var nodes corev1.NodeList if err := r.memberClient.List(ctx, &nodes); err != nil { - return errors.Wrapf(err, "failed to list nodes for member cluster %s", klog.KObj(imc)) + return fmt.Errorf("failed to list nodes for member cluster %s: %w", klog.KObj(imc), err) } var capacityCPU, capacityMemory, allocatableCPU, allocatableMemory resource.Quantity diff --git a/pkg/controllers/internalmembercluster/member_controller_test.go b/pkg/controllers/internalmembercluster/member_controller_test.go index eb46b6e71..c637302e5 100644 --- a/pkg/controllers/internalmembercluster/member_controller_test.go +++ b/pkg/controllers/internalmembercluster/member_controller_test.go @@ -7,13 +7,13 @@ package internalmembercluster import ( "context" + "errors" "testing" "time" "github.com/crossplane/crossplane-runtime/pkg/test" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" diff --git a/pkg/controllers/membercluster/membercluster_controller.go b/pkg/controllers/membercluster/membercluster_controller.go index 8cc7a2b17..9292ac1c3 100644 --- a/pkg/controllers/membercluster/membercluster_controller.go +++ b/pkg/controllers/membercluster/membercluster_controller.go @@ -11,7 +11,6 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -185,21 +184,21 @@ func (r *Reconciler) join(ctx context.Context, mc *fleetv1alpha1.MemberCluster, namespaceName, err := r.syncNamespace(ctx, mc) if err != nil { - return errors.Wrapf(err, "failed to sync namespace") + return fmt.Errorf("failed to sync namespace: %w", err) } roleName, err := r.syncRole(ctx, mc, namespaceName) if err != nil { - return errors.Wrapf(err, "failed to sync role") + return fmt.Errorf("failed to sync role: %w", err) } err = r.syncRoleBinding(ctx, mc, namespaceName, roleName) if err != nil { - return errors.Wrapf(err, "failed to sync role binding") + return fmt.Errorf("failed to sync role binding: %w", err) } if _, err := r.syncInternalMemberCluster(ctx, mc, namespaceName, imc); err != nil { - return errors.Wrapf(err, "failed to sync internal member cluster spec") + return fmt.Errorf("failed to sync internal member cluster spec: %w", err) } markMemberClusterReadyToJoin(r.recorder, mc) @@ -219,7 +218,7 @@ func (r *Reconciler) leave(ctx context.Context, mc *fleetv1alpha1.MemberCluster, // Copy spec from member cluster to internal member cluster. namespaceName := fmt.Sprintf(utils.NamespaceNameFormat, mc.Name) if _, err := r.syncInternalMemberCluster(ctx, mc, namespaceName, imc); err != nil { - return errors.Wrapf(err, "failed to sync internal member cluster spec") + return fmt.Errorf("failed to sync internal member cluster spec: %w", err) } return nil @@ -240,12 +239,12 @@ func (r *Reconciler) syncNamespace(ctx context.Context, mc *fleetv1alpha1.Member var currentNS corev1.Namespace if err := r.Client.Get(ctx, types.NamespacedName{Name: namespaceName}, ¤tNS); err != nil { if !apierrors.IsNotFound(err) { - return "", errors.Wrapf(err, "failed to get namespace %s", namespaceName) + return "", fmt.Errorf("failed to get namespace %s: %w", namespaceName, err) } klog.V(2).InfoS("creating namespace", "memberCluster", klog.KObj(mc), "namespace", namespaceName) // Make sure the entire namespace is removed if the member cluster is deleted. if err = r.Client.Create(ctx, &expectedNS, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return "", errors.Wrapf(err, "failed to create namespace %s", namespaceName) + return "", fmt.Errorf("failed to create namespace %s: %w", namespaceName, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonNamespaceCreated, "Namespace was created") klog.V(2).InfoS("created namespace", "memberCluster", klog.KObj(mc), "namespace", namespaceName) @@ -275,11 +274,11 @@ func (r *Reconciler) syncRole(ctx context.Context, mc *fleetv1alpha1.MemberClust var currentRole rbacv1.Role if err := r.Client.Get(ctx, types.NamespacedName{Name: roleName, Namespace: namespaceName}, ¤tRole); err != nil { if !apierrors.IsNotFound(err) { - return "", errors.Wrapf(err, "failed to get role %s", roleName) + return "", fmt.Errorf("failed to get role %s: %w", roleName, err) } klog.V(2).InfoS("creating role", "memberCluster", klog.KObj(mc), "role", roleName) if err = r.Client.Create(ctx, &expectedRole, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return "", errors.Wrapf(err, "failed to create role %s with rules %+v", roleName, expectedRole.Rules) + return "", fmt.Errorf("failed to create role %s with rules %+v: %w", roleName, expectedRole.Rules, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonRoleCreated, "role was created") klog.V(2).InfoS("created role", "memberCluster", klog.KObj(mc), "role", roleName) @@ -293,7 +292,7 @@ func (r *Reconciler) syncRole(ctx context.Context, mc *fleetv1alpha1.MemberClust currentRole.Rules = expectedRole.Rules klog.V(2).InfoS("updating role", "memberCluster", klog.KObj(mc), "role", roleName) if err := r.Client.Update(ctx, ¤tRole, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return "", errors.Wrapf(err, "failed to update role %s with rules %+v", roleName, currentRole.Rules) + return "", fmt.Errorf("failed to update role %s with rules %+v: %w", roleName, currentRole.Rules, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonRoleUpdated, "role was updated") klog.V(2).InfoS("updated role", "memberCluster", klog.KObj(mc), "role", roleName) @@ -323,11 +322,11 @@ func (r *Reconciler) syncRoleBinding(ctx context.Context, mc *fleetv1alpha1.Memb var currentRoleBinding rbacv1.RoleBinding if err := r.Client.Get(ctx, types.NamespacedName{Name: roleBindingName, Namespace: namespaceName}, ¤tRoleBinding); err != nil { if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to get role binding %s", roleBindingName) + return fmt.Errorf("failed to get role binding %s: %w", roleBindingName, err) } klog.V(2).InfoS("creating role binding", "memberCluster", klog.KObj(mc), "roleBinding", roleBindingName) if err = r.Client.Create(ctx, &expectedRoleBinding, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return errors.Wrapf(err, "failed to create role binding %s", roleBindingName) + return fmt.Errorf("failed to create role binding %s: %w", roleBindingName, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonRoleBindingCreated, "role binding was created") klog.V(2).InfoS("created role binding", "memberCluster", klog.KObj(mc), "roleBinding", roleBindingName) @@ -342,7 +341,7 @@ func (r *Reconciler) syncRoleBinding(ctx context.Context, mc *fleetv1alpha1.Memb currentRoleBinding.RoleRef = expectedRoleBinding.RoleRef klog.V(2).InfoS("updating role binding", "memberCluster", klog.KObj(mc), "roleBinding", roleBindingName) if err := r.Client.Update(ctx, &expectedRoleBinding, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return errors.Wrapf(err, "failed to update role binding %s", roleBindingName) + return fmt.Errorf("failed to update role binding %s: %w", roleBindingName, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonRoleBindingUpdated, "role binding was updated") klog.V(2).InfoS("updated role binding", "memberCluster", klog.KObj(mc), "roleBinding", roleBindingName) @@ -369,7 +368,7 @@ func (r *Reconciler) syncInternalMemberCluster(ctx context.Context, mc *fleetv1a if currentImc == nil { klog.V(2).InfoS("creating internal member cluster", "InternalMemberCluster", klog.KObj(&expectedImc), "spec", expectedImc.Spec) if err := r.Client.Create(ctx, &expectedImc, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return nil, errors.Wrapf(err, "failed to create internal member cluster %s with spec %+v", klog.KObj(&expectedImc), expectedImc.Spec) + return nil, fmt.Errorf("failed to create internal member cluster %s with spec %+v: %w", klog.KObj(&expectedImc), expectedImc.Spec, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonIMCCreated, "Internal member cluster was created") klog.V(2).InfoS("created internal member cluster", "InternalMemberCluster", klog.KObj(&expectedImc), "spec", expectedImc.Spec) @@ -383,7 +382,7 @@ func (r *Reconciler) syncInternalMemberCluster(ctx context.Context, mc *fleetv1a currentImc.Spec = expectedImc.Spec klog.V(2).InfoS("updating internal member cluster", "InternalMemberCluster", klog.KObj(currentImc), "spec", currentImc.Spec) if err := r.Client.Update(ctx, currentImc, client.FieldOwner(utils.MCControllerFieldManagerName)); err != nil { - return nil, errors.Wrapf(err, "failed to update internal member cluster %s with spec %+v", klog.KObj(currentImc), currentImc.Spec) + return nil, fmt.Errorf("failed to update internal member cluster %s with spec %+v: %w", klog.KObj(currentImc), currentImc.Spec, err) } r.recorder.Event(mc, corev1.EventTypeNormal, eventReasonIMCSpecUpdated, "internal member cluster spec updated") klog.V(2).InfoS("updated internal member cluster", "InternalMemberCluster", klog.KObj(currentImc), "spec", currentImc.Spec) diff --git a/pkg/controllers/resourcechange/resourcechange_controller.go b/pkg/controllers/resourcechange/resourcechange_controller.go index cc0069df1..06129e649 100644 --- a/pkg/controllers/resourcechange/resourcechange_controller.go +++ b/pkg/controllers/resourcechange/resourcechange_controller.go @@ -10,7 +10,6 @@ import ( "fmt" "time" - "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -144,7 +143,7 @@ func (r *Reconciler) findPlacementsSelectedDeletedRes(res keys.ClusterWideKey, c func (r *Reconciler) getUnstructuredObject(objectKey keys.ClusterWideKey) (runtime.Object, bool, error) { restMapping, err := r.RestMapper.RESTMapping(objectKey.GroupKind(), objectKey.Version) if err != nil { - return nil, false, errors.Wrap(err, "Failed to get GVR of object") + return nil, false, fmt.Errorf("failed to get GVR of object: %w", err) } gvr := restMapping.Resource isClusterScoped := r.InformerManager.IsClusterScopedResources(objectKey.GroupVersionKind()) @@ -158,7 +157,7 @@ func (r *Reconciler) getUnstructuredObject(objectKey keys.ClusterWideKey) (runti obj, err = r.InformerManager.Lister(gvr).ByNamespace(objectKey.Namespace).Get(objectKey.Name) } if err != nil { - return nil, isClusterScoped, errors.Wrap(err, "failed to get the object") + return nil, isClusterScoped, fmt.Errorf("failed to get the object: %w", err) } return obj, isClusterScoped, nil @@ -171,7 +170,7 @@ func (r *Reconciler) findAffectedPlacements(res *unstructured.Unstructured) (map // we have to list all the CRPs crpList, err := r.InformerManager.Lister(utils.ClusterResourcePlacementGVR).List(labels.Everything()) if err != nil { - return nil, errors.Wrap(err, "failed to list all the cluster placement") + return nil, fmt.Errorf("failed to list all the cluster placement: %w", err) } return collectAllAffectedPlacements(res, crpList), nil } diff --git a/pkg/controllers/work/apply_controller_test.go b/pkg/controllers/work/apply_controller_test.go index 177b65fb0..290278d0b 100644 --- a/pkg/controllers/work/apply_controller_test.go +++ b/pkg/controllers/work/apply_controller_test.go @@ -19,6 +19,7 @@ package controllers import ( "context" "encoding/json" + "errors" "fmt" "math" "reflect" @@ -26,7 +27,6 @@ import ( "time" "github.com/crossplane/crossplane-runtime/pkg/test" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "go.uber.org/atomic" appsv1 "k8s.io/api/apps/v1" diff --git a/pkg/controllers/work/patch_util.go b/pkg/controllers/work/patch_util.go index 1258952d5..10d433b1d 100644 --- a/pkg/controllers/work/patch_util.go +++ b/pkg/controllers/work/patch_util.go @@ -2,8 +2,9 @@ package controllers import ( "encoding/json" + "errors" + "fmt" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -82,7 +83,7 @@ func setModifiedConfigurationAnnotation(obj runtime.Object) error { var modified []byte annotations, err := metadataAccessor.Annotations(obj) if err != nil { - return errors.Wrap(err, "cannot access metadata.annotations") + return fmt.Errorf("cannot access metadata.annotations: %w", err) } if annotations == nil { annotations = make(map[string]string) @@ -113,7 +114,7 @@ func setModifiedConfigurationAnnotation(obj runtime.Object) error { func getOriginalConfiguration(obj runtime.Object) ([]byte, error) { annots, err := metadataAccessor.Annotations(obj) if err != nil { - return nil, errors.Wrap(err, "cannot access metadata.annotations") + return nil, fmt.Errorf("cannot access metadata.annotations: %w", err) } if annots == nil { return nil, errors.New("object does not have lastAppliedConfigAnnotation") diff --git a/pkg/utils/common.go b/pkg/utils/common.go index e340b184f..73a07f62c 100644 --- a/pkg/utils/common.go +++ b/pkg/utils/common.go @@ -12,7 +12,6 @@ import ( "strings" "time" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" discoveryv1 "k8s.io/api/discovery/v1" rbacv1 "k8s.io/api/rbac/v1" @@ -214,8 +213,8 @@ func ShouldPropagateObj(informerManager informer.Manager, uObj *unstructured.Uns var secret corev1.Secret err := runtime.DefaultUnstructuredConverter.FromUnstructured(uObj.Object, &secret) if err != nil { - return false, errors.Wrap(err, fmt.Sprintf( - "failed to convert a secret object %s in namespace %s", uObj.GetName(), uObj.GetNamespace())) + return false, fmt.Errorf( + "failed to convert a secret object %s in namespace %s: %w", uObj.GetName(), uObj.GetNamespace(), err) } if secret.Type == corev1.SecretTypeServiceAccountToken { return false, nil @@ -229,7 +228,7 @@ func ShouldPropagateObj(informerManager informer.Manager, uObj *unstructured.Uns // we assume that this endpoint is created by the user return true, nil } - return false, errors.Wrap(err, fmt.Sprintf("failed to get the service %s in namespace %s", uObj.GetName(), uObj.GetNamespace())) + return false, fmt.Errorf("failed to get the service %s in namespace %s: %w", uObj.GetName(), uObj.GetNamespace(), err) } // we find a service of the same name as the endpoint, we assume it's created by the service return false, nil diff --git a/pkg/utils/validator/clusterresourceplacement.go b/pkg/utils/validator/clusterresourceplacement.go index 87f64b30e..0382a8934 100644 --- a/pkg/utils/validator/clusterresourceplacement.go +++ b/pkg/utils/validator/clusterresourceplacement.go @@ -8,7 +8,6 @@ package validator import ( "fmt" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiErrors "k8s.io/apimachinery/pkg/util/errors" @@ -26,7 +25,7 @@ func ValidateClusterResourcePlacement(clusterResourcePlacement *fleetv1alpha1.Cl allErr = append(allErr, fmt.Errorf("the labelSelector and name fields are mutually exclusive in selector %+v", selector)) } if _, err := metav1.LabelSelectorAsSelector(selector.LabelSelector); err != nil { - allErr = append(allErr, errors.Wrap(err, fmt.Sprintf("the labelSelector in resource selector %+v is invalid", selector))) + allErr = append(allErr, fmt.Errorf("the labelSelector in resource selector %+v is invalid: %w", selector, err)) } } } @@ -35,7 +34,7 @@ func ValidateClusterResourcePlacement(clusterResourcePlacement *fleetv1alpha1.Cl clusterResourcePlacement.Spec.Policy.Affinity.ClusterAffinity != nil { for _, selector := range clusterResourcePlacement.Spec.Policy.Affinity.ClusterAffinity.ClusterSelectorTerms { if _, err := metav1.LabelSelectorAsSelector(&selector.LabelSelector); err != nil { - allErr = append(allErr, errors.Wrap(err, fmt.Sprintf("the labelSelector in cluster selector %+v is invalid", selector))) + allErr = append(allErr, fmt.Errorf("the labelSelector in cluster selector %+v is invalid: %w", selector, err)) } } }