Calling PatchAction on typed objects should work correctly

Only Unstructured objects worked (because unstructured implicitly
clears the .Object map when Unmarshal is called). We must reset
obj before we attempt to unmarshal into it.
This commit is contained in:
Clayton Coleman 2019-06-05 14:27:59 -04:00
parent 4b4420f53e
commit 3b599b383d
No known key found for this signature in database
GPG Key ID: 3D16906B4F1C5CB3

View File

@ -18,9 +18,11 @@ package testing
import (
"fmt"
"reflect"
"sync"
jsonpatch "github.com/evanphx/json-patch"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -139,6 +141,11 @@ func ObjectReaction(tracker ObjectTracker) ReactionFunc {
return true, nil, err
}
// reset the object in preparation to unmarshal, since unmarshal does not guarantee that fields
// in obj that are removed by patch are cleared
value := reflect.ValueOf(obj)
value.Elem().Set(reflect.New(value.Type().Elem()).Elem())
switch action.GetPatchType() {
case types.JSONPatchType:
patch, err := jsonpatch.DecodePatch(action.GetPatch())
@ -149,6 +156,7 @@ func ObjectReaction(tracker ObjectTracker) ReactionFunc {
if err != nil {
return true, nil, err
}
if err = json.Unmarshal(modified, obj); err != nil {
return true, nil, err
}