diff --git a/kyaml/yaml/fns.go b/kyaml/yaml/fns.go index ad69d3bef..bec46eeb0 100644 --- a/kyaml/yaml/fns.go +++ b/kyaml/yaml/fns.go @@ -41,10 +41,9 @@ func (a ElementAppender) Filter(rn *RNode) (*RNode, error) { return nil, nil } -// ElementSetter sets the value for an Element in an associative list. ElementSetter -// will remove any elements which are empty. +// ElementSetter sets the value for an Element in an associative list. // ElementSetter will append, replace or delete an element in an associative list. -// To append, user a key-value pair that doesn't exist in the sequence. Note: this +// To append, user a key-value pair that doesn't exist in the sequence. this // behavior is intended to handle the case that not matching element found. It's // not designed for this purpose. To append an element, please use ElementAppender. // To replace, set the key-value pair and a non-nil Element. diff --git a/kyaml/yaml/fns_test.go b/kyaml/yaml/fns_test.go index dc6ae3d25..fef18557f 100644 --- a/kyaml/yaml/fns_test.go +++ b/kyaml/yaml/fns_test.go @@ -116,6 +116,55 @@ func TestElementSetter(t *testing.T) { - c: d `, assertNoErrorString(t)(node.String())) + node = orig.Copy() + // Nothing happens because no element is matched + rn, err = node.Pipe(ElementSetter{Key: "a", Value: "zebra"}) + assert.NoError(t, err) + assert.Nil(t, rn) + assert.Equal(t, `- a: b +- scalarValue +- c: d +`, assertNoErrorString(t)(node.String())) + + node = orig.Copy() + // Return error because ElementSetter doesn't support a single key + // when there is a scalar value in the list + rn, err = node.Pipe(ElementSetter{Key: "a"}) + assert.EqualError(t, err, "wrong Node Kind for expected: MappingNode was ScalarNode: value: {scalarValue}") + + node = MustParse(` +- a: b +- c: d +`) + // {a: b} is removed since the value is omitted and only key is used + // to match and no Element specified. + rn, err = node.Pipe(ElementSetter{Key: "a"}) + assert.NoError(t, err) + assert.Nil(t, rn) + assert.Equal(t, `- c: d +`, assertNoErrorString(t)(node.String())) + + node = MustParse(` +- a: b +- c: d +`) + // Return error because ElementSetter will assume all elements are scalar when + // there is only value provided. + rn, err = node.Pipe(ElementSetter{Value: "b"}) + assert.EqualError(t, err, "wrong Node Kind for expected: ScalarNode was MappingNode: value: {a: b}") + + node = MustParse(` +- a +- b +`) + // b is removed since ElementSetter use the value "b" to match the + // scalar values. + rn, err = node.Pipe(ElementSetter{Value: "b"}) + assert.NoError(t, err) + assert.Nil(t, rn) + assert.Equal(t, `- a +`, assertNoErrorString(t)(node.String())) + node = orig.Copy() // Set an element, replacing 'a: b' with 'e: f' newElement := NewMapRNode(&map[string]string{