...
1
2
3
4 package builtins
5
6 import (
7 "fmt"
8 "reflect"
9
10 "sigs.k8s.io/kustomize/api/filters/replacement"
11 "sigs.k8s.io/kustomize/api/resmap"
12 "sigs.k8s.io/kustomize/api/types"
13 "sigs.k8s.io/yaml"
14 )
15
16
17 type ReplacementTransformerPlugin struct {
18 ReplacementList []types.ReplacementField `json:"replacements,omitempty" yaml:"replacements,omitempty"`
19 Replacements []types.Replacement `json:"omitempty" yaml:"omitempty"`
20 }
21
22 func (p *ReplacementTransformerPlugin) Config(
23 h *resmap.PluginHelpers, c []byte) (err error) {
24 p.ReplacementList = []types.ReplacementField{}
25 if err := yaml.Unmarshal(c, p); err != nil {
26 return err
27 }
28
29 for _, r := range p.ReplacementList {
30 if r.Path != "" && (r.Source != nil || len(r.Targets) != 0) {
31 return fmt.Errorf("cannot specify both path and inline replacement")
32 }
33 if r.Path != "" {
34
35 content, err := h.Loader().Load(r.Path)
36 if err != nil {
37 return err
38 }
39
40 var replacement interface{}
41 err = yaml.Unmarshal(content, &replacement)
42 if err != nil {
43 return err
44 }
45 items := reflect.ValueOf(replacement)
46 switch items.Kind() {
47 case reflect.Slice:
48 repl := []types.Replacement{}
49 if err := yaml.Unmarshal(content, &repl); err != nil {
50 return err
51 }
52 p.Replacements = append(p.Replacements, repl...)
53 case reflect.Map:
54 repl := types.Replacement{}
55 if err := yaml.Unmarshal(content, &repl); err != nil {
56 return err
57 }
58 p.Replacements = append(p.Replacements, repl)
59 default:
60 return fmt.Errorf("unsupported replacement type encountered within replacement path: %v", items.Kind())
61 }
62 } else {
63
64 p.Replacements = append(p.Replacements, r.Replacement)
65 }
66 }
67 return nil
68 }
69
70 func (p *ReplacementTransformerPlugin) Transform(m resmap.ResMap) (err error) {
71 return m.ApplyFilter(replacement.Filter{
72 Replacements: p.Replacements,
73 })
74 }
75
76 func NewReplacementTransformerPlugin() resmap.TransformerPlugin {
77 return &ReplacementTransformerPlugin{}
78 }
79
View as plain text