Skip to content

Commit 46c7d6d

Browse files
authored
Merge pull request #832 from Liujingfang1/jsonpatch
improve error message in json patch transformer
2 parents a341c24 + 78cbff1 commit 46c7d6d

File tree

3 files changed

+73
-25
lines changed

3 files changed

+73
-25
lines changed

pkg/patch/transformer/factory.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ import (
2121
"sigs.k8s.io/kustomize/pkg/ifc"
2222
"sigs.k8s.io/kustomize/pkg/resid"
2323

24-
"github.com/evanphx/json-patch"
25-
"github.com/ghodss/yaml"
2624
"sigs.k8s.io/kustomize/pkg/gvk"
2725
"sigs.k8s.io/kustomize/pkg/patch"
2826
"sigs.k8s.io/kustomize/pkg/transformers"
@@ -77,19 +75,7 @@ func (f PatchJson6902Factory) makeOnePatchJson6902Transformer(p patch.Json6902)
7775
return nil, err
7876
}
7977

80-
if !isJsonFormat(rawOp) {
81-
// if it isn't JSON, try to parse it as YAML
82-
rawOp, err = yaml.YAMLToJSON(rawOp)
83-
if err != nil {
84-
return nil, err
85-
}
86-
}
87-
88-
decodedPatch, err := jsonpatch.DecodePatch(rawOp)
89-
if err != nil {
90-
return nil, err
91-
}
92-
return newPatchJson6902JSONTransformer(targetId, decodedPatch)
78+
return newPatchJson6902JSONTransformer(targetId, rawOp)
9379
}
9480

9581
func isJsonFormat(data []byte) bool {

pkg/patch/transformer/patchjson6902json.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"fmt"
2121

2222
"github.com/evanphx/json-patch"
23+
"github.com/ghodss/yaml"
24+
"github.com/pkg/errors"
2325
"sigs.k8s.io/kustomize/pkg/resid"
2426
"sigs.k8s.io/kustomize/pkg/resmap"
2527
"sigs.k8s.io/kustomize/pkg/resource"
@@ -30,17 +32,31 @@ import (
3032
type patchJson6902JSONTransformer struct {
3133
target resid.ResId
3234
patch jsonpatch.Patch
35+
rawOp []byte
3336
}
3437

3538
var _ transformers.Transformer = &patchJson6902JSONTransformer{}
3639

3740
// newPatchJson6902JSONTransformer constructs a PatchJson6902 transformer.
3841
func newPatchJson6902JSONTransformer(
39-
id resid.ResId, p jsonpatch.Patch) (transformers.Transformer, error) {
40-
if len(p) == 0 {
42+
id resid.ResId, rawOp []byte) (transformers.Transformer, error) {
43+
op := rawOp
44+
var err error
45+
if !isJsonFormat(op) {
46+
// if it isn't JSON, try to parse it as YAML
47+
op, err = yaml.YAMLToJSON(rawOp)
48+
if err != nil {
49+
return nil, err
50+
}
51+
}
52+
decodedPatch, err := jsonpatch.DecodePatch(op)
53+
if err != nil {
54+
return nil, err
55+
}
56+
if len(decodedPatch) == 0 {
4157
return transformers.NewNoOpTransformer(), nil
4258
}
43-
return &patchJson6902JSONTransformer{target: id, patch: p}, nil
59+
return &patchJson6902JSONTransformer{target: id, patch: decodedPatch, rawOp: rawOp}, nil
4460
}
4561

4662
// Transform apply the json patches on top of the base resources.
@@ -55,7 +71,7 @@ func (t *patchJson6902JSONTransformer) Transform(m resmap.ResMap) error {
5571
}
5672
modifiedObj, err := t.patch.Apply(rawObj)
5773
if err != nil {
58-
return err
74+
return errors.Wrapf(err, "failed to apply json patch '%s'", string(t.rawOp))
5975
}
6076
err = obj.UnmarshalJSON(modifiedObj)
6177
if err != nil {

pkg/patch/transformer/patchjson6902json_test.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ package transformer
1818

1919
import (
2020
"reflect"
21+
"strings"
2122
"testing"
2223

23-
"github.com/evanphx/json-patch"
2424
"sigs.k8s.io/kustomize/k8sdeps/kunstruct"
2525
"sigs.k8s.io/kustomize/pkg/gvk"
2626
"sigs.k8s.io/kustomize/pkg/resid"
@@ -67,10 +67,7 @@ func TestJsonPatchJSONTransformer_Transform(t *testing.T) {
6767
{"op": "add", "path": "/spec/replica", "value": "3"},
6868
{"op": "add", "path": "/spec/template/spec/containers/0/command", "value": ["arg1", "arg2", "arg3"]}
6969
]`)
70-
patch, err := jsonpatch.DecodePatch(operations)
71-
if err != nil {
72-
t.Fatalf("unexpected error : %v", err)
73-
}
70+
7471
expected := resmap.ResMap{
7572
id: rf.FromMap(
7673
map[string]interface{}{
@@ -104,7 +101,7 @@ func TestJsonPatchJSONTransformer_Transform(t *testing.T) {
104101
},
105102
}),
106103
}
107-
jpt, err := newPatchJson6902JSONTransformer(id, patch)
104+
jpt, err := newPatchJson6902JSONTransformer(id, operations)
108105
if err != nil {
109106
t.Fatalf("unexpected error : %v", err)
110107
}
@@ -117,3 +114,52 @@ func TestJsonPatchJSONTransformer_Transform(t *testing.T) {
117114
t.Fatalf("actual doesn't match expected: %v", err)
118115
}
119116
}
117+
118+
func TestJsonPatchJSONTransformer_UnHappyTransform(t *testing.T) {
119+
rf := resource.NewFactory(
120+
kunstruct.NewKunstructuredFactoryImpl())
121+
id := resid.NewResId(deploy, "deploy1")
122+
base := resmap.ResMap{
123+
id: rf.FromMap(
124+
map[string]interface{}{
125+
"apiVersion": "apps/v1",
126+
"kind": "Deployment",
127+
"metadata": map[string]interface{}{
128+
"name": "deploy1",
129+
},
130+
"spec": map[string]interface{}{
131+
"template": map[string]interface{}{
132+
"metadata": map[string]interface{}{
133+
"labels": map[string]interface{}{
134+
"old-label": "old-value",
135+
},
136+
},
137+
"spec": map[string]interface{}{
138+
"containers": []interface{}{
139+
map[string]interface{}{
140+
"name": "nginx",
141+
"image": "nginx",
142+
},
143+
},
144+
},
145+
},
146+
},
147+
}),
148+
}
149+
150+
operations := []byte(`[
151+
{"op": "add", "path": "/spec/template/spec/containers/0/command/", "value": ["arg1", "arg2", "arg3"]}
152+
]`)
153+
154+
jpt, err := newPatchJson6902JSONTransformer(id, operations)
155+
if err != nil {
156+
t.Fatalf("unexpected error : %v", err)
157+
}
158+
err = jpt.Transform(base)
159+
if err == nil {
160+
t.Fatalf("expected error didn't happen")
161+
}
162+
if !strings.HasPrefix(err.Error(), "failed to apply json patch") || !strings.Contains(err.Error(), string(operations)) {
163+
t.Fatalf("expected error didn't happen, but got %v", err)
164+
}
165+
}

0 commit comments

Comments
 (0)