diff --git a/api/builtins/PatchJson6902Transformer.go b/api/builtins/PatchJson6902Transformer.go index dfe4db43b..cb02c4241 100644 --- a/api/builtins/PatchJson6902Transformer.go +++ b/api/builtins/PatchJson6902Transformer.go @@ -12,6 +12,7 @@ import ( "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) @@ -78,12 +79,23 @@ func (p *PatchJson6902TransformerPlugin) Transform(m resmap.ResMap) error { return err } for _, res := range resources { + internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode) + err = res.ApplyFilter(patchjson6902.Filter{ Patch: p.JsonOp, }) if err != nil { return err } + + annotations := res.GetAnnotations() + for key, value := range internalAnnotations { + annotations[key] = value + } + err = res.SetAnnotations(annotations) + if err != nil { + return err + } } return nil } diff --git a/api/builtins/PatchTransformer.go b/api/builtins/PatchTransformer.go index 07038af1e..dc51748c8 100644 --- a/api/builtins/PatchTransformer.go +++ b/api/builtins/PatchTransformer.go @@ -12,6 +12,7 @@ import ( "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) @@ -111,12 +112,19 @@ func (p *PatchTransformerPlugin) transformJson6902(m resmap.ResMap, patch jsonpa } for _, res := range resources { res.StorePreviousId() + internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode) err = res.ApplyFilter(patchjson6902.Filter{ Patch: p.Patch, }) if err != nil { return err } + + annotations := res.GetAnnotations() + for key, value := range internalAnnotations { + annotations[key] = value + } + err = res.SetAnnotations(annotations) } return nil } diff --git a/api/krusty/multiplepatch_test.go b/api/krusty/multiplepatch_test.go index 5fb5fed3f..9935fba53 100644 --- a/api/krusty/multiplepatch_test.go +++ b/api/krusty/multiplepatch_test.go @@ -1646,3 +1646,64 @@ spec: type: NodePort `) } + +// test for #4111 +func TestPatchPreservesInternalAnnotations(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK(".", ` +nameSuffix: -abc +resources: + - fluentd.yaml +patchesJson6902: + - path: patch.yaml + target: + name: fluentd-sa + kind: ServiceAccount + version: v1 +`) + th.WriteF("fluentd.yaml", ` +apiVersion: v1 +kind: DaemonSet +metadata: + name: fluentd +spec: + template: + spec: + containers: + - image: fluentd:latest + name: fluentd + serviceAccountName: fluentd-sa +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fluentd-sa +`) + th.WriteF("patch.yaml", ` +- op: add + path: /metadata/annotations + value: + note: this is a test annotation +`) + m := th.Run(".", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: v1 +kind: DaemonSet +metadata: + name: fluentd-abc +spec: + template: + spec: + containers: + - image: fluentd:latest + name: fluentd + serviceAccountName: fluentd-sa-abc +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + note: this is a test annotation + name: fluentd-sa-abc +`) +} diff --git a/plugin/builtin/patchjson6902transformer/PatchJson6902Transformer.go b/plugin/builtin/patchjson6902transformer/PatchJson6902Transformer.go index 3e4f619c9..19f1c78d2 100644 --- a/plugin/builtin/patchjson6902transformer/PatchJson6902Transformer.go +++ b/plugin/builtin/patchjson6902transformer/PatchJson6902Transformer.go @@ -13,6 +13,7 @@ import ( "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) @@ -82,12 +83,23 @@ func (p *plugin) Transform(m resmap.ResMap) error { return err } for _, res := range resources { + internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode) + err = res.ApplyFilter(patchjson6902.Filter{ Patch: p.JsonOp, }) if err != nil { return err } + + annotations := res.GetAnnotations() + for key, value := range internalAnnotations { + annotations[key] = value + } + err = res.SetAnnotations(annotations) + if err != nil { + return err + } } return nil } diff --git a/plugin/builtin/patchjson6902transformer/go.mod b/plugin/builtin/patchjson6902transformer/go.mod index 8d096afd8..9ca52c2d9 100644 --- a/plugin/builtin/patchjson6902transformer/go.mod +++ b/plugin/builtin/patchjson6902transformer/go.mod @@ -6,6 +6,7 @@ require ( github.com/evanphx/json-patch v4.11.0+incompatible github.com/pkg/errors v0.9.1 sigs.k8s.io/kustomize/api v0.8.9 + sigs.k8s.io/kustomize/kyaml v0.12.0 sigs.k8s.io/yaml v1.2.0 ) diff --git a/plugin/builtin/patchtransformer/PatchTransformer.go b/plugin/builtin/patchtransformer/PatchTransformer.go index 54fe9dedb..2d02cf28f 100644 --- a/plugin/builtin/patchtransformer/PatchTransformer.go +++ b/plugin/builtin/patchtransformer/PatchTransformer.go @@ -13,6 +13,7 @@ import ( "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/yaml" ) @@ -115,12 +116,19 @@ func (p *plugin) transformJson6902(m resmap.ResMap, patch jsonpatch.Patch) error } for _, res := range resources { res.StorePreviousId() + internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode) err = res.ApplyFilter(patchjson6902.Filter{ Patch: p.Patch, }) if err != nil { return err } + + annotations := res.GetAnnotations() + for key, value := range internalAnnotations { + annotations[key] = value + } + err = res.SetAnnotations(annotations) } return nil } diff --git a/plugin/builtin/patchtransformer/go.mod b/plugin/builtin/patchtransformer/go.mod index 59744066f..3a9b85e01 100644 --- a/plugin/builtin/patchtransformer/go.mod +++ b/plugin/builtin/patchtransformer/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/evanphx/json-patch v4.11.0+incompatible sigs.k8s.io/kustomize/api v0.8.9 + sigs.k8s.io/kustomize/kyaml v0.12.0 sigs.k8s.io/yaml v1.2.0 )