Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions api/filters/replacement/replacement.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func copyValueToTarget(target *yaml.RNode, value *yaml.RNode, selector *types.Ta
}

// Check if this fieldPath contains structured data access
if err := setValueInStructuredData(target, value, fp, createKind); err == nil {
if err := setValueInStructuredData(target, value, fp, selector.Options); err == nil {
// Successfully handled as structured data
continue
}
Expand Down Expand Up @@ -258,7 +258,7 @@ func setFieldValue(options *types.FieldOptions, targetField *yaml.RNode, value *
}

// setValueInStructuredData handles setting values within structured data (JSON/YAML) in scalar fields
func setValueInStructuredData(target *yaml.RNode, value *yaml.RNode, fieldPath string, createKind yaml.Kind) error {
func setValueInStructuredData(target *yaml.RNode, value *yaml.RNode, fieldPath string, options *types.FieldOptions) error {
pathParts := kyaml_utils.SmarterPathSplitter(fieldPath, ".")
if len(pathParts) < 2 {
return fmt.Errorf("not a structured data path")
Expand Down Expand Up @@ -309,6 +309,11 @@ func setValueInStructuredData(target *yaml.RNode, value *yaml.RNode, fieldPath s

structuredData := yaml.NewRNode(&parsedNode)

createKind := yaml.Kind(0) // do not create
if options != nil && options.Create {
createKind = value.YNode().Kind
}

// Navigate to the target location within the structured data
targetInStructured, err := structuredData.Pipe(&yaml.PathMatcher{
Path: structuredDataPath,
Expand All @@ -329,10 +334,9 @@ func setValueInStructuredData(target *yaml.RNode, value *yaml.RNode, fieldPath s

// Set the value in the structured data
for _, t := range targetFields {
if t.YNode().Kind == yaml.ScalarNode {
t.YNode().Value = value.YNode().Value
} else {
t.SetYNode(value.YNode())
err = setFieldValue(options, t, value)
if err != nil {
return err
}
}

Expand Down
50 changes: 50 additions & 0 deletions api/filters/replacement/replacement_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5005,6 +5005,56 @@ data:
labels: {app: "my-awesome-app", version: "1.0.0", env: "production"}
spec: {replicas: 3, selector: {matchLabels: {app: "my-awesome-app"}}}`,
},
"replacement yaml substring options": {
input: `apiVersion: v1
kind: ConfigMap
metadata:
name: source-values
data:
app_name: "my-awesome-app"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: target-config
data:
config.yaml: |-
target:
url: https://example.com/appname/api/endpoint
`,

replacements: `replacements:
- source:
kind: ConfigMap
name: source-values
fieldPath: data.app_name
targets:
- select:
kind: ConfigMap
name: target-config
fieldPaths:
- data.config\.yaml.target.url
options:
delimiter: /
index: 3
`,
expected: `apiVersion: v1
kind: ConfigMap
metadata:
name: source-values
data:
app_name: "my-awesome-app"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: target-config
data:
config.yaml: |-
target:
url: https://example.com/my-awesome-app/api/endpoint
`,
},
}

for tn := range testCases {
Expand Down