From 82880b819728820aaba12bf55e37e08b28153a20 Mon Sep 17 00:00:00 2001 From: Paul Morie Date: Thu, 30 May 2019 13:31:13 -0400 Subject: [PATCH] Unstructed helpers: document lack of slice syntax --- .../pkg/apis/meta/v1/unstructured/helpers.go | 6 ++++++ .../apis/meta/v1/unstructured/helpers_test.go | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go index 3b07e86db8f3..7ea0986f3588 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go @@ -32,6 +32,9 @@ import ( // NestedFieldCopy returns a deep copy of the value of a nested field. // Returns false if the value is missing. // No error is returned for a nil field. +// +// Note: fields passed to this function are treated as keys within the passed +// object; no array/slice syntax is supported. func NestedFieldCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) { val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { @@ -43,6 +46,9 @@ func NestedFieldCopy(obj map[string]interface{}, fields ...string) (interface{}, // NestedFieldNoCopy returns a reference to a nested field. // Returns false if value is not found and an error if unable // to traverse obj. +// +// Note: fields passed to this function are treated as keys within the passed +// object; no array/slice syntax is supported. func NestedFieldNoCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) { var val interface{} = obj diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go index 529acab6bac4..b2978b6f94d3 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go @@ -67,6 +67,11 @@ func TestNestedFieldNoCopy(t *testing.T) { "b": target, "c": nil, "d": []interface{}{"foo"}, + "e": []interface{}{ + map[string]interface{}{ + "f": "bar", + }, + }, }, } @@ -91,13 +96,13 @@ func TestNestedFieldNoCopy(t *testing.T) { assert.Nil(t, res) // case 4: field does not exist - res, exists, err = NestedFieldNoCopy(obj, "a", "e") + res, exists, err = NestedFieldNoCopy(obj, "a", "g") assert.False(t, exists) assert.Nil(t, err) assert.Nil(t, res) // case 5: intermediate field does not exist - res, exists, err = NestedFieldNoCopy(obj, "a", "e", "f") + res, exists, err = NestedFieldNoCopy(obj, "a", "g", "f") assert.False(t, exists) assert.Nil(t, err) assert.Nil(t, res) @@ -108,6 +113,13 @@ func TestNestedFieldNoCopy(t *testing.T) { assert.False(t, exists) assert.Nil(t, err) assert.Nil(t, res) + + // case 7: array/slice syntax is not supported + // (background: users may expect this to be supported) + res, exists, err = NestedFieldNoCopy(obj, "a", "e[0]") + assert.False(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) } func TestNestedFieldCopy(t *testing.T) {