@@ -106,7 +106,7 @@ func (f *TestFieldManager) Reset() {
106
106
f .liveObj = f .emptyObj .DeepCopyObject ()
107
107
}
108
108
109
- func (f * TestFieldManager ) Apply (obj [] byte , manager string , force bool ) error {
109
+ func (f * TestFieldManager ) Apply (obj runtime. Object , manager string , force bool ) error {
110
110
out , err := fieldmanager .NewFieldManager (f .fieldManager ).Apply (f .liveObj , obj , manager , force )
111
111
if err == nil {
112
112
f .liveObj = out
@@ -174,7 +174,8 @@ func TestUpdateApplyConflict(t *testing.T) {
174
174
t .Fatalf ("failed to apply object: %v" , err )
175
175
}
176
176
177
- err := f .Apply ([]byte (`{
177
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
178
+ if err := yaml .Unmarshal ([]byte (`{
178
179
"apiVersion": "apps/v1",
179
180
"kind": "Deployment",
180
181
"metadata": {
@@ -183,7 +184,11 @@ func TestUpdateApplyConflict(t *testing.T) {
183
184
"spec": {
184
185
"replicas": 101,
185
186
}
186
- }` ), "fieldmanager_conflict" , false )
187
+ }` ), & appliedObj .Object ); err != nil {
188
+ t .Fatalf ("error decoding YAML: %v" , err )
189
+ }
190
+
191
+ err := f .Apply (appliedObj , "fieldmanager_conflict" , false )
187
192
if err == nil || ! apierrors .IsConflict (err ) {
188
193
t .Fatalf ("Expecting to get conflicts but got %v" , err )
189
194
}
@@ -225,20 +230,68 @@ func TestApplyStripsFields(t *testing.T) {
225
230
func TestVersionCheck (t * testing.T ) {
226
231
f := NewTestFieldManager (schema .FromAPIVersionAndKind ("apps/v1" , "Deployment" ))
227
232
228
- // patch has 'apiVersion: apps/v1' and live version is apps/v1 -> no errors
229
- err := f . Apply ([]byte (`{
233
+ appliedObj := & unstructured. Unstructured { Object : map [ string ] interface {}{}}
234
+ if err := yaml . Unmarshal ([]byte (`{
230
235
"apiVersion": "apps/v1",
231
236
"kind": "Deployment",
232
- }` ), "fieldmanager_test" , false )
237
+ }` ), & appliedObj .Object ); err != nil {
238
+ t .Fatalf ("error decoding YAML: %v" , err )
239
+ }
240
+
241
+ // patch has 'apiVersion: apps/v1' and live version is apps/v1 -> no errors
242
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
233
243
if err != nil {
234
244
t .Fatalf ("failed to apply object: %v" , err )
235
245
}
236
246
237
- // patch has 'apiVersion: apps/v2' but live version is apps/v1 -> error
238
- err = f . Apply ([]byte (`{
247
+ appliedObj = & unstructured. Unstructured { Object : map [ string ] interface {}{}}
248
+ if err := yaml . Unmarshal ([]byte (`{
239
249
"apiVersion": "apps/v1beta1",
240
250
"kind": "Deployment",
241
- }` ), "fieldmanager_test" , false )
251
+ }` ), & appliedObj .Object ); err != nil {
252
+ t .Fatalf ("error decoding YAML: %v" , err )
253
+ }
254
+
255
+ // patch has 'apiVersion: apps/v2' but live version is apps/v1 -> error
256
+ err = f .Apply (appliedObj , "fieldmanager_test" , false )
257
+ if err == nil {
258
+ t .Fatalf ("expected an error from mismatched patch and live versions" )
259
+ }
260
+ switch typ := err .(type ) {
261
+ default :
262
+ t .Fatalf ("expected error to be of type %T was %T" , apierrors.StatusError {}, typ )
263
+ case apierrors.APIStatus :
264
+ if typ .Status ().Code != http .StatusBadRequest {
265
+ t .Fatalf ("expected status code to be %d but was %d" ,
266
+ http .StatusBadRequest , typ .Status ().Code )
267
+ }
268
+ }
269
+ }
270
+ func TestVersionCheckDoesNotPanic (t * testing.T ) {
271
+ f := NewTestFieldManager (schema .FromAPIVersionAndKind ("apps/v1" , "Deployment" ))
272
+
273
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
274
+ if err := yaml .Unmarshal ([]byte (`{
275
+ "apiVersion": "apps/v1",
276
+ "kind": "Deployment",
277
+ }` ), & appliedObj .Object ); err != nil {
278
+ t .Fatalf ("error decoding YAML: %v" , err )
279
+ }
280
+
281
+ // patch has 'apiVersion: apps/v1' and live version is apps/v1 -> no errors
282
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
283
+ if err != nil {
284
+ t .Fatalf ("failed to apply object: %v" , err )
285
+ }
286
+
287
+ appliedObj = & unstructured.Unstructured {Object : map [string ]interface {}{}}
288
+ if err := yaml .Unmarshal ([]byte (`{
289
+ }` ), & appliedObj .Object ); err != nil {
290
+ t .Fatalf ("error decoding YAML: %v" , err )
291
+ }
292
+
293
+ // patch has 'apiVersion: apps/v2' but live version is apps/v1 -> error
294
+ err = f .Apply (appliedObj , "fieldmanager_test" , false )
242
295
if err == nil {
243
296
t .Fatalf ("expected an error from mismatched patch and live versions" )
244
297
}
@@ -256,15 +309,20 @@ func TestVersionCheck(t *testing.T) {
256
309
func TestApplyDoesNotStripLabels (t * testing.T ) {
257
310
f := NewTestFieldManager (schema .FromAPIVersionAndKind ("v1" , "Pod" ))
258
311
259
- err := f .Apply ([]byte (`{
312
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
313
+ if err := yaml .Unmarshal ([]byte (`{
260
314
"apiVersion": "v1",
261
315
"kind": "Pod",
262
316
"metadata": {
263
317
"labels": {
264
318
"a": "b"
265
319
},
266
320
}
267
- }` ), "fieldmanager_test" , false )
321
+ }` ), & appliedObj .Object ); err != nil {
322
+ t .Fatalf ("error decoding YAML: %v" , err )
323
+ }
324
+
325
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
268
326
if err != nil {
269
327
t .Fatalf ("failed to apply object: %v" , err )
270
328
}
@@ -305,7 +363,12 @@ func TestApplyNewObject(t *testing.T) {
305
363
t .Run (test .gvk .String (), func (t * testing.T ) {
306
364
f := NewTestFieldManager (test .gvk )
307
365
308
- if err := f .Apply (test .obj , "fieldmanager_test" , false ); err != nil {
366
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
367
+ if err := yaml .Unmarshal (test .obj , & appliedObj .Object ); err != nil {
368
+ t .Fatalf ("error decoding YAML: %v" , err )
369
+ }
370
+
371
+ if err := f .Apply (appliedObj , "fieldmanager_test" , false ); err != nil {
309
372
t .Fatal (err )
310
373
}
311
374
})
@@ -362,7 +425,11 @@ func BenchmarkNewObject(b *testing.B) {
362
425
b .ReportAllocs ()
363
426
b .ResetTimer ()
364
427
for n := 0 ; n < b .N ; n ++ {
365
- err := f .Apply (test .obj , "fieldmanager_test" , false )
428
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
429
+ if err := yaml .Unmarshal (test .obj , & appliedObj .Object ); err != nil {
430
+ b .Fatalf ("error decoding YAML: %v" , err )
431
+ }
432
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
366
433
if err != nil {
367
434
b .Fatal (err )
368
435
}
@@ -387,7 +454,12 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
387
454
obj .Spec .Containers [0 ].Image = "nginx:4.3"
388
455
objs = append (objs , obj )
389
456
390
- err := f .Apply (podBytes , "fieldmanager_apply" , false )
457
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
458
+ if err := yaml .Unmarshal (podBytes , & appliedObj .Object ); err != nil {
459
+ b .Fatalf ("error decoding YAML: %v" , err )
460
+ }
461
+
462
+ err := f .Apply (appliedObj , "fieldmanager_apply" , false )
391
463
if err != nil {
392
464
b .Fatal (err )
393
465
}
@@ -410,7 +482,8 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
410
482
func TestApplyFailsWithManagedFields (t * testing.T ) {
411
483
f := NewTestFieldManager (schema .FromAPIVersionAndKind ("v1" , "Pod" ))
412
484
413
- err := f .Apply ([]byte (`{
485
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
486
+ if err := yaml .Unmarshal ([]byte (`{
414
487
"apiVersion": "v1",
415
488
"kind": "Pod",
416
489
"metadata": {
@@ -420,7 +493,11 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
420
493
}
421
494
]
422
495
}
423
- }` ), "fieldmanager_test" , false )
496
+ }` ), & appliedObj .Object ); err != nil {
497
+ t .Fatalf ("error decoding YAML: %v" , err )
498
+ }
499
+
500
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
424
501
425
502
if err == nil {
426
503
t .Fatalf ("successfully applied with set managed fields" )
@@ -430,15 +507,19 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
430
507
func TestApplySuccessWithNoManagedFields (t * testing.T ) {
431
508
f := NewTestFieldManager (schema .FromAPIVersionAndKind ("v1" , "Pod" ))
432
509
433
- err := f .Apply ([]byte (`{
510
+ appliedObj := & unstructured.Unstructured {Object : map [string ]interface {}{}}
511
+ if err := yaml .Unmarshal ([]byte (`{
434
512
"apiVersion": "v1",
435
513
"kind": "Pod",
436
514
"metadata": {
437
515
"labels": {
438
516
"a": "b"
439
517
},
440
518
}
441
- }` ), "fieldmanager_test" , false )
519
+ }` ), & appliedObj .Object ); err != nil {
520
+ t .Fatalf ("error decoding YAML: %v" , err )
521
+ }
522
+ err := f .Apply (appliedObj , "fieldmanager_test" , false )
442
523
443
524
if err != nil {
444
525
t .Fatalf ("failed to apply object: %v" , err )
0 commit comments