@@ -332,8 +332,9 @@ func (t versionedTracker) Create(gvr schema.GroupVersionResource, obj runtime.Ob
332
332
return fmt .Errorf ("failed to get accessor for object: %w" , err )
333
333
}
334
334
if accessor .GetName () == "" {
335
+ gvk , _ := apiutil .GVKForObject (obj , t .scheme )
335
336
return apierrors .NewInvalid (
336
- obj . GetObjectKind (). GroupVersionKind () .GroupKind (),
337
+ gvk .GroupKind (),
337
338
accessor .GetName (),
338
339
field.ErrorList {field .Required (field .NewPath ("metadata.name" ), "name is required" )})
339
340
}
@@ -433,8 +434,9 @@ func (t versionedTracker) updateObject(gvr schema.GroupVersionResource, obj runt
433
434
}
434
435
435
436
if accessor .GetName () == "" {
437
+ gvk , _ := apiutil .GVKForObject (obj , t .scheme )
436
438
return nil , apierrors .NewInvalid (
437
- obj . GetObjectKind (). GroupVersionKind () .GroupKind (),
439
+ gvk .GroupKind (),
438
440
accessor .GetName (),
439
441
field.ErrorList {field .Required (field .NewPath ("metadata.name" ), "name is required" )})
440
442
}
@@ -527,33 +529,35 @@ func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj client.O
527
529
if err != nil {
528
530
return err
529
531
}
532
+ gvk , err := apiutil .GVKForObject (obj , c .scheme )
533
+ if err != nil {
534
+ return err
535
+ }
530
536
o , err := c .tracker .Get (gvr , key .Namespace , key .Name )
531
537
if err != nil {
532
538
return err
533
539
}
534
540
535
- _ , isUnstructured := obj .(runtime.Unstructured )
536
- _ , isPartialObject := obj .(* metav1.PartialObjectMetadata )
537
-
538
- if isUnstructured || isPartialObject {
539
- gvk , err := apiutil .GVKForObject (obj , c .scheme )
540
- if err != nil {
541
- return err
542
- }
543
- ta , err := meta .TypeAccessor (o )
544
- if err != nil {
545
- return err
546
- }
547
- ta .SetKind (gvk .Kind )
548
- ta .SetAPIVersion (gvk .GroupVersion ().String ())
541
+ ta , err := meta .TypeAccessor (o )
542
+ if err != nil {
543
+ return err
549
544
}
550
545
546
+ // If the final object is unstructuctured, the json
547
+ // representation must contain GVK or the apimachinery
548
+ // json serializer will error out.
549
+ ta .SetAPIVersion (gvk .GroupVersion ().String ())
550
+ ta .SetKind (gvk .Kind )
551
+
551
552
j , err := json .Marshal (o )
552
553
if err != nil {
553
554
return err
554
555
}
555
556
zero (obj )
556
- return json .Unmarshal (j , obj )
557
+ if err := json .Unmarshal (j , obj ); err != nil {
558
+ return err
559
+ }
560
+ return ensureTypeMeta (obj , gvk )
557
561
}
558
562
559
563
func (c * fakeClient ) Watch (ctx context.Context , list client.ObjectList , opts ... client.ListOption ) (watch.Interface , error ) {
@@ -579,8 +583,7 @@ func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...cl
579
583
return err
580
584
}
581
585
582
- originalKind := gvk .Kind
583
-
586
+ originalGVK := gvk
584
587
gvk .Kind = strings .TrimSuffix (gvk .Kind , "List" )
585
588
586
589
if _ , isUnstructuredList := obj .(runtime.Unstructured ); isUnstructuredList && ! c .scheme .Recognizes (gvk ) {
@@ -602,39 +605,30 @@ func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...cl
602
605
return err
603
606
}
604
607
605
- if _ , isUnstructured := obj .(runtime.Unstructured ); isUnstructured {
606
- ta , err := meta .TypeAccessor (o )
607
- if err != nil {
608
- return err
609
- }
610
- ta .SetKind (originalKind )
611
- ta .SetAPIVersion (gvk .GroupVersion ().String ())
612
- }
613
-
614
608
j , err := json .Marshal (o )
615
609
if err != nil {
616
610
return err
617
611
}
618
612
zero (obj )
613
+ if err := ensureTypeMeta (obj , originalGVK ); err != nil {
614
+ return err
615
+ }
619
616
objCopy := obj .DeepCopyObject ().(client.ObjectList )
620
617
if err := json .Unmarshal (j , objCopy ); err != nil {
621
618
return err
622
619
}
623
620
624
- if _ , isUnstructured := obj .(runtime.Unstructured ); isUnstructured {
625
- ta , err := meta .TypeAccessor (obj )
626
- if err != nil {
627
- return err
628
- }
629
- ta .SetKind (originalKind )
630
- ta .SetAPIVersion (gvk .GroupVersion ().String ())
631
- }
632
-
633
621
objs , err := meta .ExtractList (objCopy )
634
622
if err != nil {
635
623
return err
636
624
}
637
625
626
+ for _ , o := range objs {
627
+ if err := ensureTypeMeta (o , gvk ); err != nil {
628
+ return err
629
+ }
630
+ }
631
+
638
632
if listOpts .LabelSelector == nil && listOpts .FieldSelector == nil {
639
633
return meta .SetList (obj , objs )
640
634
}
@@ -775,7 +769,15 @@ func (c *fakeClient) Create(ctx context.Context, obj client.Object, opts ...clie
775
769
776
770
c .trackerWriteLock .Lock ()
777
771
defer c .trackerWriteLock .Unlock ()
778
- return c .tracker .Create (gvr , obj , accessor .GetNamespace ())
772
+ if err := c .tracker .Create (gvr , obj , accessor .GetNamespace ()); err != nil {
773
+ return err
774
+ }
775
+
776
+ gvk , err := apiutil .GVKForObject (obj , c .scheme )
777
+ if err != nil {
778
+ return err
779
+ }
780
+ return ensureTypeMeta (obj , gvk )
779
781
}
780
782
781
783
func (c * fakeClient ) Delete (ctx context.Context , obj client.Object , opts ... client.DeleteOption ) error {
@@ -892,14 +894,22 @@ func (c *fakeClient) update(obj client.Object, isStatus bool, opts ...client.Upd
892
894
if err != nil {
893
895
return err
894
896
}
897
+ gvk , err := apiutil .GVKForObject (obj , c .scheme )
898
+ if err != nil {
899
+ return err
900
+ }
895
901
accessor , err := meta .Accessor (obj )
896
902
if err != nil {
897
903
return err
898
904
}
899
905
900
906
c .trackerWriteLock .Lock ()
901
907
defer c .trackerWriteLock .Unlock ()
902
- return c .tracker .update (gvr , obj , accessor .GetNamespace (), isStatus , false , * updateOptions .AsUpdateOptions ())
908
+ if err := c .tracker .update (gvr , obj , accessor .GetNamespace (), isStatus , false , * updateOptions .AsUpdateOptions ()); err != nil {
909
+ return err
910
+ }
911
+
912
+ return ensureTypeMeta (obj , gvk )
903
913
}
904
914
905
915
func (c * fakeClient ) Patch (ctx context.Context , obj client.Object , patch client.Patch , opts ... client.PatchOption ) error {
@@ -922,16 +932,15 @@ func (c *fakeClient) patch(obj client.Object, patch client.Patch, opts ...client
922
932
if err != nil {
923
933
return err
924
934
}
925
- accessor , err := meta . Accessor (obj )
935
+ gvk , err := apiutil . GVKForObject (obj , c . scheme )
926
936
if err != nil {
927
937
return err
928
938
}
929
- data , err := patch . Data (obj )
939
+ accessor , err := meta . Accessor (obj )
930
940
if err != nil {
931
941
return err
932
942
}
933
-
934
- gvk , err := apiutil .GVKForObject (obj , c .scheme )
943
+ data , err := patch .Data (obj )
935
944
if err != nil {
936
945
return err
937
946
}
@@ -978,21 +987,20 @@ func (c *fakeClient) patch(obj client.Object, patch client.Patch, opts ...client
978
987
panic ("tracker could not handle patch method" )
979
988
}
980
989
981
- if _ , isUnstructured := obj .(runtime.Unstructured ); isUnstructured {
982
- ta , err := meta .TypeAccessor (o )
983
- if err != nil {
984
- return err
985
- }
986
- ta .SetKind (gvk .Kind )
987
- ta .SetAPIVersion (gvk .GroupVersion ().String ())
990
+ if err := ensureTypeMeta (obj , gvk ); err != nil {
991
+ return err
988
992
}
989
993
990
994
j , err := json .Marshal (o )
991
995
if err != nil {
992
996
return err
993
997
}
994
998
zero (obj )
995
- return json .Unmarshal (j , obj )
999
+ if err := json .Unmarshal (j , obj ); err != nil {
1000
+ return err
1001
+ }
1002
+
1003
+ return ensureTypeMeta (obj , gvk )
996
1004
}
997
1005
998
1006
// Applying a patch results in a deletionTimestamp that is truncated to the nearest second.
@@ -1600,3 +1608,23 @@ func AddIndex(c client.Client, obj runtime.Object, field string, extractValue cl
1600
1608
1601
1609
return nil
1602
1610
}
1611
+
1612
+ func ensureTypeMeta (obj runtime.Object , gvk schema.GroupVersionKind ) error {
1613
+ ta , err := meta .TypeAccessor (obj )
1614
+ if err != nil {
1615
+ return err
1616
+ }
1617
+ _ , isUnstructured := obj .(runtime.Unstructured )
1618
+ _ , isPartialObject := obj .(* metav1.PartialObjectMetadata )
1619
+ _ , isPartialObjectList := obj .(* metav1.PartialObjectMetadataList )
1620
+ if ! isUnstructured && ! isPartialObject && ! isPartialObjectList {
1621
+ ta .SetKind ("" )
1622
+ ta .SetAPIVersion ("" )
1623
+ return nil
1624
+ }
1625
+
1626
+ ta .SetKind (gvk .Kind )
1627
+ ta .SetAPIVersion (gvk .GroupVersion ().String ())
1628
+
1629
+ return nil
1630
+ }
0 commit comments