diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 06cf28636..fdd0b1a2c 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -143,7 +143,13 @@ func (c *Client) IsReachable() error { // Create creates Kubernetes resources specified in the resource list. func (c *Client) Create(resources ResourceList) (*Result, error) { c.Log("creating %d resource(s)", len(resources)) - if err := perform(resources, createResource); err != nil { + if err := perform(resources, func(i *resource.Info) error { + return retry.RetryOnConflict( + retry.DefaultRetry, + func() error { + return c.applyResource(i, true) + }) + }); err != nil { return nil, err } return &Result{Created: resources}, nil @@ -423,7 +429,7 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err res.Updated = append(res.Updated, info) } - if err := applyResource(info, force); err != nil { + if err := c.applyResource(info, force); err != nil { c.Log("error applying the resource %q:\n\t %v", info.Name, err) updateErrors = append(updateErrors, err.Error()) } @@ -598,14 +604,6 @@ func batchPerform(infos ResourceList, fn func(*resource.Info) error, errs chan<- } } -func createResource(info *resource.Info) error { - return retry.RetryOnConflict( - retry.DefaultRetry, - func() error { - return applyResource(info, true) - }) -} - func deleteResource(info *resource.Info, policy metav1.DeletionPropagation) error { return retry.RetryOnConflict( retry.DefaultRetry, @@ -617,7 +615,7 @@ func deleteResource(info *resource.Info, policy metav1.DeletionPropagation) erro } // applyResource runs SSA via helm. -func applyResource(target *resource.Info, force bool) error { +func (c *Client) applyResource(target *resource.Info, force bool) error { helper := resource.NewHelper(target.Client, target.Mapping). WithFieldManager(getManagedFieldsManager()) // Send the full object to be applied on the server side. @@ -647,6 +645,7 @@ func applyResource(target *resource.Info, force bool) error { return nil } + c.Log("Applied patch to reconcile server-side-apply managed fields, re-applying SSA for object %s of kind %s in namespace %s", target.Name, target.Mapping.GroupVersionKind.Kind, target.Namespace) // now we know that there were some extra managed fields lying around. Re-send original SSA to the api-server // to clear the old managed fields. obj, err = helper.Patch(target.Namespace, target.Name, types.ApplyPatchType, data, &metav1.PatchOptions{