@@ -278,7 +278,7 @@ func referSameObject(a, b metav1.OwnerReference) bool {
278
278
return aGV .Group == bGV .Group && a .Kind == b .Kind && a .Name == b .Name
279
279
}
280
280
281
- // OperationResult is the action result of a CreateOrUpdate call.
281
+ // OperationResult is the action result of a CreateOrUpdate or CreateOrPatch call.
282
282
type OperationResult string
283
283
284
284
const ( // They should complete the sentence "Deployment default/foo has been ..."
@@ -294,13 +294,26 @@ const ( // They should complete the sentence "Deployment default/foo has been ..
294
294
OperationResultUpdatedStatusOnly OperationResult = "updatedStatusOnly"
295
295
)
296
296
297
- // CreateOrUpdate creates or updates the given object in the Kubernetes
298
- // cluster. The object's desired state must be reconciled with the existing
299
- // state inside the passed in callback MutateFn.
297
+ // CreateOrUpdate attempts to fetch the given object from the Kubernetes cluster.
298
+ // If the object didn't exist, MutateFn will be called, and it will be created.
299
+ // If the object did exist, MutateFn will be called, and if it changed the
300
+ // object, it will be updated.
301
+ // Otherwise, it will be left unchanged.
302
+ // The executed operation (and an error) will be returned.
300
303
//
301
- // The MutateFn is called regardless of creating or updating an object.
304
+ // WARNING: If the MutateFn resets a value on obj that has a default value,
305
+ // CreateOrUpdate will *always* perform an update. This is because when the
306
+ // object is fetched from the API server, the value will have taken on the
307
+ // default value, and the check for equality will fail. For example, Deployments
308
+ // must have a Replicas value set. If the MutateFn sets a Deployment's Replicas
309
+ // to nil, then it will never match with the object returned from the API
310
+ // server, which defaults the value to 1.
302
311
//
303
- // It returns the executed operation and an error.
312
+ // WARNING: CreateOrUpdate assumes that no values have been set on obj aside
313
+ // from the Name/Namespace. Values other than Name and Namespace that existed on
314
+ // obj may be overwritten by the corresponding values in the object returned
315
+ // from the Kubernetes API server. When this happens, the Update will not work
316
+ // as expected.
304
317
//
305
318
// Note: changes made by MutateFn to any sub-resource (status...), will be
306
319
// discarded.
@@ -339,13 +352,26 @@ func CreateOrUpdate(ctx context.Context, c client.Client, obj client.Object, f M
339
352
return OperationResultUpdated , nil
340
353
}
341
354
342
- // CreateOrPatch creates or patches the given object in the Kubernetes
343
- // cluster. The object's desired state must be reconciled with the before
344
- // state inside the passed in callback MutateFn.
355
+ // CreateOrPatch attempts to fetch the given object from the Kubernetes cluster.
356
+ // If the object didn't exist, MutateFn will be called, and it will be created.
357
+ // If the object did exist, MutateFn will be called, and if it changed the
358
+ // object, it will be patched.
359
+ // Otherwise, it will be left unchanged.
360
+ // The executed operation (and an error) will be returned.
345
361
//
346
- // The MutateFn is called regardless of creating or updating an object.
362
+ // WARNING: If the MutateFn resets a value on obj that has a default value,
363
+ // CreateOrPatch will *always* perform a patch. This is because when the
364
+ // object is fetched from the API server, the value will have taken on the
365
+ // default value, and the check for equality will fail.
366
+ // For example, Deployments must have a Replicas value set. If the MutateFn sets
367
+ // a Deployment's Replicas to nil, then it will never match with the object
368
+ // returned from the API server, which defaults the value to 1.
347
369
//
348
- // It returns the executed operation and an error.
370
+ // WARNING: CreateOrPatch assumes that no values have been set on obj aside
371
+ // from the Name/Namespace. Values other than Name and Namespace that existed on
372
+ // obj may be overwritten by the corresponding values in the object returned
373
+ // from the Kubernetes API server. When this happens, the Patch will not work
374
+ // as expected.
349
375
//
350
376
// Note: changes to any sub-resource other than status will be ignored.
351
377
// Changes to the status sub-resource will only be applied if the object
0 commit comments