File: customconfigreusable_test.go

package info (click to toggle)
golang-k8s-sigs-kustomize-api 0.20.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,768 kB
  • sloc: makefile: 206; sh: 67
file content (178 lines) | stat: -rw-r--r-- 4,064 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// 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"
	"sigs.k8s.io/kustomize/api/types"
)

// Demo custom configuration as a base.
// This test shows usage of three custom configurations sitting
// in a base, allowing them to be reused in any number of
// kustomizations.
func TestReusableCustomTransformers(t *testing.T) {
	th := kusttest_test.MakeEnhancedHarness(t).
		PrepBuiltin("AnnotationsTransformer").
		PrepBuiltin("LabelTransformer")
	th.GetPluginConfig().BpLoadingOptions = types.BploUseStaticallyLinked
	defer th.Reset()

	// First write three custom configurations for builtin plugins.

	// A custom name prefixer that only touches Deployments and Services.
	th.WriteF("mytransformers/deploymentServicePrefixer.yaml", `
apiVersion: builtin
kind: PrefixSuffixTransformer
metadata:
  name: myPrefixer
prefix: bob-
fieldSpecs:
- kind: Deployment
  path: metadata/name
- kind: Service
  path: metadata/name
`)

	// A custom annotator exclusively annotating Roles.
	th.WriteF("mytransformers/roleAnnotator.yaml", `
apiVersion: builtin
kind: AnnotationsTransformer
metadata:
  name: myAnnotator
annotations:
  # Imagine that SRE has not approved this role yet.
  status: probationary
fieldSpecs:
- path: metadata/annotations
  create: true
  kind: Role
`)

	// A custom labeller that only labels Deployments,
	// and only labels them at their top metadata level
	// exclusively.  It does not modify selectors or
	// add labels to pods in the template.
	th.WriteF("mytransformers/deploymentLabeller.yaml", `
apiVersion: builtin
kind: LabelTransformer
metadata:
  name: myLabeller
labels:
  pager: 867-5301
fieldSpecs:
- path: metadata/labels
  create: true
  kind: Deployment
`)

	// Combine these custom transformers in one kustomization file.
	// This kustomization file contains only resources that
	// all happen to be plugin configurations. This makes
	// these plugins re-usable as a group in any number of other
	// kustomizations.
	th.WriteK("mytransformers", `
resources:
- deploymentServicePrefixer.yaml
- roleAnnotator.yaml
- deploymentLabeller.yaml
`)

	// Finally, define the kustomization for the (arbitrarily named)
	// staging environment.
	th.WriteK("staging", `

# Bring in the custom transformers.
transformers:
- ../mytransformers

# Also use the "classic" labeller, which behind the scenes uses
# the LabelTransformer, but with a broad configuration targeting
# many resources and fields (including selector fields).
# It's a big hammer - probably too big; the output shows all the
# places 'acmeCorp' now appears as a result.  To avoid this,
# define your own config for your own LabelTransformer instance
# as shown above.
commonLabels:
  company: acmeCorp  

# Specify the resources to modify.
resources:
- deployment.yaml
- role.yaml
- service.yaml
`)
	th.WriteF("staging/deployment.yaml", `
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myDeployment
spec:
  template:
    metadata:
      labels:
        backend: flawless
    spec:
      containers:
      - name: whatever
        image: whatever
`)
	th.WriteF("staging/role.yaml", `
apiVersion: v1
kind: Role
metadata:
  name: myRole
`)
	th.WriteF("staging/service.yaml", `
apiVersion: v1
kind: Service
metadata:
  name: myService
`)

	m := th.Run("staging", th.MakeDefaultOptions())
	th.AssertActualEqualsExpected(m, `
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    company: acmeCorp
    pager: 867-5301
  name: bob-myDeployment
spec:
  selector:
    matchLabels:
      company: acmeCorp
  template:
    metadata:
      labels:
        backend: flawless
        company: acmeCorp
    spec:
      containers:
      - image: whatever
        name: whatever
---
apiVersion: v1
kind: Role
metadata:
  annotations:
    status: probationary
  labels:
    company: acmeCorp
  name: myRole
---
apiVersion: v1
kind: Service
metadata:
  labels:
    company: acmeCorp
  name: bob-myService
spec:
  selector:
    company: acmeCorp
`)
}