From 26b9af03790443ddb294e5976611446eb0b4d0e0 Mon Sep 17 00:00:00 2001 From: koba1t Date: Thu, 27 Jan 2022 06:17:23 +0900 Subject: [PATCH] Allow setting every array element in replacements --- kyaml/yaml/fns.go | 6 ++++++ kyaml/yaml/match.go | 32 ++++++++++++++++++++++++++++++++ kyaml/yaml/match_test.go | 6 ++++++ 3 files changed, 44 insertions(+) diff --git a/kyaml/yaml/fns.go b/kyaml/yaml/fns.go index 43e54ce36..4be2dba47 100644 --- a/kyaml/yaml/fns.go +++ b/kyaml/yaml/fns.go @@ -796,6 +796,12 @@ func SplitIndexNameValue(p string) (string, string, error) { return parts[0], parts[1], nil } +// IsMatchEveryIndex returns true if p is matching every elements. +// e.g. "*" +func IsMatchEveryIndex(p string) bool { + return p == "*" +} + // IncrementFieldIndex increments i to point to the next field name element in // a slice of Contents. func IncrementFieldIndex(i int) int { diff --git a/kyaml/yaml/match.go b/kyaml/yaml/match.go index 149716063..3b80f8b7b 100644 --- a/kyaml/yaml/match.go +++ b/kyaml/yaml/match.go @@ -83,10 +83,42 @@ func (p *PathMatcher) filter(rn *RNode) (*RNode, error) { // match seq elements return p.doSeq(rn) } + + if IsMatchEveryIndex(p.Path[0]) { + // match every elements (*) + return p.doMatchEvery(rn) + } // match a field return p.doField(rn) } +func (p *PathMatcher) doMatchEvery(rn *RNode) (*RNode, error) { + + if err := rn.VisitElements(p.visitEveryElem); err != nil { + return nil, err + } + + // fmt.Println(p.val.String()) + return p.val, nil +} + +func (p *PathMatcher) visitEveryElem(elem *RNode) error { + + fieldName := p.Path[0] + // recurse on the matching element + pm := &PathMatcher{Path: p.Path[1:]} + add, err := pm.filter(elem) + for k, v := range pm.Matches { + p.Matches[k] = v + } + if err != nil || add == nil { + return err + } + p.append(fieldName, add.Content()...) + + return nil +} + func (p *PathMatcher) doField(rn *RNode) (*RNode, error) { // lookup the field field, err := rn.Pipe(Get(p.Path[0])) diff --git a/kyaml/yaml/match_test.go b/kyaml/yaml/match_test.go index 70852398b..abe51c601 100644 --- a/kyaml/yaml/match_test.go +++ b/kyaml/yaml/match_test.go @@ -77,6 +77,12 @@ spec: {[]string{ "spec", "template", "spec", "containers", "[name=s.*]", "ports", "[containerPort=.*2]"}, ""}, + {[]string{ + "spec", "template", "spec", "containers", "*", "image"}, + "- nginx:1.7.9\n- sidecar:1.0.0\n"}, + {[]string{ + "spec", "template", "spec", "containers", "*", "ports", "*"}, + "- containerPort: 80\n- containerPort: 8081\n- containerPort: 9090\n"}, } for i, u := range updates { result, err := node.Pipe(&PathMatcher{Path: u.path})