diff --git a/pkg/resource/clusterScoped.go b/pkg/resource/clusterScoped.go index 9068305f4..cb10a00e0 100644 --- a/pkg/resource/clusterScoped.go +++ b/pkg/resource/clusterScoped.go @@ -4,6 +4,7 @@ import ( "context" types "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/util/retry" cntrlClient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -34,17 +35,24 @@ func ListClusterObjects(objList cntrlClient.ObjectList, client cntrlClient.Clien // UpdateClusterObject updates the specified object using the provided client. func UpdateClusterObject(obj cntrlClient.Object, client cntrlClient.Client) error { - existingObj, err := GetClusterObject(obj.GetName(), obj, client) - if err != nil { - return err - } + err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + existingObj, err := GetClusterObject(obj.GetName(), obj, client) + if err != nil { + return err + } - obj.SetResourceVersion(existingObj.GetResourceVersion()) + obj.SetResourceVersion(existingObj.GetResourceVersion()) - if err = client.Update(context.TODO(), obj); err != nil { + if err = client.Update(context.TODO(), obj); err != nil { + return err + } + return nil + }) + if err != nil { + // May be conflict if max retries were hit, or may be something unrelated + // like permissions or a network error return err } - return nil } diff --git a/pkg/resource/namespaceScoped.go b/pkg/resource/namespaceScoped.go index c0fd0f6ca..7c74f8d30 100644 --- a/pkg/resource/namespaceScoped.go +++ b/pkg/resource/namespaceScoped.go @@ -4,6 +4,7 @@ import ( "context" types "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/util/retry" cntrlClient "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -35,17 +36,24 @@ func ListObjects(namespace string, objList cntrlClient.ObjectList, client cntrlC // UpdateObject updates the specified object using the provided client. func UpdateObject(obj cntrlClient.Object, client cntrlClient.Client) error { - existingObj, err := GetObject(obj.GetName(), obj.GetNamespace(), obj, client) - if err != nil { - return err - } + err := retry.RetryOnConflict(retry.DefaultRetry, func() error { + existingObj, err := GetObject(obj.GetName(), obj.GetNamespace(), obj, client) + if err != nil { + return err + } - obj.SetResourceVersion(existingObj.GetResourceVersion()) + obj.SetResourceVersion(existingObj.GetResourceVersion()) - if err = client.Update(context.TODO(), obj); err != nil { + if err = client.Update(context.TODO(), obj); err != nil { + return err + } + return nil + }) + if err != nil { + // May be conflict if max retries were hit, or may be something unrelated + // like permissions or a network error return err } - return nil }