diff --git a/pkg/detector/detector.go b/pkg/detector/detector.go index 8c3fee708..58ba6f9bd 100644 --- a/pkg/detector/detector.go +++ b/pkg/detector/detector.go @@ -1330,32 +1330,33 @@ func (d *ResourceDetector) HandleClusterPropagationPolicyCreationOrUpdate(policy // CleanupResourceTemplateMarks removes marks, such as labels and annotations, from object referencing by objRef. func (d *ResourceDetector) CleanupResourceTemplateMarks(objRef workv1alpha2.ObjectReference, cleanupFunc func(obj metav1.Object)) error { - workload, err := helper.FetchResourceTemplate(d.DynamicClient, d.InformerManager, d.RESTMapper, objRef) + gvr, err := restmapper.GetGroupVersionResource(d.RESTMapper, schema.FromAPIVersionAndKind(objRef.APIVersion, objRef.Kind)) if err != nil { - // do nothing if resource template not exist, it might have been removed. - if apierrors.IsNotFound(err) { - return nil + klog.Errorf("Failed to convert GVR from GVK(%s/%s), err: %v", objRef.APIVersion, objRef.Kind, err) + return err + } + + return retry.RetryOnConflict(retry.DefaultRetry, func() (err error) { + workload, err := d.DynamicClient.Resource(gvr).Namespace(objRef.Namespace).Get(context.TODO(), objRef.Name, metav1.GetOptions{}) + if err != nil { + // do nothing if resource template not exist, it might have been removed. + if apierrors.IsNotFound(err) { + return nil + } + klog.Errorf("Failed to fetch resource(kind=%s, %s/%s): err is %v", objRef.Kind, objRef.Namespace, objRef.Name, err) + return err } - klog.Errorf("Failed to fetch resource(kind=%s, %s/%s): %v", objRef.Kind, objRef.Namespace, objRef.Name, err) - return err - } - workload = workload.DeepCopy() - cleanupFunc(workload) + cleanupFunc(workload) - gvr, err := restmapper.GetGroupVersionResource(d.RESTMapper, workload.GroupVersionKind()) - if err != nil { - klog.Errorf("Failed to delete resource(%s/%s) labels as mapping GVK to GVR failed: %v", workload.GetNamespace(), workload.GetName(), err) - return err - } - - newWorkload, err := d.DynamicClient.Resource(gvr).Namespace(workload.GetNamespace()).Update(context.TODO(), workload, metav1.UpdateOptions{}) - if err != nil { - klog.Errorf("Failed to update resource %v/%v, err is %v ", workload.GetNamespace(), workload.GetName(), err) - return err - } - klog.V(2).Infof("Updated resource template(kind=%s, %s/%s) successfully", newWorkload.GetKind(), newWorkload.GetNamespace(), newWorkload.GetName()) - return nil + _, err = d.DynamicClient.Resource(gvr).Namespace(workload.GetNamespace()).Update(context.TODO(), workload, metav1.UpdateOptions{}) + if err != nil { + klog.Errorf("Failed to update resource(kind=%s, %s/%s): err is %v", workload.GetKind(), workload.GetNamespace(), workload.GetName(), err) + return err + } + klog.V(2).Infof("Updated resource template(kind=%s, %s/%s) successfully", workload.GetKind(), workload.GetNamespace(), workload.GetName()) + return nil + }) } // CleanupResourceBindingMarks removes marks, such as labels and annotations, from resource binding.