implements to replacements value in the structured data

This commit is contained in:
koba1t
2024-02-22 04:35:54 +09:00
parent 39086340ad
commit 2dc0d0da8b
3 changed files with 87 additions and 2 deletions

View File

@@ -2779,7 +2779,7 @@ spec:
name: myingress name: myingress
fieldPaths: fieldPaths:
- spec.tls.0.hosts.0 - spec.tls.0.hosts.0
- spec.tls.0.secretName - spec.tls.0.secretName
options: options:
create: true create: true
`, `,
@@ -4498,3 +4498,74 @@ metadata:
}) })
} }
} }
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()
}
})
}
}

View File

@@ -830,6 +830,10 @@ func (e *InvalidNodeKindError) Error() string {
return msg return msg
} }
func (e *InvalidNodeKindError) Unwrap() error {
return errors.Errorf("InvalidNodeKindError")
}
func (e *InvalidNodeKindError) ActualNodeKind() Kind { func (e *InvalidNodeKindError) ActualNodeKind() Kind {
return e.node.YNode().Kind return e.node.YNode().Kind
} }

View File

@@ -137,10 +137,20 @@ func (p *PathMatcher) visitEveryElem(elem *RNode) error {
func (p *PathMatcher) doField(rn *RNode) (*RNode, error) { func (p *PathMatcher) doField(rn *RNode) (*RNode, error) {
// lookup the field // lookup the field
field, err := rn.Pipe(Get(p.Path[0])) field, err := rn.Pipe(Get(p.Path[0]))
if err != nil || (!IsCreate(p.Create) && field == nil) { if err != nil {
// check error is an invalid kind error
invalidKindErr := &InvalidNodeKindError{}
if errors.As(err, &invalidKindErr) {
// if the field is valid json or yaml, continue to lookup the next part of the path
fmt.Print("-----------------------------\nOUTPUT: ", err)
}
return nil, err return nil, err
} }
if !IsCreate(p.Create) && field == nil {
return nil, nil
}
if IsCreate(p.Create) && field == nil { if IsCreate(p.Create) && field == nil {
var nextPart string var nextPart string
if len(p.Path) > 1 { if len(p.Path) > 1 {