mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-17 18:25:26 +00:00
* feat: support labels key in transformer configuration Allow the usage of a separate transformer configuration for the labels key, similar to what is currently available for commonLabels and commonAnnotations. This aims to provide the same functionality that commonLabels currently provide for labels, since commonLabels is deprecated and slated for removal in a future release. * chore(transformerconfig): add nolint hint Add a nolint hint to the new method so the returns can stay consistent with one another. * fix: changes from code review * Rename methods `AddCommonLabelFieldSpec` and `AddLabelFieldSpec` to `AddCommonLabelsFieldSpec` and `AddLabelsFieldSpec`. * Add extra test to verify scenarios applying labels to Custom Resource Definitions.
735 lines
14 KiB
Go
735 lines
14 KiB
Go
// Copyright 2019 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package krusty_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
|
|
)
|
|
|
|
func makeBaseReferencingCustomConfig(th kusttest_test.Harness) {
|
|
th.WriteK("base", `
|
|
namePrefix: x-
|
|
commonLabels:
|
|
app: myApp
|
|
vars:
|
|
- name: APRIL_DIET
|
|
objref:
|
|
group: foo
|
|
version: v1
|
|
kind: Giraffe
|
|
name: april
|
|
fieldref:
|
|
fieldpath: spec.diet
|
|
- name: KOKO_DIET
|
|
objref:
|
|
group: foo
|
|
version: v1
|
|
kind: Gorilla
|
|
name: koko
|
|
fieldref:
|
|
fieldpath: spec.diet
|
|
resources:
|
|
- animalPark.yaml
|
|
- giraffes.yaml
|
|
- gorilla.yaml
|
|
configurations:
|
|
- config/defaults.yaml
|
|
- config/custom.yaml
|
|
`)
|
|
th.WriteF("base/giraffes.yaml", `
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
name: april
|
|
spec:
|
|
diet: mimosa
|
|
location: NE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
name: may
|
|
spec:
|
|
diet: acacia
|
|
location: SE
|
|
`)
|
|
th.WriteF("base/gorilla.yaml", `
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
name: koko
|
|
spec:
|
|
diet: bambooshoots
|
|
location: SW
|
|
`)
|
|
th.WriteF("base/animalPark.yaml", `
|
|
apiVersion: foo/v1
|
|
kind: AnimalPark
|
|
metadata:
|
|
name: sandiego
|
|
spec:
|
|
gorillaRef:
|
|
name: koko
|
|
giraffeRef:
|
|
name: april
|
|
food:
|
|
- "$(APRIL_DIET)"
|
|
- "$(KOKO_DIET)"
|
|
`)
|
|
}
|
|
|
|
func TestCustomConfig(t *testing.T) {
|
|
th := kusttest_test.MakeHarness(t)
|
|
makeBaseReferencingCustomConfig(th)
|
|
th.WriteLegacyConfigs("base/config/defaults.yaml")
|
|
th.WriteF("base/config/custom.yaml", `
|
|
nameReference:
|
|
- kind: Gorilla
|
|
fieldSpecs:
|
|
- kind: AnimalPark
|
|
path: spec/gorillaRef/name
|
|
- kind: Giraffe
|
|
fieldSpecs:
|
|
- kind: AnimalPark
|
|
path: spec/giraffeRef/name
|
|
varReference:
|
|
- path: spec/food
|
|
kind: AnimalPark
|
|
`)
|
|
m := th.Run("base", th.MakeDefaultOptions())
|
|
th.AssertActualEqualsExpected(m, `
|
|
apiVersion: foo/v1
|
|
kind: AnimalPark
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-sandiego
|
|
spec:
|
|
food:
|
|
- mimosa
|
|
- bambooshoots
|
|
giraffeRef:
|
|
name: x-april
|
|
gorillaRef:
|
|
name: x-koko
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-april
|
|
spec:
|
|
diet: mimosa
|
|
location: NE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-may
|
|
spec:
|
|
diet: acacia
|
|
location: SE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-koko
|
|
spec:
|
|
diet: bambooshoots
|
|
location: SW
|
|
`)
|
|
}
|
|
|
|
func TestCustomConfigWithDefaultOverspecification(t *testing.T) {
|
|
th := kusttest_test.MakeHarness(t)
|
|
makeBaseReferencingCustomConfig(th)
|
|
th.WriteLegacyConfigs("base/config/defaults.yaml")
|
|
// Specifying namePrefix here conflicts with (is the same as)
|
|
// the defaults written above. This is intentional in the
|
|
// test to assure duplicate config doesn't cause problems.
|
|
th.WriteF("base/config/custom.yaml", `
|
|
namePrefix:
|
|
- path: metadata/name
|
|
nameReference:
|
|
- kind: Gorilla
|
|
fieldSpecs:
|
|
- kind: AnimalPark
|
|
path: spec/gorillaRef/name
|
|
- kind: Giraffe
|
|
fieldSpecs:
|
|
- kind: AnimalPark
|
|
path: spec/giraffeRef/name
|
|
varReference:
|
|
- path: spec/food
|
|
kind: AnimalPark
|
|
`)
|
|
m := th.Run("base", th.MakeDefaultOptions())
|
|
th.AssertActualEqualsExpected(m, `
|
|
apiVersion: foo/v1
|
|
kind: AnimalPark
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-sandiego
|
|
spec:
|
|
food:
|
|
- mimosa
|
|
- bambooshoots
|
|
giraffeRef:
|
|
name: x-april
|
|
gorillaRef:
|
|
name: x-koko
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-april
|
|
spec:
|
|
diet: mimosa
|
|
location: NE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-may
|
|
spec:
|
|
diet: acacia
|
|
location: SE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
name: x-koko
|
|
spec:
|
|
diet: bambooshoots
|
|
location: SW
|
|
`)
|
|
}
|
|
|
|
func TestFixedBug605_BaseCustomizationAvailableInOverlay(t *testing.T) {
|
|
th := kusttest_test.MakeHarness(t)
|
|
makeBaseReferencingCustomConfig(th)
|
|
th.WriteLegacyConfigs("base/config/defaults.yaml")
|
|
th.WriteF("base/config/custom.yaml", `
|
|
nameReference:
|
|
- kind: Gorilla
|
|
fieldSpecs:
|
|
- group: foo
|
|
version: v1
|
|
kind: AnimalPark
|
|
path: spec/gorillaRef/name
|
|
- kind: Giraffe
|
|
fieldSpecs:
|
|
- group: foo
|
|
version: v1
|
|
kind: AnimalPark
|
|
path: spec/giraffeRef/name
|
|
varReference:
|
|
- path: spec/food
|
|
group: foo
|
|
version: v1
|
|
kind: AnimalPark
|
|
`)
|
|
th.WriteK("overlay", `
|
|
namePrefix: o-
|
|
commonLabels:
|
|
movie: planetOfTheApes
|
|
patchesStrategicMerge:
|
|
- animalPark.yaml
|
|
resources:
|
|
- ../base
|
|
- ursus.yaml
|
|
`)
|
|
th.WriteF("overlay/ursus.yaml", `
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
name: ursus
|
|
spec:
|
|
diet: heston
|
|
location: Arizona
|
|
`)
|
|
// The following replaces the gorillaRef in the AnimalPark.
|
|
th.WriteF("overlay/animalPark.yaml", `
|
|
apiVersion: foo/v1
|
|
kind: AnimalPark
|
|
metadata:
|
|
name: sandiego
|
|
spec:
|
|
gorillaRef:
|
|
name: ursus
|
|
`)
|
|
m := th.Run("overlay", th.MakeDefaultOptions())
|
|
th.AssertActualEqualsExpected(m, `
|
|
apiVersion: foo/v1
|
|
kind: AnimalPark
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
movie: planetOfTheApes
|
|
name: o-x-sandiego
|
|
spec:
|
|
food:
|
|
- mimosa
|
|
- bambooshoots
|
|
giraffeRef:
|
|
name: o-x-april
|
|
gorillaRef:
|
|
name: o-ursus
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
movie: planetOfTheApes
|
|
name: o-x-april
|
|
spec:
|
|
diet: mimosa
|
|
location: NE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Giraffe
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
movie: planetOfTheApes
|
|
name: o-x-may
|
|
spec:
|
|
diet: acacia
|
|
location: SE
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
labels:
|
|
app: myApp
|
|
movie: planetOfTheApes
|
|
name: o-x-koko
|
|
spec:
|
|
diet: bambooshoots
|
|
location: SW
|
|
---
|
|
apiVersion: foo/v1
|
|
kind: Gorilla
|
|
metadata:
|
|
labels:
|
|
movie: planetOfTheApes
|
|
name: o-ursus
|
|
spec:
|
|
diet: heston
|
|
location: Arizona
|
|
`)
|
|
}
|
|
|
|
func TestLabelTransformerConfig(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
kustomization string
|
|
transformerConfig string
|
|
expectedResult string
|
|
}{
|
|
{
|
|
name: "includeSelectors=false, includeTemplates=false, include template via transformerConfig",
|
|
kustomization: `configurations:
|
|
- config/configurations.yaml
|
|
|
|
labels:
|
|
- includeSelectors: false
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/deployment.yaml
|
|
`,
|
|
transformerConfig: `labels:
|
|
- path: spec/template/metadata/labels
|
|
create: true
|
|
kind: Deployment
|
|
`,
|
|
expectedResult: `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-deploy
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: sample-deploy
|
|
strategy: {}
|
|
template:
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
spec:
|
|
containers:
|
|
- image: hello-world:latest
|
|
name: hello-world
|
|
`,
|
|
},
|
|
{
|
|
name: "includeSelectors=true, includeTemplates=false, include template via transformerConfig",
|
|
kustomization: `configurations:
|
|
- config/configurations.yaml
|
|
|
|
labels:
|
|
- includeSelectors: true
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/deployment.yaml
|
|
`,
|
|
transformerConfig: `labels:
|
|
- path: spec/template/metadata/labels
|
|
create: true
|
|
kind: Deployment
|
|
`,
|
|
expectedResult: `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-deploy
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
strategy: {}
|
|
template:
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
spec:
|
|
containers:
|
|
- image: hello-world:latest
|
|
name: hello-world
|
|
`,
|
|
},
|
|
{
|
|
name: "includeSelectors=false, includeTemplates=true, no transformerConfig",
|
|
kustomization: `labels:
|
|
- includeSelectors: false
|
|
includeTemplates: true
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/deployment.yaml
|
|
`,
|
|
expectedResult: `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-deploy
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: sample-deploy
|
|
strategy: {}
|
|
template:
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
spec:
|
|
containers:
|
|
- image: hello-world:latest
|
|
name: hello-world
|
|
`,
|
|
},
|
|
{
|
|
name: "includeSelectors=false, includeTemplates=false, no transformerConfig",
|
|
kustomization: `labels:
|
|
- includeSelectors: false
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/deployment.yaml
|
|
`,
|
|
expectedResult: `apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-deploy
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: sample-deploy
|
|
strategy: {}
|
|
template:
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
spec:
|
|
containers:
|
|
- image: hello-world:latest
|
|
name: hello-world
|
|
`,
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
th := kusttest_test.MakeHarness(t)
|
|
th.WriteK(".", tc.kustomization)
|
|
th.WriteF("resources/deployment.yaml",
|
|
`apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
name: sample-deploy
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: sample-deploy
|
|
|
|
strategy: {}
|
|
template:
|
|
metadata:
|
|
creationTimestamp: null
|
|
labels:
|
|
app: sample-deploy
|
|
spec:
|
|
containers:
|
|
- image: hello-world:latest
|
|
name: hello-world
|
|
`)
|
|
if tc.transformerConfig != "" {
|
|
th.WriteF("config/configurations.yaml", tc.transformerConfig)
|
|
}
|
|
|
|
output := th.Run(".", th.MakeDefaultOptions())
|
|
|
|
th.AssertActualEqualsExpected(output, tc.expectedResult)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLabelTransformerConfigWithCustomResources(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
kustomization string
|
|
transformerConfig string
|
|
expectedResult string
|
|
}{
|
|
{
|
|
name: "include template via transformerConfig",
|
|
kustomization: `configurations:
|
|
- config/configurations.yaml
|
|
|
|
labels:
|
|
- includeSelectors: false
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/custom-resource.yaml
|
|
`,
|
|
transformerConfig: `labels:
|
|
- path: spec/template/metadata/labels
|
|
create: true
|
|
kind: SampleResource
|
|
`,
|
|
expectedResult: `apiVersion: custom.example.org/v1
|
|
kind: SampleResource
|
|
metadata:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-resource
|
|
namespace: sample-namespace
|
|
spec:
|
|
template:
|
|
metadata:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
spec:
|
|
containers:
|
|
- env:
|
|
- name: VARIABLE
|
|
value: value
|
|
image: index.docker.io/library/hello-world
|
|
`,
|
|
},
|
|
{
|
|
name: "include selector via transformerConfig",
|
|
kustomization: `configurations:
|
|
- config/configurations.yaml
|
|
|
|
labels:
|
|
- includeSelectors: false
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/custom-resource.yaml
|
|
`,
|
|
transformerConfig: `labels:
|
|
- path: spec/selectors/labels
|
|
create: true
|
|
kind: SampleResource
|
|
`,
|
|
expectedResult: `apiVersion: custom.example.org/v1
|
|
kind: SampleResource
|
|
metadata:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-resource
|
|
namespace: sample-namespace
|
|
spec:
|
|
selectors:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
template:
|
|
spec:
|
|
containers:
|
|
- env:
|
|
- name: VARIABLE
|
|
value: value
|
|
image: index.docker.io/library/hello-world
|
|
`,
|
|
},
|
|
{
|
|
name: "include selectors and labels via transformerConfig",
|
|
kustomization: `configurations:
|
|
- config/configurations.yaml
|
|
|
|
labels:
|
|
- includeSelectors: false
|
|
includeTemplates: false
|
|
pairs:
|
|
location: planet-earth
|
|
environment: dev
|
|
|
|
resources:
|
|
- resources/custom-resource.yaml
|
|
`,
|
|
transformerConfig: `
|
|
labels:
|
|
- path: spec/selectors/labels
|
|
create: true
|
|
kind: SampleResource
|
|
- path: spec/template/metadata/labels
|
|
create: true
|
|
kind: SampleResource
|
|
`,
|
|
expectedResult: `apiVersion: custom.example.org/v1
|
|
kind: SampleResource
|
|
metadata:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
name: sample-resource
|
|
namespace: sample-namespace
|
|
spec:
|
|
selectors:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
template:
|
|
metadata:
|
|
labels:
|
|
environment: dev
|
|
location: planet-earth
|
|
spec:
|
|
containers:
|
|
- env:
|
|
- name: VARIABLE
|
|
value: value
|
|
image: index.docker.io/library/hello-world
|
|
`,
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
th := kusttest_test.MakeHarness(t)
|
|
th.WriteK(".", tc.kustomization)
|
|
th.WriteF("resources/custom-resource.yaml",
|
|
`apiVersion: custom.example.org/v1
|
|
kind: SampleResource
|
|
metadata:
|
|
name: sample-resource
|
|
namespace: sample-namespace
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: index.docker.io/library/hello-world
|
|
env:
|
|
- name: VARIABLE
|
|
value: value
|
|
`)
|
|
|
|
th.WriteF("config/configurations.yaml", tc.transformerConfig)
|
|
|
|
output := th.Run(".", th.MakeDefaultOptions())
|
|
|
|
th.AssertActualEqualsExpected(output, tc.expectedResult)
|
|
})
|
|
}
|
|
}
|