diff --git a/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/errors.go b/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/errors.go index 7b7fc6a2f07..ef87f24cea6 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/errors.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/mergepatch/errors.go @@ -19,6 +19,7 @@ package mergepatch import ( "errors" "fmt" + "reflect" ) var ( @@ -31,8 +32,25 @@ func ErrNoMergeKey(m map[string]interface{}, k string) error { return fmt.Errorf("map: %v does not contain declared merge key: %s", m, k) } -func ErrBadArgType(expected, actual string) error { - return fmt.Errorf("expected a %s, but received a %s", expected, actual) +func ErrBadArgType(expected, actual interface{}) error { + return fmt.Errorf("expected a %s, but received a %s", + reflect.TypeOf(expected), + reflect.TypeOf(actual)) +} + +func ErrBadArgKind(expected, actual interface{}) error { + var expectedKindString, actualKindString string + if expected == nil { + expectedKindString = "nil" + } else { + expectedKindString = reflect.TypeOf(expected).Kind().String() + } + if actual == nil { + actualKindString = "nil" + } else { + actualKindString = reflect.TypeOf(actual).Kind().String() + } + return fmt.Errorf("expected a %s, but received a %s", expectedKindString, actualKindString) } func ErrBadPatchType(t interface{}, m map[string]interface{}) error { diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 9b1e325fcbf..610739c30b3 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -505,8 +505,7 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey func getMapAndMergeKeyValueByIndex(index int, mergeKey string, listOfMaps []interface{}) (map[string]interface{}, interface{}, error) { m, ok := listOfMaps[index].(map[string]interface{}) if !ok { - t := reflect.TypeOf(listOfMaps[index]) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.Kind().String()) + return nil, nil, mergepatch.ErrBadArgType(m, listOfMaps[index]) } val, ok := m[mergeKey] @@ -568,7 +567,7 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS func getTagStructType(dataStruct interface{}) (reflect.Type, error) { if dataStruct == nil { - return nil, mergepatch.ErrBadArgType("struct", "nil") + return nil, mergepatch.ErrBadArgKind(struct{}{}, nil) } t := reflect.TypeOf(dataStruct) @@ -577,7 +576,7 @@ func getTagStructType(dataStruct interface{}) (reflect.Type, error) { } if t.Kind() != reflect.Struct { - return nil, mergepatch.ErrBadArgType("struct", t.Kind().String()) + return nil, mergepatch.ErrBadArgKind(struct{}{}, dataStruct) } return t, nil @@ -1419,13 +1418,11 @@ func CreateDeleteDirective(mergeKey string, mergeKeyValue interface{}) map[strin func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[string]interface{}, error) { typedOriginal, ok := original.(map[string]interface{}) if !ok { - t := reflect.TypeOf(original) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original) } typedPatch, ok := patch.(map[string]interface{}) if !ok { - t := reflect.TypeOf(patch) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch) } return typedOriginal, typedPatch, nil } @@ -1433,13 +1430,11 @@ func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[ func sliceTypeAssertion(original, patch interface{}) ([]interface{}, []interface{}, error) { typedOriginal, ok := original.([]interface{}) if !ok { - t := reflect.TypeOf(original) - return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original) } typedPatch, ok := patch.([]interface{}) if !ok { - t := reflect.TypeOf(patch) - return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch) } return typedOriginal, typedPatch, nil } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go index 2f2a4b1b271..6954220f4cc 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go @@ -1998,9 +1998,9 @@ func TestStrategicMergePatch(t *testing.T) { testStrategicMergePatchWithCustomArguments(t, "bad patch", "{}", "", mergeItem, mergepatch.ErrBadJSONDoc) testStrategicMergePatchWithCustomArguments(t, "bad struct", - "{}", "{}", []byte(""), mergepatch.ErrBadArgType("struct", "slice")) + "{}", "{}", []byte(""), mergepatch.ErrBadArgKind(struct{}{}, []byte{})) testStrategicMergePatchWithCustomArguments(t, "nil struct", - "{}", "{}", nil, mergepatch.ErrBadArgType("struct", "nil")) + "{}", "{}", nil, mergepatch.ErrBadArgKind(struct{}{}, nil)) tc := StrategicMergePatchTestCases{} err := yaml.Unmarshal(createStrategicMergePatchTestCaseData, &tc)