...
1
2
3
4 package builtins
5
6 import (
7 "fmt"
8
9 "sigs.k8s.io/kustomize/api/resmap"
10 "sigs.k8s.io/kustomize/api/resource"
11 "sigs.k8s.io/kustomize/api/types"
12 "sigs.k8s.io/yaml"
13 )
14
15 type PatchStrategicMergeTransformerPlugin struct {
16 loadedPatches []*resource.Resource
17 Paths []types.PatchStrategicMerge `json:"paths,omitempty" yaml:"paths,omitempty"`
18 Patches string `json:"patches,omitempty" yaml:"patches,omitempty"`
19 }
20
21 func (p *PatchStrategicMergeTransformerPlugin) Config(
22 h *resmap.PluginHelpers, c []byte) (err error) {
23 err = yaml.Unmarshal(c, p)
24 if err != nil {
25 return err
26 }
27 if len(p.Paths) == 0 && p.Patches == "" {
28 return fmt.Errorf("empty file path and empty patch content")
29 }
30 if len(p.Paths) != 0 {
31 patches, err := loadFromPaths(h, p.Paths)
32 if err != nil {
33 return err
34 }
35 p.loadedPatches = append(p.loadedPatches, patches...)
36 }
37 if p.Patches != "" {
38 patches, err := h.ResmapFactory().RF().SliceFromBytes([]byte(p.Patches))
39 if err != nil {
40 return err
41 }
42 p.loadedPatches = append(p.loadedPatches, patches...)
43 }
44 if len(p.loadedPatches) == 0 {
45 return fmt.Errorf(
46 "patch appears to be empty; files=%v, Patch=%s", p.Paths, p.Patches)
47 }
48 return nil
49 }
50
51 func loadFromPaths(
52 h *resmap.PluginHelpers,
53 paths []types.PatchStrategicMerge) (
54 result []*resource.Resource, err error) {
55 var patches []*resource.Resource
56 for _, path := range paths {
57
58
59 patches, err = h.ResmapFactory().RF().SliceFromBytes([]byte(path))
60 if err != nil {
61
62 patches, err = h.ResmapFactory().RF().SliceFromPatches(
63 h.Loader(), []types.PatchStrategicMerge{path})
64 if err != nil {
65 return
66 }
67 }
68 result = append(result, patches...)
69 }
70 return
71 }
72
73 func (p *PatchStrategicMergeTransformerPlugin) Transform(m resmap.ResMap) error {
74 for _, patch := range p.loadedPatches {
75 target, err := m.GetById(patch.OrgId())
76 if err != nil {
77 return err
78 }
79 if err = m.ApplySmPatch(
80 resource.MakeIdSet([]*resource.Resource{target}), patch); err != nil {
81 return err
82 }
83 }
84 return nil
85 }
86
87 func NewPatchStrategicMergeTransformerPlugin() resmap.TransformerPlugin {
88 return &PatchStrategicMergeTransformerPlugin{}
89 }
90
View as plain text