From 14a1a0e4a8c7a111f0aee26de866d04bec7a3fec Mon Sep 17 00:00:00 2001 From: monopole Date: Fri, 8 Jan 2021 17:26:33 -0800 Subject: [PATCH] Fix 3424 by avoiding a JSON round trip --- .../patchstrategicmerge/patchstrategicmerge.go | 5 ++++- .../accumulator/refvartransformer_test.go | 13 ++++++++++++- api/krusty/issue3424_test.go | 15 ++++++++++----- api/resource/resource.go | 10 ++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/api/filters/patchstrategicmerge/patchstrategicmerge.go b/api/filters/patchstrategicmerge/patchstrategicmerge.go index a993e1e4c..3fa532df0 100644 --- a/api/filters/patchstrategicmerge/patchstrategicmerge.go +++ b/api/filters/patchstrategicmerge/patchstrategicmerge.go @@ -4,6 +4,7 @@ package patchstrategicmerge import ( + "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" "sigs.k8s.io/kustomize/kyaml/yaml/merge2" @@ -28,7 +29,9 @@ func (pf Filter) Filter(nodes []*yaml.RNode) ([]*yaml.RNode, error) { if err != nil { return nil, err } - result = append(result, r) + if !konfig.FlagEnableKyamlDefaultValue || r != nil { + result = append(result, r) + } } return result, nil } diff --git a/api/internal/accumulator/refvartransformer_test.go b/api/internal/accumulator/refvartransformer_test.go index 5e1ff2ce2..a8da36b48 100644 --- a/api/internal/accumulator/refvartransformer_test.go +++ b/api/internal/accumulator/refvartransformer_test.go @@ -7,6 +7,7 @@ import ( "reflect" "testing" + "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/resmap" resmaptest_test "sigs.k8s.io/kustomize/api/testutils/resmaptest" @@ -123,8 +124,18 @@ func TestRefVarTransformer(t *testing.T) { "slice": []interface{}{5}, // noticeably *not* a []string }}).ResMap(), }, - errMessage: `obj '{"apiVersion": "v1", "data": {"slice": [5]}, "kind": "ConfigMap", "metadata": {"name": "cm1"}} + errMessage: konfig.IfApiMachineryElseKyaml( + `obj '{"apiVersion": "v1", "data": {"slice": [5]}, "kind": "ConfigMap", "metadata": {"name": "cm1"}} ' at path 'data/slice': invalid value type expect a string`, + `obj 'apiVersion: v1 +data: + slice: + - 5 +kind: ConfigMap +metadata: + name: cm1 +' at path 'data/slice': invalid value type expect a string`, + ), }, { description: "var replacement in nil", diff --git a/api/krusty/issue3424_test.go b/api/krusty/issue3424_test.go index 3b3c8cda8..13dbf09c6 100644 --- a/api/krusty/issue3424_test.go +++ b/api/krusty/issue3424_test.go @@ -4,6 +4,7 @@ package krusty_test import ( + "fmt" "testing" kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" @@ -12,6 +13,7 @@ import ( // Demonstrate unwanted quotes added to an integer by a strategic merge patch. func TestIssue3424Basics(t *testing.T) { th := kusttest_test.MakeHarness(t) + opts := th.MakeDefaultOptions() th.WriteF("pdb-patch.yaml", ` apiVersion: policy/v1beta1 kind: PodDisruptionBudget @@ -51,8 +53,8 @@ patches: resources: - my_file.yaml `) - m := th.Run(".", th.MakeDefaultOptions()) - th.AssertActualEqualsExpected(m, ` + m := th.Run(".", opts) + expFmt := ` apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: @@ -60,7 +62,7 @@ metadata: faceit-pdb: default name: championships-api spec: - maxUnavailable: "1" + maxUnavailable: %s --- apiVersion: policy/v1beta1 kind: PodDisruptionBudget @@ -69,6 +71,9 @@ metadata: faceit-pdb: default name: championships-api-2 spec: - maxUnavailable: "1" -`) + maxUnavailable: %s +` + th.AssertActualEqualsExpected(m, opts.IfApiMachineryElseKyaml( + fmt.Sprintf(expFmt, `"1"`, `"1"`), + fmt.Sprintf(expFmt, `1`, `1`))) } diff --git a/api/resource/resource.go b/api/resource/resource.go index 0fff83527..f9a85d128 100644 --- a/api/resource/resource.go +++ b/api/resource/resource.go @@ -10,10 +10,12 @@ import ( "sigs.k8s.io/kustomize/api/filters/patchstrategicmerge" "sigs.k8s.io/kustomize/api/ifc" + "sigs.k8s.io/kustomize/api/internal/wrappy" "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/kustomize/kyaml/kio" + kyaml "sigs.k8s.io/kustomize/kyaml/yaml" "sigs.k8s.io/yaml" ) @@ -437,6 +439,14 @@ func (r *Resource) ApplySmPatch(patch *Resource) error { } func (r *Resource) ApplyFilter(f kio.Filter) error { + if wn, ok := r.kunStr.(*wrappy.WNode); ok { + l, err := f.Filter([]*kyaml.RNode{wn.AsRNode()}) + if len(l) == 0 { + // Hack to deal with deletion. + r.kunStr = wrappy.NewWNode() + } + return err + } return filtersutil.ApplyToJSON(f, r) }