From 5948f6aa63d57fdfadb77ad896b8b40bf9c2ffed Mon Sep 17 00:00:00 2001 From: Agustina Barbetta Date: Thu, 5 May 2022 15:24:22 -0300 Subject: [PATCH] [Address #3937] Add labels to template/metadata if includeTemplates is true (#4209) * add labels in template/metadata by default * update comment * fix kustomization labels test * Add spec/template/metadata/labels when includeTemplate is true * remove unnecessary test changes * add error wrap * Revert "add error wrap" This reverts commit 0a203df83edb90a400b35d5521487b984619e919. * add error wrap at template fieldSpec merge --- .../target/kusttarget_configplugin.go | 8 +++ api/krusty/inlinelabels_test.go | 69 +++++++++++++++++++ api/types/labels.go | 7 +- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/api/internal/target/kusttarget_configplugin.go b/api/internal/target/kusttarget_configplugin.go index 5ad0fc490b..0991c5fac7 100644 --- a/api/internal/target/kusttarget_configplugin.go +++ b/api/internal/target/kusttarget_configplugin.go @@ -7,6 +7,7 @@ import ( "fmt" "path/filepath" + "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" "sigs.k8s.io/kustomize/api/resmap" @@ -285,6 +286,13 @@ var transformerConfigurators = map[builtinhelpers.BuiltinPluginType]func( if label.IncludeSelectors { fss, err = fss.MergeAll(tc.CommonLabels) } else { + // merge spec/template/metadata fieldSpec if includeTemplate flag is true + if label.IncludeTemplates { + fss, err = fss.MergeOne(types.FieldSpec{Path: "spec/template/metadata/labels", CreateIfNotPresent: false}) + if err != nil { + return nil, errors.Wrap(err, "failed to merge template fieldSpec") + } + } // only add to metadata by default fss, err = fss.MergeOne(types.FieldSpec{Path: "metadata/labels", CreateIfNotPresent: true}) } diff --git a/api/krusty/inlinelabels_test.go b/api/krusty/inlinelabels_test.go index 8896924183..2979c27e4f 100644 --- a/api/krusty/inlinelabels_test.go +++ b/api/krusty/inlinelabels_test.go @@ -91,3 +91,72 @@ spec: c: d `) } + +func TestKustomizationLabelsInTemplate(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteF("app/deployment.yaml", ` +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d + name: deployment +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d + template: + metadata: + labels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d +`) + th.WriteK("/app", ` +resources: +- deployment.yaml + +labels: +- pairs: + foo: bar + includeSelectors: false + includeTemplates: true +`) + m := th.Run("/app", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d + foo: bar + name: deployment +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d + template: + metadata: + labels: + app.kubernetes.io/component: a + app.kubernetes.io/instance: b + app.kubernetes.io/name: c + app.kubernetes.io/part-of: d + foo: bar +`) +} diff --git a/api/types/labels.go b/api/types/labels.go index e2a2aee789..05ba890f9d 100644 --- a/api/types/labels.go +++ b/api/types/labels.go @@ -10,7 +10,12 @@ type Label struct { // fieldSpecs for selectors. Custom fieldSpecs specified by // FieldSpecs will be merged with builtin fieldSpecs if this // is true. - IncludeSelectors bool `json:"includeSelectors,omitempty" yaml:"includeSelectors,omitempty"` + IncludeSelectors bool `json:"includeSelectors,omitempty" yaml:"includeSelectors,omitempty"` + // IncludeTemplates inidicates should transformer include the + // spec/template/metadata fieldSpec. Custom fieldSpecs specified by + // FieldSpecs will be merged with spec/template/metadata fieldSpec if this + // is true. If IncludeSelectors is true, IncludeTemplates is not needed. + IncludeTemplates bool `json:"includeTemplates,omitempty" yaml:"includeTemplates,omitempty"` FieldSpecs []FieldSpec `json:"fields,omitempty" yaml:"fields,omitempty"` }