...
1
2
3
4 package builtins
5
6 import (
7 "fmt"
8
9 jsonpatch "gopkg.in/evanphx/json-patch.v4"
10 "sigs.k8s.io/kustomize/api/filters/patchjson6902"
11 "sigs.k8s.io/kustomize/api/ifc"
12 "sigs.k8s.io/kustomize/api/resmap"
13 "sigs.k8s.io/kustomize/api/types"
14 "sigs.k8s.io/kustomize/kyaml/errors"
15 "sigs.k8s.io/kustomize/kyaml/kio/kioutil"
16 "sigs.k8s.io/yaml"
17 )
18
19 type PatchJson6902TransformerPlugin struct {
20 ldr ifc.Loader
21 decodedPatch jsonpatch.Patch
22 Target *types.Selector `json:"target,omitempty" yaml:"target,omitempty"`
23 Path string `json:"path,omitempty" yaml:"path,omitempty"`
24 JsonOp string `json:"jsonOp,omitempty" yaml:"jsonOp,omitempty"`
25 }
26
27 func (p *PatchJson6902TransformerPlugin) Config(
28 h *resmap.PluginHelpers, c []byte) (err error) {
29 p.ldr = h.Loader()
30 err = yaml.Unmarshal(c, p)
31 if err != nil {
32 return err
33 }
34 if p.Target.Name == "" {
35 return fmt.Errorf("must specify the target name")
36 }
37 if p.Path == "" && p.JsonOp == "" {
38 return fmt.Errorf("empty file path and empty jsonOp")
39 }
40 if p.Path != "" {
41 if p.JsonOp != "" {
42 return fmt.Errorf("must specify a file path or jsonOp, not both")
43 }
44 rawOp, err := p.ldr.Load(p.Path)
45 if err != nil {
46 return err
47 }
48 p.JsonOp = string(rawOp)
49 if p.JsonOp == "" {
50 return fmt.Errorf("patch file '%s' empty seems to be empty", p.Path)
51 }
52 }
53 if p.JsonOp[0] != '[' {
54
55
56 op, err := yaml.YAMLToJSON([]byte(p.JsonOp))
57 if err != nil {
58 return err
59 }
60 p.JsonOp = string(op)
61 }
62 p.decodedPatch, err = jsonpatch.DecodePatch([]byte(p.JsonOp))
63 if err != nil {
64 return errors.WrapPrefixf(err, "decoding %s", p.JsonOp)
65 }
66 if len(p.decodedPatch) == 0 {
67 return fmt.Errorf(
68 "patch appears to be empty; file=%s, JsonOp=%s", p.Path, p.JsonOp)
69 }
70 return err
71 }
72
73 func (p *PatchJson6902TransformerPlugin) Transform(m resmap.ResMap) error {
74 if p.Target == nil {
75 return fmt.Errorf("must specify a target for patch %s", p.JsonOp)
76 }
77 resources, err := m.Select(*p.Target)
78 if err != nil {
79 return err
80 }
81 for _, res := range resources {
82 internalAnnotations := kioutil.GetInternalAnnotations(&res.RNode)
83
84 err = res.ApplyFilter(patchjson6902.Filter{
85 Patch: p.JsonOp,
86 })
87 if err != nil {
88 return err
89 }
90
91 annotations := res.GetAnnotations()
92 for key, value := range internalAnnotations {
93 annotations[key] = value
94 }
95 err = res.SetAnnotations(annotations)
96 if err != nil {
97 return err
98 }
99 }
100 return nil
101 }
102
103 func NewPatchJson6902TransformerPlugin() resmap.TransformerPlugin {
104 return &PatchJson6902TransformerPlugin{}
105 }
106
View as plain text