mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-12 01:14:22 +00:00
Fix null YAML values being replaced by "null"
Related issues: * https://github.com/kubernetes-sigs/kustomize/issues/5031 * https://github.com/kubernetes-sigs/kustomize/issues/5171 After noting this behaviour was not present ind89b448c74a `git bisect` pointed to the change1b7db20504. The issue with that change is that upon seeing a `null` node it would replace it with a node whose value was equivalent but without a `!!null` tag. This meant that one application of a patch would have the desired approach: the result would be `null` in the output, but on a second application of a similar patch the field would be rendered as `"null"`. To avoid this, define a new attribute on `RNode`s that is checked before clearing any node we should keep. The added `TestApplySmPatch_Idempotency` test verifies this behaviour. See also https://github.com/kubernetes-sigs/kustomize/pull/5365 for an alternative approach
This commit is contained in:
@@ -724,8 +724,14 @@ func (s FieldSetter) Filter(rn *RNode) (*RNode, error) {
|
||||
return rn, nil
|
||||
}
|
||||
|
||||
// Clear the field if it is empty, or explicitly null
|
||||
if s.Value == nil || s.Value.IsTaggedNull() {
|
||||
// Clearing nil fields:
|
||||
// 1. Clear any fields with no value
|
||||
// 2. Clear any "null" YAML fields unless we explicitly want to keep them
|
||||
// This is to balance
|
||||
// 1. Persisting 'null' values passed by the user (see issue #4628)
|
||||
// 2. Avoiding producing noisy documents that add any field defaulting to
|
||||
// 'nil' even if they weren't present in the source document
|
||||
if s.Value == nil || (s.Value.IsTaggedNull() && !s.Value.ShouldKeep) {
|
||||
return rn.Pipe(Clear(s.Name))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user