Skip to content

Commit 28462fc

Browse files
authored
Merge pull request kubernetes#82554 from apelisse/improve-testmanager-helpers
Refactor FieldManager tests to make them simpler
2 parents 96201b5 + b10ad55 commit 28462fc

File tree

1 file changed

+77
-88
lines changed

1 file changed

+77
-88
lines changed

staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go

Lines changed: 77 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"fmt"
2222
"net/http"
2323
"testing"
24-
2524
"time"
2625

2726
corev1 "k8s.io/api/core/v1"
@@ -54,48 +53,70 @@ type fakeObjectDefaulter struct{}
5453

5554
func (d *fakeObjectDefaulter) Default(in runtime.Object) {}
5655

57-
func NewTestFieldManager() *fieldmanager.FieldManager {
56+
type TestFieldManager struct {
57+
fieldManager *fieldmanager.FieldManager
58+
liveObj runtime.Object
59+
}
60+
61+
func NewTestFieldManager() TestFieldManager {
5862
gv := schema.GroupVersion{
5963
Group: "apps",
6064
Version: "v1",
6165
}
6266

63-
f, _ := fieldmanager.NewCRDFieldManager(
67+
f, err := fieldmanager.NewCRDFieldManager(
6468
nil,
6569
&fakeObjectConvertor{},
6670
&fakeObjectDefaulter{},
6771
gv,
6872
gv,
6973
true,
7074
)
71-
return f
75+
if err != nil {
76+
panic(err)
77+
}
78+
return TestFieldManager{
79+
fieldManager: f,
80+
liveObj: &unstructured.Unstructured{},
81+
}
7282
}
7383

74-
func TestFieldManagerCreation(t *testing.T) {
75-
if NewTestFieldManager() == nil {
76-
t.Fatal("failed to create FieldManager")
84+
func (f *TestFieldManager) Reset() {
85+
f.liveObj = &unstructured.Unstructured{}
86+
}
87+
88+
func (f *TestFieldManager) Apply(obj []byte, manager string, force bool) error {
89+
var err error
90+
f.liveObj, err = f.fieldManager.Apply(f.liveObj, obj, manager, force)
91+
return err
92+
}
93+
94+
func (f *TestFieldManager) Update(obj runtime.Object, manager string) error {
95+
var err error
96+
f.liveObj, err = f.fieldManager.Update(f.liveObj, obj, manager)
97+
return err
98+
}
99+
100+
func (f *TestFieldManager) ManagedFields() []metav1.ManagedFieldsEntry {
101+
accessor, err := meta.Accessor(f.liveObj)
102+
if err != nil {
103+
panic(fmt.Errorf("couldn't get accessor: %v", err))
77104
}
105+
106+
return accessor.GetManagedFields()
78107
}
79108

80109
func TestUpdateOnlyDoesNotTrackManagedFields(t *testing.T) {
81110
f := NewTestFieldManager()
82111

83-
liveObj := &corev1.Pod{}
84-
85-
updatedObj := liveObj.DeepCopy()
112+
updatedObj := &corev1.Pod{}
86113
updatedObj.ObjectMeta.Labels = map[string]string{"k": "v"}
87114

88-
newObj, err := f.Update(liveObj, updatedObj, "fieldmanager_test")
89-
if err != nil {
115+
if err := f.Update(updatedObj, "fieldmanager_test"); err != nil {
90116
t.Fatalf("failed to update object: %v", err)
91117
}
92118

93-
accessor, err := meta.Accessor(newObj)
94-
if err != nil {
95-
t.Fatalf("couldn't get accessor: %v", err)
96-
}
97-
98-
if m := accessor.GetManagedFields(); len(m) != 0 {
119+
if m := f.ManagedFields(); len(m) != 0 {
99120
t.Fatalf("managedFields were tracked on update only: %v", m)
100121
}
101122
}
@@ -104,9 +125,6 @@ func TestUpdateOnlyDoesNotTrackManagedFields(t *testing.T) {
104125
func TestUpdateApplyConflict(t *testing.T) {
105126
f := NewTestFieldManager()
106127

107-
obj := &corev1.Pod{}
108-
obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}}
109-
110128
patch := []byte(`{
111129
"apiVersion": "apps/v1",
112130
"kind": "Deployment",
@@ -141,12 +159,11 @@ func TestUpdateApplyConflict(t *testing.T) {
141159
t.Fatalf("error decoding YAML: %v", err)
142160
}
143161

144-
savedObject, err := f.Update(obj, newObj, "fieldmanager_test")
145-
if err != nil {
162+
if err := f.Update(newObj, "fieldmanager_test"); err != nil {
146163
t.Fatalf("failed to apply object: %v", err)
147164
}
148165

149-
_, err = f.Apply(savedObject, []byte(`{
166+
err := f.Apply([]byte(`{
150167
"apiVersion": "apps/v1",
151168
"kind": "Deployment",
152169
"metadata": {
@@ -164,55 +181,41 @@ func TestUpdateApplyConflict(t *testing.T) {
164181
func TestApplyStripsFields(t *testing.T) {
165182
f := NewTestFieldManager()
166183

167-
obj := &corev1.Pod{}
168-
obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}}
169-
170-
newObj := &corev1.Pod{
171-
TypeMeta: metav1.TypeMeta{
172-
APIVersion: "apps/v1",
173-
Kind: "Deployment",
174-
},
175-
ObjectMeta: metav1.ObjectMeta{
176-
Name: "b",
177-
Namespace: "b",
178-
CreationTimestamp: metav1.NewTime(time.Now()),
179-
SelfLink: "b",
180-
UID: "b",
181-
ClusterName: "b",
182-
Generation: 0,
183-
ManagedFields: []metav1.ManagedFieldsEntry{
184-
{
185-
Manager: "update",
186-
Operation: metav1.ManagedFieldsOperationApply,
187-
APIVersion: "apps/v1",
188-
},
189-
},
190-
ResourceVersion: "b",
184+
newObj := &unstructured.Unstructured{
185+
Object: map[string]interface{}{
186+
"apiVersion": "apps/v1",
187+
"kind": "Deployment",
191188
},
192189
}
193190

194-
updatedObj, err := f.Update(obj, newObj, "fieldmanager_test")
195-
if err != nil {
191+
newObj.SetName("b")
192+
newObj.SetNamespace("b")
193+
newObj.SetUID("b")
194+
newObj.SetClusterName("b")
195+
newObj.SetGeneration(0)
196+
newObj.SetResourceVersion("b")
197+
newObj.SetCreationTimestamp(metav1.NewTime(time.Now()))
198+
newObj.SetManagedFields([]metav1.ManagedFieldsEntry{
199+
{
200+
Manager: "update",
201+
Operation: metav1.ManagedFieldsOperationApply,
202+
APIVersion: "apps/v1",
203+
},
204+
})
205+
if err := f.Update(newObj, "fieldmanager_test"); err != nil {
196206
t.Fatalf("failed to apply object: %v", err)
197207
}
198208

199-
accessor, err := meta.Accessor(updatedObj)
200-
if err != nil {
201-
t.Fatalf("couldn't get accessor: %v", err)
202-
}
203-
204-
if m := accessor.GetManagedFields(); len(m) != 0 {
205-
t.Fatalf("fields did not get stripped on apply: %v", m)
209+
if m := f.ManagedFields(); len(m) != 0 {
210+
t.Fatalf("fields did not get stripped: %v", m)
206211
}
207212
}
208213

209214
func TestVersionCheck(t *testing.T) {
210215
f := NewTestFieldManager()
211216

212-
obj := &corev1.Pod{}
213-
214217
// patch has 'apiVersion: apps/v1' and live version is apps/v1 -> no errors
215-
_, err := f.Apply(obj, []byte(`{
218+
err := f.Apply([]byte(`{
216219
"apiVersion": "apps/v1",
217220
"kind": "Deployment",
218221
}`), "fieldmanager_test", false)
@@ -221,7 +224,7 @@ func TestVersionCheck(t *testing.T) {
221224
}
222225

223226
// patch has 'apiVersion: apps/v2' but live version is apps/v1 -> error
224-
_, err = f.Apply(obj, []byte(`{
227+
err = f.Apply([]byte(`{
225228
"apiVersion": "apps/v2",
226229
"kind": "Deployment",
227230
}`), "fieldmanager_test", false)
@@ -242,10 +245,7 @@ func TestVersionCheck(t *testing.T) {
242245
func TestApplyDoesNotStripLabels(t *testing.T) {
243246
f := NewTestFieldManager()
244247

245-
obj := &corev1.Pod{}
246-
obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}}
247-
248-
newObj, err := f.Apply(obj, []byte(`{
248+
err := f.Apply([]byte(`{
249249
"apiVersion": "apps/v1",
250250
"kind": "Pod",
251251
"metadata": {
@@ -258,25 +258,18 @@ func TestApplyDoesNotStripLabels(t *testing.T) {
258258
t.Fatalf("failed to apply object: %v", err)
259259
}
260260

261-
accessor, err := meta.Accessor(newObj)
262-
if err != nil {
263-
t.Fatalf("couldn't get accessor: %v", err)
264-
}
265-
266-
if m := accessor.GetManagedFields(); len(m) != 1 {
261+
if m := f.ManagedFields(); len(m) != 1 {
267262
t.Fatalf("labels shouldn't get stripped on apply: %v", m)
268263
}
269264
}
270265

271266
func BenchmarkApplyNewObject(b *testing.B) {
272267
f := NewTestFieldManager()
273268

274-
obj := &corev1.Pod{}
275-
276269
b.ReportAllocs()
277270
b.ResetTimer()
278271
for n := 0; n < b.N; n++ {
279-
_, err := f.Apply(obj, []byte(`{
272+
err := f.Apply([]byte(`{
280273
"apiVersion": "apps/v1",
281274
"kind": "Pod",
282275
"metadata": {
@@ -314,13 +307,13 @@ func BenchmarkApplyNewObject(b *testing.B) {
314307
if err != nil {
315308
b.Fatal(err)
316309
}
310+
f.Reset()
317311
}
318312
}
319313

320314
func BenchmarkUpdateNewObject(b *testing.B) {
321315
f := NewTestFieldManager()
322316

323-
oldObj := &corev1.Pod{}
324317
y := `{
325318
"apiVersion": "apps/v1",
326319
"kind": "Deployment",
@@ -365,18 +358,17 @@ func BenchmarkUpdateNewObject(b *testing.B) {
365358
b.ReportAllocs()
366359
b.ResetTimer()
367360
for n := 0; n < b.N; n++ {
368-
_, err := f.Update(oldObj, newObj, "fieldmanager_test")
361+
err := f.Update(newObj, "fieldmanager_test")
369362
if err != nil {
370363
b.Fatal(err)
371364
}
365+
f.Reset()
372366
}
373367
}
374368

375369
func BenchmarkRepeatedUpdate(b *testing.B) {
376370
f := NewTestFieldManager()
377371

378-
var oldObj runtime.Object
379-
oldObj = &unstructured.Unstructured{Object: map[string]interface{}{}}
380372
y1 := `{
381373
"apiVersion": "apps/v1",
382374
"kind": "Deployment",
@@ -505,36 +497,33 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
505497

506498
objs := []*unstructured.Unstructured{obj1, obj2, obj3}
507499

508-
var err error
509-
oldObj, err = f.Update(oldObj, objs[0], "fieldmanager_0")
510-
if err != nil {
500+
if err := f.Update(objs[0], "fieldmanager_0"); err != nil {
511501
b.Fatal(err)
512502
}
513503

514-
oldObj, err = f.Update(oldObj, objs[1], "fieldmanager_1")
515-
if err != nil {
504+
if err := f.Update(objs[1], "fieldmanager_1"); err != nil {
516505
b.Fatal(err)
517506
}
518507

519-
oldObj, err = f.Update(oldObj, objs[2], "fieldmanager_2")
520-
if err != nil {
508+
if err := f.Update(objs[2], "fieldmanager_2"); err != nil {
521509
b.Fatal(err)
522510
}
523511

524512
b.ReportAllocs()
525513
b.ResetTimer()
526514
for n := 0; n < b.N; n++ {
527-
oldObj, err = f.Update(oldObj, objs[n%3], fmt.Sprintf("fieldmanager_%d", n%3))
515+
err := f.Update(objs[n%3], fmt.Sprintf("fieldmanager_%d", n%3))
528516
if err != nil {
529517
b.Fatal(err)
530518
}
519+
f.Reset()
531520
}
532521
}
533522

534523
func TestApplyFailsWithManagedFields(t *testing.T) {
535524
f := NewTestFieldManager()
536525

537-
_, err := f.Apply(&corev1.Pod{}, []byte(`{
526+
err := f.Apply([]byte(`{
538527
"apiVersion": "apps/v1",
539528
"kind": "Pod",
540529
"metadata": {
@@ -554,7 +543,7 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
554543
func TestApplySuccessWithNoManagedFields(t *testing.T) {
555544
f := NewTestFieldManager()
556545

557-
_, err := f.Apply(&corev1.Pod{}, []byte(`{
546+
err := f.Apply([]byte(`{
558547
"apiVersion": "apps/v1",
559548
"kind": "Pod",
560549
"metadata": {

0 commit comments

Comments
 (0)