From 1c9b82a0465db56fbacbaa45a81e72736d5ebfe0 Mon Sep 17 00:00:00 2001 From: koba1t Date: Thu, 22 Feb 2024 04:35:54 +0900 Subject: [PATCH] implements to replacements value in the structured data --- api/filters/replacement/replacement_test.go | 73 ++++++++++++++++++++- kyaml/yaml/fns.go | 4 ++ kyaml/yaml/match.go | 10 ++- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/api/filters/replacement/replacement_test.go b/api/filters/replacement/replacement_test.go index 7619e5fc9d..6be46da1b9 100644 --- a/api/filters/replacement/replacement_test.go +++ b/api/filters/replacement/replacement_test.go @@ -2779,7 +2779,7 @@ spec: name: myingress fieldPaths: - spec.tls.0.hosts.0 - - spec.tls.0.secretName + - spec.tls.0.secretName options: create: true `, @@ -2855,3 +2855,74 @@ spec: }) } } + +func TestValueInlineStructuredData(t *testing.T) { + testCases := map[string]struct { + input string + replacements string + expected string + expectedErr string + }{ + "replacement contain jsonfield": { + input: `apiVersion: v1 +kind: ConfigMap +metadata: + name: target-configmap +data: + config.json: |- + { + "config": { + "id": "42", + "hostname": "REPLACE_TARGET_HOSTNAME" + } + } +`, + replacements: `replacements: +- source: + kind: ConfigMap + name: target-configmap + fieldPath: metadata.name + targets: + - select: + kind: ConfigMap + fieldPaths: + - data.config\.json.config.hostname +`, + expected: `apiVersion: v1 +kind: ConfigMap +metadata: + name: target-configmap +data: + config.json: |- + { + "config": { + "id": "42", + "hostname": "target-configmap" + } + }`, + }, + } + + for tn, tc := range testCases { + t.Run(tn, func(t *testing.T) { + f := Filter{} + err := yaml.Unmarshal([]byte(tc.replacements), &f) + if !assert.NoError(t, err) { + t.FailNow() + } + actual, err := filtertest.RunFilterE(t, tc.input, f) + if err != nil { + if tc.expectedErr == "" { + t.Errorf("unexpected error: %s\n", err.Error()) + t.FailNow() + } + if !assert.Contains(t, err.Error(), tc.expectedErr) { + t.FailNow() + } + } + if !assert.Equal(t, strings.TrimSpace(tc.expected), strings.TrimSpace(actual)) { + t.FailNow() + } + }) + } +} diff --git a/kyaml/yaml/fns.go b/kyaml/yaml/fns.go index e0802a897f..0bf0c24a8b 100644 --- a/kyaml/yaml/fns.go +++ b/kyaml/yaml/fns.go @@ -830,6 +830,10 @@ func (e *InvalidNodeKindError) Error() string { return msg } +func (e *InvalidNodeKindError) Unwrap() error { + return errors.Errorf("InvalidNodeKindError") +} + func (e *InvalidNodeKindError) ActualNodeKind() Kind { return e.node.YNode().Kind } diff --git a/kyaml/yaml/match.go b/kyaml/yaml/match.go index 8e40d4c2b2..e84424777e 100644 --- a/kyaml/yaml/match.go +++ b/kyaml/yaml/match.go @@ -137,10 +137,18 @@ func (p *PathMatcher) visitEveryElem(elem *RNode) error { func (p *PathMatcher) doField(rn *RNode) (*RNode, error) { // lookup the field field, err := rn.Pipe(Get(p.Path[0])) - if err != nil || (!IsCreate(p.Create) && field == nil) { + if err != nil { + invalidKindErr := &InvalidNodeKindError{} + if errors.As(err, &invalidKindErr) { + fmt.Print("-----------------------------\nOUTPUT: ", err) + } return nil, err } + if !IsCreate(p.Create) && field == nil { + return nil, nil + } + if IsCreate(p.Create) && field == nil { var nextPart string if len(p.Path) > 1 {