Commit 4d6ef25f authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #46057 from mengqiy/improvePatchTypeError

Automatic merge from submit-queue improve type assertion error Per discussion https://github.com/kubernetes/kubernetes/pull/45980#issuecomment-302524829. ```release-note NONE ```
parents 027c31e7 dd80b915
...@@ -19,6 +19,7 @@ package mergepatch ...@@ -19,6 +19,7 @@ package mergepatch
import ( import (
"errors" "errors"
"fmt" "fmt"
"reflect"
) )
var ( var (
...@@ -31,8 +32,25 @@ func ErrNoMergeKey(m map[string]interface{}, k string) error { ...@@ -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) return fmt.Errorf("map: %v does not contain declared merge key: %s", m, k)
} }
func ErrBadArgType(expected, actual string) error { func ErrBadArgType(expected, actual interface{}) error {
return fmt.Errorf("expected a %s, but received a %s", expected, actual) 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 { func ErrBadPatchType(t interface{}, m map[string]interface{}) error {
......
...@@ -505,8 +505,7 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey ...@@ -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) { func getMapAndMergeKeyValueByIndex(index int, mergeKey string, listOfMaps []interface{}) (map[string]interface{}, interface{}, error) {
m, ok := listOfMaps[index].(map[string]interface{}) m, ok := listOfMaps[index].(map[string]interface{})
if !ok { if !ok {
t := reflect.TypeOf(listOfMaps[index]) return nil, nil, mergepatch.ErrBadArgType(m, listOfMaps[index])
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.Kind().String())
} }
val, ok := m[mergeKey] val, ok := m[mergeKey]
...@@ -568,7 +567,7 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS ...@@ -568,7 +567,7 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS
func getTagStructType(dataStruct interface{}) (reflect.Type, error) { func getTagStructType(dataStruct interface{}) (reflect.Type, error) {
if dataStruct == nil { if dataStruct == nil {
return nil, mergepatch.ErrBadArgType("struct", "nil") return nil, mergepatch.ErrBadArgKind(struct{}{}, nil)
} }
t := reflect.TypeOf(dataStruct) t := reflect.TypeOf(dataStruct)
...@@ -577,7 +576,7 @@ func getTagStructType(dataStruct interface{}) (reflect.Type, error) { ...@@ -577,7 +576,7 @@ func getTagStructType(dataStruct interface{}) (reflect.Type, error) {
} }
if t.Kind() != reflect.Struct { if t.Kind() != reflect.Struct {
return nil, mergepatch.ErrBadArgType("struct", t.Kind().String()) return nil, mergepatch.ErrBadArgKind(struct{}{}, dataStruct)
} }
return t, nil return t, nil
...@@ -1419,13 +1418,11 @@ func CreateDeleteDirective(mergeKey string, mergeKeyValue interface{}) map[strin ...@@ -1419,13 +1418,11 @@ func CreateDeleteDirective(mergeKey string, mergeKeyValue interface{}) map[strin
func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[string]interface{}, error) { func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[string]interface{}, error) {
typedOriginal, ok := original.(map[string]interface{}) typedOriginal, ok := original.(map[string]interface{})
if !ok { if !ok {
t := reflect.TypeOf(original) return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original)
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String())
} }
typedPatch, ok := patch.(map[string]interface{}) typedPatch, ok := patch.(map[string]interface{})
if !ok { if !ok {
t := reflect.TypeOf(patch) return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch)
return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String())
} }
return typedOriginal, typedPatch, nil return typedOriginal, typedPatch, nil
} }
...@@ -1433,13 +1430,11 @@ func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[ ...@@ -1433,13 +1430,11 @@ func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[
func sliceTypeAssertion(original, patch interface{}) ([]interface{}, []interface{}, error) { func sliceTypeAssertion(original, patch interface{}) ([]interface{}, []interface{}, error) {
typedOriginal, ok := original.([]interface{}) typedOriginal, ok := original.([]interface{})
if !ok { if !ok {
t := reflect.TypeOf(original) return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original)
return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String())
} }
typedPatch, ok := patch.([]interface{}) typedPatch, ok := patch.([]interface{})
if !ok { if !ok {
t := reflect.TypeOf(patch) return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch)
return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String())
} }
return typedOriginal, typedPatch, nil return typedOriginal, typedPatch, nil
} }
...@@ -1998,9 +1998,9 @@ func TestStrategicMergePatch(t *testing.T) { ...@@ -1998,9 +1998,9 @@ func TestStrategicMergePatch(t *testing.T) {
testStrategicMergePatchWithCustomArguments(t, "bad patch", testStrategicMergePatchWithCustomArguments(t, "bad patch",
"{}", "<THIS IS NOT JSON>", mergeItem, mergepatch.ErrBadJSONDoc) "{}", "<THIS IS NOT JSON>", mergeItem, mergepatch.ErrBadJSONDoc)
testStrategicMergePatchWithCustomArguments(t, "bad struct", testStrategicMergePatchWithCustomArguments(t, "bad struct",
"{}", "{}", []byte("<THIS IS NOT A STRUCT>"), mergepatch.ErrBadArgType("struct", "slice")) "{}", "{}", []byte("<THIS IS NOT A STRUCT>"), mergepatch.ErrBadArgKind(struct{}{}, []byte{}))
testStrategicMergePatchWithCustomArguments(t, "nil struct", testStrategicMergePatchWithCustomArguments(t, "nil struct",
"{}", "{}", nil, mergepatch.ErrBadArgType("struct", "nil")) "{}", "{}", nil, mergepatch.ErrBadArgKind(struct{}{}, nil))
tc := StrategicMergePatchTestCases{} tc := StrategicMergePatchTestCases{}
err := yaml.Unmarshal(createStrategicMergePatchTestCaseData, &tc) err := yaml.Unmarshal(createStrategicMergePatchTestCaseData, &tc)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment