@@ -244,6 +244,117 @@ func TestNoOpUpdateSameResourceVersion(t *testing.T) {
244
244
}
245
245
}
246
246
247
+ // TestNoOpApplyWithEmptyMap
248
+ func TestNoOpApplyWithEmptyMap (t * testing.T ) {
249
+ client , closeFn := setup (t )
250
+ defer closeFn ()
251
+
252
+ deploymentName := "no-op"
253
+ deploymentsResource := "deployments"
254
+ deploymentBytes := []byte (`{
255
+ "apiVersion": "apps/v1",
256
+ "kind": "Deployment",
257
+ "metadata": {
258
+ "name": "` + deploymentName + `",
259
+ "labels": {
260
+ "app": "nginx"
261
+ }
262
+ },
263
+ "spec": {
264
+ "replicas": 1,
265
+ "selector": {
266
+ "matchLabels": {
267
+ "app": "nginx"
268
+ }
269
+ },
270
+ "template": {
271
+ "metadata": {
272
+ "annotations": {},
273
+ "labels": {
274
+ "app": "nginx"
275
+ }
276
+ },
277
+ "spec": {
278
+ "containers": [{
279
+ "name": "nginx",
280
+ "image": "nginx:1.14.2",
281
+ "ports": [{
282
+ "containerPort": 80
283
+ }]
284
+ }]
285
+ }
286
+ }
287
+ }
288
+ }` )
289
+
290
+ _ , err := client .AppsV1 ().RESTClient ().Patch (types .ApplyPatchType ).
291
+ Namespace ("default" ).
292
+ Param ("fieldManager" , "apply_test" ).
293
+ Resource (deploymentsResource ).
294
+ Name (deploymentName ).
295
+ Body (deploymentBytes ).
296
+ Do (context .TODO ()).
297
+ Get ()
298
+ if err != nil {
299
+ t .Fatalf ("Failed to create object: %v" , err )
300
+ }
301
+
302
+ // Sleep for one second to make sure that the times of each update operation is different.
303
+ time .Sleep (1 * time .Second )
304
+
305
+ createdObject , err := client .AppsV1 ().RESTClient ().Get ().Namespace ("default" ).Resource (deploymentsResource ).Name (deploymentName ).Do (context .TODO ()).Get ()
306
+ if err != nil {
307
+ t .Fatalf ("Failed to retrieve created object: %v" , err )
308
+ }
309
+
310
+ createdAccessor , err := meta .Accessor (createdObject )
311
+ if err != nil {
312
+ t .Fatalf ("Failed to get meta accessor for created object: %v" , err )
313
+ }
314
+
315
+ createdBytes , err := json .MarshalIndent (createdObject , "\t " , "\t " )
316
+ if err != nil {
317
+ t .Fatalf ("Failed to marshal created object: %v" , err )
318
+ }
319
+
320
+ // Test that we can apply the same object and don't change the RV
321
+ _ , err = client .AppsV1 ().RESTClient ().Patch (types .ApplyPatchType ).
322
+ Namespace ("default" ).
323
+ Param ("fieldManager" , "apply_test" ).
324
+ Resource (deploymentsResource ).
325
+ Name (deploymentName ).
326
+ Body (deploymentBytes ).
327
+ Do (context .TODO ()).
328
+ Get ()
329
+ if err != nil {
330
+ t .Fatalf ("Failed to create object: %v" , err )
331
+ }
332
+
333
+ updatedObject , err := client .AppsV1 ().RESTClient ().Get ().Namespace ("default" ).Resource (deploymentsResource ).Name (deploymentName ).Do (context .TODO ()).Get ()
334
+ if err != nil {
335
+ t .Fatalf ("Failed to retrieve updated object: %v" , err )
336
+ }
337
+
338
+ updatedAccessor , err := meta .Accessor (updatedObject )
339
+ if err != nil {
340
+ t .Fatalf ("Failed to get meta accessor for updated object: %v" , err )
341
+ }
342
+
343
+ updatedBytes , err := json .MarshalIndent (updatedObject , "\t " , "\t " )
344
+ if err != nil {
345
+ t .Fatalf ("Failed to marshal updated object: %v" , err )
346
+ }
347
+
348
+ if createdAccessor .GetResourceVersion () != updatedAccessor .GetResourceVersion () {
349
+ t .Fatalf ("Expected same resource version to be %v but got: %v\n old object:\n %v\n new object:\n %v" ,
350
+ createdAccessor .GetResourceVersion (),
351
+ updatedAccessor .GetResourceVersion (),
352
+ string (createdBytes ),
353
+ string (updatedBytes ),
354
+ )
355
+ }
356
+ }
357
+
247
358
func getRV (obj runtime.Object ) (string , error ) {
248
359
acc , err := meta .Accessor (obj )
249
360
if err != nil {
0 commit comments