From 5e84de2a8966c69a15407c361247878772c5ccbd Mon Sep 17 00:00:00 2001 From: koba1t Date: Tue, 12 Apr 2022 05:14:24 +0900 Subject: [PATCH] fix errror message using replacement wildcard and create option --- api/filters/replacement/replacement.go | 3 -- api/filters/replacement/replacement_test.go | 39 +++++++++++++++++++++ kyaml/yaml/fns.go | 3 ++ kyaml/yaml/fns_test.go | 11 ++++-- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/api/filters/replacement/replacement.go b/api/filters/replacement/replacement.go index a96dfff71..76cb6089f 100644 --- a/api/filters/replacement/replacement.go +++ b/api/filters/replacement/replacement.go @@ -142,9 +142,6 @@ func applyToOneNode(options *types.FieldOptions, t *yaml.RNode, value *yaml.RNod } for _, scalarNode := range t.YNode().Content { - if options != nil && options.Create { - return fmt.Errorf("cannot use create option in a multi-value target") - } rn := yaml.NewRNode(scalarNode) if err := setTargetValue(options, rn, value); err != nil { return err diff --git a/api/filters/replacement/replacement_test.go b/api/filters/replacement/replacement_test.go index 71069dfad..6e4f46b0d 100644 --- a/api/filters/replacement/replacement_test.go +++ b/api/filters/replacement/replacement_test.go @@ -1634,6 +1634,45 @@ spec: - name: deployment-name value: sample-deploy`, }, + "index contains '*' character and create options": { + input: `apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: sample-deploy + name: sample-deploy +spec: + replicas: 1 + selector: + matchLabels: + app: sample-deploy + template: + metadata: + labels: + app: sample-deploy + spec: + containers: + - image: nginx + name: main + env: + - name: other-env + value: YYYYY +`, + replacements: `replacements: +- source: + kind: Deployment + name: sample-deploy + fieldPath: metadata.name + targets: + - select: + kind: Deployment + fieldPaths: + - spec.template.spec.containers.*.env.[name=deployment-name].value + options: + create: true +`, + expectedErr: "cannot support create option in a multi-value target now", + }, "multiple field paths in target": { input: `apiVersion: v1 kind: ConfigMap diff --git a/kyaml/yaml/fns.go b/kyaml/yaml/fns.go index c5ac0acfa..fe72d13ce 100644 --- a/kyaml/yaml/fns.go +++ b/kyaml/yaml/fns.go @@ -541,6 +541,9 @@ func (l PathGetter) getFilter(part, nextPart string, fieldPath *[]string) (Filte case part == "-": // part is a hyphen return GetElementByIndex(-1), nil + case part == "*": + // part is a hyphen + return nil, fmt.Errorf("cannot support create option in a multi-value target now") case IsListIndex(part): // part is surrounded by brackets return l.elemFilter(part) diff --git a/kyaml/yaml/fns_test.go b/kyaml/yaml/fns_test.go index 8ad049e8e..8346b7b88 100644 --- a/kyaml/yaml/fns_test.go +++ b/kyaml/yaml/fns_test.go @@ -142,7 +142,7 @@ func TestElementSetter(t *testing.T) { node = MustParse(` - a: b -- c: d +- c: d `) // If given a key and no values, ElementSetter will // change node to be an empty list @@ -154,7 +154,7 @@ func TestElementSetter(t *testing.T) { node = MustParse(` - a: b -- c: d +- c: d `) // Return error because ElementSetter will assume all elements are scalar when // there is only value provided. @@ -580,6 +580,13 @@ a: {} assert.Equal(t, "h\n", assertNoErrorString(t)(rn.String())) } +func TestLookup_Fn_create_with_wildcard_error(t *testing.T) { + node, err := Parse(s) + assert.NoError(t, err) + _, err = node.Pipe(LookupCreate(yaml.MappingNode, "a", "b", "*", "t")) + assert.Error(t, err, "cannot support create option in a multi-value target now") +} + func TestLookup(t *testing.T) { s := `n: o a: