1
2
3
4 package target
5
6 import (
7 "fmt"
8 "path/filepath"
9
10 "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig"
11 "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers"
12 "sigs.k8s.io/kustomize/api/resmap"
13 "sigs.k8s.io/kustomize/api/resource"
14 "sigs.k8s.io/kustomize/api/types"
15 "sigs.k8s.io/kustomize/kyaml/errors"
16 "sigs.k8s.io/kustomize/kyaml/yaml"
17 )
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 func (kt *KustTarget) configureBuiltinGenerators() (
35 result []*resmap.GeneratorWithProperties, err error) {
36 for _, bpt := range []builtinhelpers.BuiltinPluginType{
37 builtinhelpers.ConfigMapGenerator,
38 builtinhelpers.SecretGenerator,
39 builtinhelpers.HelmChartInflationGenerator,
40 } {
41 r, err := generatorConfigurators[bpt](
42 kt, bpt, builtinhelpers.GeneratorFactories[bpt])
43 if err != nil {
44 return nil, err
45 }
46
47 var generatorOrigin *resource.Origin
48 if kt.origin != nil {
49 generatorOrigin = &resource.Origin{
50 Repo: kt.origin.Repo,
51 Ref: kt.origin.Ref,
52 ConfiguredIn: filepath.Join(kt.origin.Path, kt.kustFileName),
53 ConfiguredBy: yaml.ResourceIdentifier{
54 TypeMeta: yaml.TypeMeta{
55 APIVersion: "builtin",
56 Kind: bpt.String(),
57 },
58 },
59 }
60 }
61
62 for i := range r {
63 result = append(result, &resmap.GeneratorWithProperties{Generator: r[i], Origin: generatorOrigin})
64 }
65 }
66 return result, nil
67 }
68
69 func (kt *KustTarget) configureBuiltinTransformers(
70 tc *builtinconfig.TransformerConfig) (
71 result []*resmap.TransformerWithProperties, err error) {
72 for _, bpt := range []builtinhelpers.BuiltinPluginType{
73 builtinhelpers.PatchStrategicMergeTransformer,
74 builtinhelpers.PatchTransformer,
75 builtinhelpers.NamespaceTransformer,
76 builtinhelpers.PrefixTransformer,
77 builtinhelpers.SuffixTransformer,
78 builtinhelpers.LabelTransformer,
79 builtinhelpers.AnnotationsTransformer,
80 builtinhelpers.PatchJson6902Transformer,
81 builtinhelpers.ReplicaCountTransformer,
82 builtinhelpers.ImageTagTransformer,
83 builtinhelpers.ReplacementTransformer,
84 } {
85 r, err := transformerConfigurators[bpt](
86 kt, bpt, builtinhelpers.TransformerFactories[bpt], tc)
87 if err != nil {
88 return nil, err
89 }
90 var transformerOrigin *resource.Origin
91 if kt.origin != nil {
92 transformerOrigin = &resource.Origin{
93 Repo: kt.origin.Repo,
94 Ref: kt.origin.Ref,
95 ConfiguredIn: filepath.Join(kt.origin.Path, kt.kustFileName),
96 ConfiguredBy: yaml.ResourceIdentifier{
97 TypeMeta: yaml.TypeMeta{
98 APIVersion: "builtin",
99 Kind: bpt.String(),
100 },
101 },
102 }
103 }
104 for i := range r {
105 result = append(result, &resmap.TransformerWithProperties{Transformer: r[i], Origin: transformerOrigin})
106 }
107 }
108 return result, nil
109 }
110
111 type gFactory func() resmap.GeneratorPlugin
112
113 var generatorConfigurators = map[builtinhelpers.BuiltinPluginType]func(
114 kt *KustTarget,
115 bpt builtinhelpers.BuiltinPluginType,
116 factory gFactory) (result []resmap.Generator, err error){
117 builtinhelpers.SecretGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) (
118 result []resmap.Generator, err error) {
119 var c struct {
120 types.SecretArgs
121 }
122 for _, args := range kt.kustomization.SecretGenerator {
123 c.SecretArgs = args
124 c.SecretArgs.Options = types.MergeGlobalOptionsIntoLocal(
125 c.SecretArgs.Options, kt.kustomization.GeneratorOptions)
126 p := f()
127 err := kt.configureBuiltinPlugin(p, c, bpt)
128 if err != nil {
129 return nil, err
130 }
131 result = append(result, p)
132 }
133 return
134 },
135
136 builtinhelpers.ConfigMapGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) (
137 result []resmap.Generator, err error) {
138 var c struct {
139 types.ConfigMapArgs
140 }
141 for _, args := range kt.kustomization.ConfigMapGenerator {
142 c.ConfigMapArgs = args
143 c.ConfigMapArgs.Options = types.MergeGlobalOptionsIntoLocal(
144 c.ConfigMapArgs.Options, kt.kustomization.GeneratorOptions)
145 p := f()
146 err := kt.configureBuiltinPlugin(p, c, bpt)
147 if err != nil {
148 return nil, err
149 }
150 result = append(result, p)
151 }
152 return
153 },
154
155 builtinhelpers.HelmChartInflationGenerator: func(
156 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) (
157 result []resmap.Generator, err error) {
158 var c struct {
159 types.HelmGlobals
160 types.HelmChart
161 }
162 var globals types.HelmGlobals
163 if kt.kustomization.HelmGlobals != nil {
164 globals = *kt.kustomization.HelmGlobals
165 }
166 for _, chart := range kt.kustomization.HelmCharts {
167 c.HelmGlobals = globals
168 c.HelmChart = chart
169 p := f()
170 if err = kt.configureBuiltinPlugin(p, c, bpt); err != nil {
171 return nil, err
172 }
173 result = append(result, p)
174 }
175 return
176 },
177 }
178
179 type tFactory func() resmap.TransformerPlugin
180
181 var transformerConfigurators = map[builtinhelpers.BuiltinPluginType]func(
182 kt *KustTarget,
183 bpt builtinhelpers.BuiltinPluginType,
184 f tFactory,
185 tc *builtinconfig.TransformerConfig) (result []resmap.Transformer, err error){
186 builtinhelpers.NamespaceTransformer: func(
187 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
188 result []resmap.Transformer, err error) {
189 if kt.kustomization.Namespace == "" {
190 return
191 }
192 var c struct {
193 types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty"`
194 FieldSpecs []types.FieldSpec
195 }
196 c.Namespace = kt.kustomization.Namespace
197 c.FieldSpecs = tc.NameSpace
198 p := f()
199 err = kt.configureBuiltinPlugin(p, c, bpt)
200 if err != nil {
201 return nil, err
202 }
203 result = append(result, p)
204 return
205 },
206
207 builtinhelpers.PatchJson6902Transformer: func(
208 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) (
209 result []resmap.Transformer, err error) {
210 var c struct {
211 Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"`
212 Path string `json:"path,omitempty" yaml:"path,omitempty"`
213 JsonOp string `json:"jsonOp,omitempty" yaml:"jsonOp,omitempty"`
214 }
215 for _, args := range kt.kustomization.PatchesJson6902 {
216 c.Target = args.Target
217 c.Path = args.Path
218 c.JsonOp = args.Patch
219 p := f()
220 err = kt.configureBuiltinPlugin(p, c, bpt)
221 if err != nil {
222 return nil, err
223 }
224 result = append(result, p)
225 }
226 return
227 },
228 builtinhelpers.PatchStrategicMergeTransformer: func(
229 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) (
230 result []resmap.Transformer, err error) {
231 if len(kt.kustomization.PatchesStrategicMerge) == 0 {
232 return
233 }
234 var c struct {
235 Paths []types.PatchStrategicMerge `json:"paths,omitempty" yaml:"paths,omitempty"`
236 }
237 c.Paths = kt.kustomization.PatchesStrategicMerge
238 p := f()
239 err = kt.configureBuiltinPlugin(p, c, bpt)
240 if err != nil {
241 return nil, err
242 }
243 result = append(result, p)
244 return
245 },
246 builtinhelpers.PatchTransformer: func(
247 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) (
248 result []resmap.Transformer, err error) {
249 if len(kt.kustomization.Patches) == 0 {
250 return
251 }
252 var c struct {
253 Path string `json:"path,omitempty" yaml:"path,omitempty"`
254 Patch string `json:"patch,omitempty" yaml:"patch,omitempty"`
255 Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"`
256 Options map[string]bool `json:"options,omitempty" yaml:"options,omitempty"`
257 }
258 for _, pc := range kt.kustomization.Patches {
259 c.Target = pc.Target
260 c.Patch = pc.Patch
261 c.Path = pc.Path
262 c.Options = pc.Options
263 p := f()
264 err = kt.configureBuiltinPlugin(p, c, bpt)
265 if err != nil {
266 return nil, err
267 }
268 result = append(result, p)
269 }
270 return
271 },
272 builtinhelpers.LabelTransformer: func(
273 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
274 result []resmap.Transformer, err error) {
275 if len(kt.kustomization.Labels) == 0 && len(kt.kustomization.CommonLabels) == 0 {
276 return
277 }
278 for _, label := range kt.kustomization.Labels {
279 var c struct {
280 Labels map[string]string
281 FieldSpecs []types.FieldSpec
282 }
283 c.Labels = label.Pairs
284 fss := types.FsSlice(label.FieldSpecs)
285
286 if label.IncludeSelectors {
287 fss, err = fss.MergeAll(tc.CommonLabels)
288 } else {
289
290 if label.IncludeTemplates {
291 fss, err = fss.MergeAll(tc.TemplateLabels)
292 if err != nil {
293 return nil, errors.WrapPrefixf(err, "failed to merge template fieldSpec")
294 }
295 }
296
297 fss, err = fss.MergeOne(types.FieldSpec{Path: "metadata/labels", CreateIfNotPresent: true})
298 }
299 if err != nil {
300 return nil, err
301 }
302 c.FieldSpecs = fss
303 p := f()
304 err = kt.configureBuiltinPlugin(p, c, bpt)
305 if err != nil {
306 return nil, err
307 }
308 result = append(result, p)
309 }
310 var c struct {
311 Labels map[string]string
312 FieldSpecs []types.FieldSpec
313 }
314 c.Labels = kt.kustomization.CommonLabels
315 c.FieldSpecs = tc.CommonLabels
316 p := f()
317 err = kt.configureBuiltinPlugin(p, c, bpt)
318 if err != nil {
319 return nil, err
320 }
321 result = append(result, p)
322 return
323 },
324 builtinhelpers.AnnotationsTransformer: func(
325 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
326 result []resmap.Transformer, err error) {
327 if len(kt.kustomization.CommonAnnotations) == 0 {
328 return
329 }
330 var c struct {
331 Annotations map[string]string
332 FieldSpecs []types.FieldSpec
333 }
334 c.Annotations = kt.kustomization.CommonAnnotations
335 c.FieldSpecs = tc.CommonAnnotations
336 p := f()
337 err = kt.configureBuiltinPlugin(p, c, bpt)
338 if err != nil {
339 return nil, err
340 }
341 result = append(result, p)
342 return
343 },
344 builtinhelpers.PrefixTransformer: func(
345 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
346 result []resmap.Transformer, err error) {
347 if kt.kustomization.NamePrefix == "" {
348 return
349 }
350 var c struct {
351 Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
352 FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"`
353 }
354 c.Prefix = kt.kustomization.NamePrefix
355 c.FieldSpecs = tc.NamePrefix
356 p := f()
357 err = kt.configureBuiltinPlugin(p, c, bpt)
358 if err != nil {
359 return nil, err
360 }
361 result = append(result, p)
362 return
363 },
364 builtinhelpers.SuffixTransformer: func(
365 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
366 result []resmap.Transformer, err error) {
367 if kt.kustomization.NameSuffix == "" {
368 return
369 }
370 var c struct {
371 Suffix string `json:"suffix,omitempty" yaml:"suffix,omitempty"`
372 FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"`
373 }
374 c.Suffix = kt.kustomization.NameSuffix
375 c.FieldSpecs = tc.NameSuffix
376 p := f()
377 err = kt.configureBuiltinPlugin(p, c, bpt)
378 if err != nil {
379 return nil, err
380 }
381 result = append(result, p)
382 return
383 },
384 builtinhelpers.ImageTagTransformer: func(
385 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
386 result []resmap.Transformer, err error) {
387 var c struct {
388 ImageTag types.Image
389 FieldSpecs []types.FieldSpec
390 }
391 for _, args := range kt.kustomization.Images {
392 c.ImageTag = args
393 c.FieldSpecs = tc.Images
394 p := f()
395 err = kt.configureBuiltinPlugin(p, c, bpt)
396 if err != nil {
397 return nil, err
398 }
399 result = append(result, p)
400 }
401 return
402 },
403 builtinhelpers.ReplacementTransformer: func(
404 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, _ *builtinconfig.TransformerConfig) (
405 result []resmap.Transformer, err error) {
406 if len(kt.kustomization.Replacements) == 0 {
407 return
408 }
409 var c struct {
410 Replacements []types.ReplacementField
411 }
412 c.Replacements = kt.kustomization.Replacements
413 p := f()
414 err = kt.configureBuiltinPlugin(p, c, bpt)
415 if err != nil {
416 return nil, err
417 }
418 result = append(result, p)
419 return result, nil
420 },
421 builtinhelpers.ReplicaCountTransformer: func(
422 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
423 result []resmap.Transformer, err error) {
424 var c struct {
425 Replica types.Replica
426 FieldSpecs []types.FieldSpec
427 }
428 for _, args := range kt.kustomization.Replicas {
429 c.Replica = args
430 c.FieldSpecs = tc.Replicas
431 p := f()
432 err = kt.configureBuiltinPlugin(p, c, bpt)
433 if err != nil {
434 return nil, err
435 }
436 result = append(result, p)
437 }
438 return
439 },
440
441 builtinhelpers.ValueAddTransformer: func(
442 kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f tFactory, tc *builtinconfig.TransformerConfig) (
443 result []resmap.Transformer, err error) {
444 return nil, fmt.Errorf("valueadd keyword not yet defined")
445 },
446 }
447
View as plain text