Skip to content

Commit 8022402

Browse files
authored
Merge pull request #721 from Adirio/patches
✨ Add Merge patch type and deprecate ConstantPatch in favor of RawPatch
2 parents 790e761 + 327514a commit 8022402

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

pkg/client/client_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ var _ = Describe("Client", func() {
11461146
Expect(err).NotTo(HaveOccurred())
11471147

11481148
By("patching the Deployment")
1149-
err = cl.Patch(context.TODO(), dep, client.ConstantPatch(types.MergePatchType, mergePatch))
1149+
err = cl.Patch(context.TODO(), dep, client.RawPatch(types.MergePatchType, mergePatch))
11501150
Expect(err).NotTo(HaveOccurred())
11511151

11521152
By("validating patched Deployment has new annotation")
@@ -1169,7 +1169,7 @@ var _ = Describe("Client", func() {
11691169

11701170
By("patching the Deployment")
11711171
dep.SetGroupVersionKind(depGvk)
1172-
err = cl.Patch(context.TODO(), dep, client.ConstantPatch(types.MergePatchType, mergePatch))
1172+
err = cl.Patch(context.TODO(), dep, client.RawPatch(types.MergePatchType, mergePatch))
11731173
Expect(err).NotTo(HaveOccurred())
11741174

11751175
By("validating updated Deployment has type information")
@@ -1189,7 +1189,7 @@ var _ = Describe("Client", func() {
11891189

11901190
By("patching the Node")
11911191
nodeName := node.Name
1192-
err = cl.Patch(context.TODO(), node, client.ConstantPatch(types.MergePatchType, mergePatch))
1192+
err = cl.Patch(context.TODO(), node, client.RawPatch(types.MergePatchType, mergePatch))
11931193
Expect(err).NotTo(HaveOccurred())
11941194

11951195
By("validating the Node no longer exists")
@@ -1207,7 +1207,7 @@ var _ = Describe("Client", func() {
12071207
Expect(cl).NotTo(BeNil())
12081208

12091209
By("Patching node before it is ever created")
1210-
err = cl.Patch(context.TODO(), node, client.ConstantPatch(types.MergePatchType, mergePatch))
1210+
err = cl.Patch(context.TODO(), node, client.RawPatch(types.MergePatchType, mergePatch))
12111211
Expect(err).To(HaveOccurred())
12121212

12131213
close(done)
@@ -1229,7 +1229,7 @@ var _ = Describe("Client", func() {
12291229
Expect(err).NotTo(HaveOccurred())
12301230

12311231
By("patching the Deployment fails")
1232-
err = cl.Patch(context.TODO(), dep, client.ConstantPatch(types.MergePatchType, mergePatch))
1232+
err = cl.Patch(context.TODO(), dep, client.RawPatch(types.MergePatchType, mergePatch))
12331233
Expect(err).To(HaveOccurred())
12341234
Expect(err.Error()).To(ContainSubstring("no kind is registered for the type"))
12351235

@@ -1251,7 +1251,7 @@ var _ = Describe("Client", func() {
12511251
Expect(err).NotTo(HaveOccurred())
12521252

12531253
By("patching the Deployment with dry-run")
1254-
err = cl.Patch(context.TODO(), dep, client.ConstantPatch(types.MergePatchType, mergePatch), client.PatchDryRunAll)
1254+
err = cl.Patch(context.TODO(), dep, client.RawPatch(types.MergePatchType, mergePatch), client.PatchDryRunAll)
12551255
Expect(err).NotTo(HaveOccurred())
12561256

12571257
By("validating patched Deployment doesn't have the new annotation")
@@ -1280,7 +1280,7 @@ var _ = Describe("Client", func() {
12801280
Kind: "Deployment",
12811281
Version: "v1",
12821282
})
1283-
err = cl.Patch(context.TODO(), u, client.ConstantPatch(types.MergePatchType, mergePatch))
1283+
err = cl.Patch(context.TODO(), u, client.RawPatch(types.MergePatchType, mergePatch))
12841284
Expect(err).NotTo(HaveOccurred())
12851285

12861286
By("validating patched Deployment has new annotation")
@@ -1305,7 +1305,7 @@ var _ = Describe("Client", func() {
13051305
u := &unstructured.Unstructured{}
13061306
Expect(scheme.Convert(dep, u, nil)).To(Succeed())
13071307
u.SetGroupVersionKind(depGvk)
1308-
err = cl.Patch(context.TODO(), u, client.ConstantPatch(types.MergePatchType, mergePatch))
1308+
err = cl.Patch(context.TODO(), u, client.RawPatch(types.MergePatchType, mergePatch))
13091309
Expect(err).NotTo(HaveOccurred())
13101310

13111311
By("validating updated Deployment has type information")
@@ -1332,7 +1332,7 @@ var _ = Describe("Client", func() {
13321332
Kind: "Node",
13331333
Version: "v1",
13341334
})
1335-
err = cl.Patch(context.TODO(), u, client.ConstantPatch(types.MergePatchType, mergePatch))
1335+
err = cl.Patch(context.TODO(), u, client.RawPatch(types.MergePatchType, mergePatch))
13361336
Expect(err).NotTo(HaveOccurred())
13371337

13381338
By("validating patched Node has new annotation")
@@ -1357,7 +1357,7 @@ var _ = Describe("Client", func() {
13571357
Kind: "Node",
13581358
Version: "v1",
13591359
})
1360-
err = cl.Patch(context.TODO(), node, client.ConstantPatch(types.MergePatchType, mergePatch))
1360+
err = cl.Patch(context.TODO(), node, client.RawPatch(types.MergePatchType, mergePatch))
13611361
Expect(err).To(HaveOccurred())
13621362

13631363
close(done)
@@ -1382,7 +1382,7 @@ var _ = Describe("Client", func() {
13821382
Kind: "Deployment",
13831383
Version: "v1",
13841384
})
1385-
err = cl.Patch(context.TODO(), u, client.ConstantPatch(types.MergePatchType, mergePatch), client.PatchDryRunAll)
1385+
err = cl.Patch(context.TODO(), u, client.RawPatch(types.MergePatchType, mergePatch), client.PatchDryRunAll)
13861386
Expect(err).NotTo(HaveOccurred())
13871387

13881388
By("validating patched Deployment does not have the new annotation")

pkg/client/fake/client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ var _ = Describe("Fake client", func() {
279279
},
280280
})
281281
Expect(err).NotTo(HaveOccurred())
282-
err = cl.Patch(nil, dep, client.ConstantPatch(types.StrategicMergePatchType, mergePatch))
282+
err = cl.Patch(nil, dep, client.RawPatch(types.StrategicMergePatchType, mergePatch))
283283
Expect(err).NotTo(HaveOccurred())
284284

285285
By("Getting the patched deployment")

pkg/client/patch.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import (
2626
var (
2727
// Apply uses server-side apply to patch the given object.
2828
Apply = applyPatch{}
29+
30+
// Merge uses the raw object as a merge patch, without modifications.
31+
// Use MergeFrom if you wish to compute a diff instead.
32+
Merge = mergePatch{}
2933
)
3034

3135
type patch struct {
@@ -43,9 +47,16 @@ func (s *patch) Data(obj runtime.Object) ([]byte, error) {
4347
return s.data, nil
4448
}
4549

50+
// RawPatch constructs a new Patch with the given PatchType and data.
51+
func RawPatch(patchType types.PatchType, data []byte) Patch {
52+
return &patch{patchType, data}
53+
}
54+
4655
// ConstantPatch constructs a new Patch with the given PatchType and data.
56+
//
57+
// Deprecated: use RawPatch instead
4758
func ConstantPatch(patchType types.PatchType, data []byte) Patch {
48-
return &patch{patchType, data}
59+
return RawPatch(patchType, data)
4960
}
5061

5162
type mergeFromPatch struct {
@@ -77,6 +88,23 @@ func MergeFrom(obj runtime.Object) Patch {
7788
return &mergeFromPatch{obj}
7889
}
7990

91+
// mergePatch uses a raw merge strategy to patch the object.
92+
type mergePatch struct{}
93+
94+
// Type implements Patch.
95+
func (p mergePatch) Type() types.PatchType {
96+
return types.MergePatchType
97+
}
98+
99+
// Data implements Patch.
100+
func (p mergePatch) Data(obj runtime.Object) ([]byte, error) {
101+
// NB(directxman12): we might technically want to be using an actual encoder
102+
// here (in case some more performant encoder is introduced) but this is
103+
// correct and sufficient for our uses (it's what the JSON serializer in
104+
// client-go does, more-or-less).
105+
return json.Marshal(obj)
106+
}
107+
80108
// applyPatch uses server-side apply to patch the object.
81109
type applyPatch struct{}
82110

0 commit comments

Comments
 (0)