diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 5f16f2bfb..be9469ce9 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -405,28 +405,25 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err // Append the created resource to the results, even if something fails res.Created = append(res.Created, info) - // Since the resource does not exist, create it. - if err := createResource(info); err != nil { - return errors.Wrap(err, "failed to create resource") - } - kind := info.Mapping.GroupVersionKind.Kind c.Log("Created a new %s called %q in %s\n", kind, info.Name, info.Namespace) return nil + } else { + var kind string + originalInfo := original.Get(info) + if originalInfo == nil { + kind := info.Mapping.GroupVersionKind.Kind + return errors.Errorf("no %s with the name %q found", kind, info.Name) + } + c.Log("Updating %s called %q in %s\n", kind, info.Name, info.Namespace) + // Because we check for errors later, append the info regardless + res.Updated = append(res.Updated, info) } - originalInfo := original.Get(info) - if originalInfo == nil { - kind := info.Mapping.GroupVersionKind.Kind - return errors.Errorf("no %s with the name %q found", kind, info.Name) - } - - if err := updateResource(c, info, originalInfo.Object, force); err != nil { - c.Log("error updating the resource %q:\n\t %v", info.Name, err) + if err := applyResource(info, force); err != nil { + c.Log("error applying the resource %q:\n\t %v", info.Name, err) updateErrors = append(updateErrors, err.Error()) } - // Because we check for errors later, append the info regardless - res.Updated = append(res.Updated, info) return nil }) @@ -667,6 +664,24 @@ func createPatch(target *resource.Info, current runtime.Object) ([]byte, types.P return patch, types.StrategicMergePatchType, err } +// applyResource runs SSA via helm. +func 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. + data, err := runtime.Encode(unstructured.UnstructuredJSONScheme, target.Object) + if err != nil { + return errors.Wrap(err, "failed to encode target object") + } + _, err = helper.Patch(target.Namespace, target.Name, types.ApplyPatchType, data, &metav1.PatchOptions{ + Force: &force, + }) + if err != nil { + return errors.Wrapf(err, "cannot patch %q with kind %s", target.Name, target.Mapping.GroupVersionKind.Kind) + } + return nil +} + func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, force bool) error { var ( obj runtime.Object