From 8a45247161d4d6c3ec311995a433bfb9a60b9477 Mon Sep 17 00:00:00 2001 From: Jakub Jaruszewski Date: Wed, 29 Apr 2026 16:23:06 +0200 Subject: [PATCH] Fix missing conflict retry with server-side apply Signed-off-by: Jakub Jaruszewski --- pkg/kube/client.go | 19 +++++++++++-------- pkg/kube/client_test.go | 11 ++++++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index c955e8875..c5bdb8b81 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -318,20 +318,23 @@ func (c *Client) makeCreateApplyFunc(serverSideApply, forceConflicts, dryRun boo slog.String("fieldValidationDirective", string(fieldValidationDirective))) return func(target *resource.Info) error { - err := patchResourceServerSide(target, dryRun, forceConflicts, fieldValidationDirective) - logger := c.Logger().With( slog.String("namespace", target.Namespace), slog.String("name", target.Name), slog.String("gvk", target.Mapping.GroupVersionKind.String())) - if err != nil { - logger.Debug("Error creating resource via patch", slog.Any("error", err)) - return err - } - logger.Debug("Created resource via patch") + return retry.RetryOnConflict( + retry.DefaultRetry, + func() error { + err := patchResourceServerSide(target, dryRun, forceConflicts, fieldValidationDirective) + if err != nil { + logger.Debug("Error creating resource via patch", slog.Any("error", err)) + return err + } - return nil + logger.Debug("Created resource via patch") + return nil + }) } } diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index ed871c05a..f04be354a 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -53,6 +53,7 @@ import ( k8sfake "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest/fake" + "k8s.io/client-go/util/retry" cmdtesting "k8s.io/kubectl/pkg/cmd/testing" ) @@ -273,9 +274,13 @@ func TestCreate(t *testing.T) { }, ExpectedErrorContains: "Operation cannot be fulfilled on resourcequotas \"quota\": the object has been modified; " + "please apply your changes to the latest version and try again", - ExpectedActions: []string{ - "/namespaces/default/pods/dolphin:PATCH", - }, + ExpectedActions: func() []string { // expect helm to retry on conflict, workaround for: https://github.com/kubernetes/kubernetes/issues/67761 + actions := make([]string, retry.DefaultRetry.Steps) + for i := range actions { + actions[i] = "/namespaces/default/pods/dolphin:PATCH" + } + return actions + }(), }, }