Skip to content

Commit 891b8a7

Browse files
committed
account for delimiters in structured data replacements
Fixes #6028
1 parent 17a06a7 commit 891b8a7

2 files changed

Lines changed: 60 additions & 6 deletions

File tree

api/filters/replacement/replacement.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func copyValueToTarget(target *yaml.RNode, value *yaml.RNode, selector *types.Ta
191191
}
192192

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

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

310310
structuredData := yaml.NewRNode(&parsedNode)
311311

312+
createKind := yaml.Kind(0) // do not create
313+
if options != nil && options.Create {
314+
createKind = value.YNode().Kind
315+
}
316+
312317
// Navigate to the target location within the structured data
313318
targetInStructured, err := structuredData.Pipe(&yaml.PathMatcher{
314319
Path: structuredDataPath,
@@ -329,10 +334,9 @@ func setValueInStructuredData(target *yaml.RNode, value *yaml.RNode, fieldPath s
329334

330335
// Set the value in the structured data
331336
for _, t := range targetFields {
332-
if t.YNode().Kind == yaml.ScalarNode {
333-
t.YNode().Value = value.YNode().Value
334-
} else {
335-
t.SetYNode(value.YNode())
337+
err = setFieldValue(options, t, value)
338+
if err != nil {
339+
return err
336340
}
337341
}
338342

api/filters/replacement/replacement_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5005,6 +5005,56 @@ data:
50055005
labels: {app: "my-awesome-app", version: "1.0.0", env: "production"}
50065006
spec: {replicas: 3, selector: {matchLabels: {app: "my-awesome-app"}}}`,
50075007
},
5008+
"replacement yaml substring options": {
5009+
input: `apiVersion: v1
5010+
kind: ConfigMap
5011+
metadata:
5012+
name: source-values
5013+
data:
5014+
app_name: "my-awesome-app"
5015+
---
5016+
apiVersion: v1
5017+
kind: ConfigMap
5018+
metadata:
5019+
name: target-config
5020+
data:
5021+
config.yaml: |-
5022+
target:
5023+
url: https://example.com/appname/api/endpoint
5024+
`,
5025+
5026+
replacements: `replacements:
5027+
- source:
5028+
kind: ConfigMap
5029+
name: source-values
5030+
fieldPath: data.app_name
5031+
targets:
5032+
- select:
5033+
kind: ConfigMap
5034+
name: target-config
5035+
fieldPaths:
5036+
- data.config\.yaml.target.url
5037+
options:
5038+
delimiter: /
5039+
index: 3
5040+
`,
5041+
expected: `apiVersion: v1
5042+
kind: ConfigMap
5043+
metadata:
5044+
name: source-values
5045+
data:
5046+
app_name: "my-awesome-app"
5047+
---
5048+
apiVersion: v1
5049+
kind: ConfigMap
5050+
metadata:
5051+
name: target-config
5052+
data:
5053+
config.yaml: |-
5054+
target:
5055+
url: https://example.com/my-awesome-app/api/endpoint
5056+
`,
5057+
},
50085058
}
50095059

50105060
for tn := range testCases {

0 commit comments

Comments
 (0)