@@ -21,7 +21,6 @@ import (
21
21
"fmt"
22
22
"net/http"
23
23
"testing"
24
-
25
24
"time"
26
25
27
26
corev1 "k8s.io/api/core/v1"
@@ -54,48 +53,70 @@ type fakeObjectDefaulter struct{}
54
53
55
54
func (d * fakeObjectDefaulter ) Default (in runtime.Object ) {}
56
55
57
- func NewTestFieldManager () * fieldmanager.FieldManager {
56
+ type TestFieldManager struct {
57
+ fieldManager * fieldmanager.FieldManager
58
+ liveObj runtime.Object
59
+ }
60
+
61
+ func NewTestFieldManager () TestFieldManager {
58
62
gv := schema.GroupVersion {
59
63
Group : "apps" ,
60
64
Version : "v1" ,
61
65
}
62
66
63
- f , _ := fieldmanager .NewCRDFieldManager (
67
+ f , err := fieldmanager .NewCRDFieldManager (
64
68
nil ,
65
69
& fakeObjectConvertor {},
66
70
& fakeObjectDefaulter {},
67
71
gv ,
68
72
gv ,
69
73
true ,
70
74
)
71
- return f
75
+ if err != nil {
76
+ panic (err )
77
+ }
78
+ return TestFieldManager {
79
+ fieldManager : f ,
80
+ liveObj : & unstructured.Unstructured {},
81
+ }
72
82
}
73
83
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 ))
77
104
}
105
+
106
+ return accessor .GetManagedFields ()
78
107
}
79
108
80
109
func TestUpdateOnlyDoesNotTrackManagedFields (t * testing.T ) {
81
110
f := NewTestFieldManager ()
82
111
83
- liveObj := & corev1.Pod {}
84
-
85
- updatedObj := liveObj .DeepCopy ()
112
+ updatedObj := & corev1.Pod {}
86
113
updatedObj .ObjectMeta .Labels = map [string ]string {"k" : "v" }
87
114
88
- newObj , err := f .Update (liveObj , updatedObj , "fieldmanager_test" )
89
- if err != nil {
115
+ if err := f .Update (updatedObj , "fieldmanager_test" ); err != nil {
90
116
t .Fatalf ("failed to update object: %v" , err )
91
117
}
92
118
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 {
99
120
t .Fatalf ("managedFields were tracked on update only: %v" , m )
100
121
}
101
122
}
@@ -104,9 +125,6 @@ func TestUpdateOnlyDoesNotTrackManagedFields(t *testing.T) {
104
125
func TestUpdateApplyConflict (t * testing.T ) {
105
126
f := NewTestFieldManager ()
106
127
107
- obj := & corev1.Pod {}
108
- obj .ObjectMeta .ManagedFields = []metav1.ManagedFieldsEntry {{}}
109
-
110
128
patch := []byte (`{
111
129
"apiVersion": "apps/v1",
112
130
"kind": "Deployment",
@@ -141,12 +159,11 @@ func TestUpdateApplyConflict(t *testing.T) {
141
159
t .Fatalf ("error decoding YAML: %v" , err )
142
160
}
143
161
144
- savedObject , err := f .Update (obj , newObj , "fieldmanager_test" )
145
- if err != nil {
162
+ if err := f .Update (newObj , "fieldmanager_test" ); err != nil {
146
163
t .Fatalf ("failed to apply object: %v" , err )
147
164
}
148
165
149
- _ , err = f .Apply (savedObject , []byte (`{
166
+ err : = f .Apply ([]byte (`{
150
167
"apiVersion": "apps/v1",
151
168
"kind": "Deployment",
152
169
"metadata": {
@@ -164,55 +181,41 @@ func TestUpdateApplyConflict(t *testing.T) {
164
181
func TestApplyStripsFields (t * testing.T ) {
165
182
f := NewTestFieldManager ()
166
183
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" ,
191
188
},
192
189
}
193
190
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 {
196
206
t .Fatalf ("failed to apply object: %v" , err )
197
207
}
198
208
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 )
206
211
}
207
212
}
208
213
209
214
func TestVersionCheck (t * testing.T ) {
210
215
f := NewTestFieldManager ()
211
216
212
- obj := & corev1.Pod {}
213
-
214
217
// patch has 'apiVersion: apps/v1' and live version is apps/v1 -> no errors
215
- _ , err := f .Apply (obj , []byte (`{
218
+ err := f .Apply ([]byte (`{
216
219
"apiVersion": "apps/v1",
217
220
"kind": "Deployment",
218
221
}` ), "fieldmanager_test" , false )
@@ -221,7 +224,7 @@ func TestVersionCheck(t *testing.T) {
221
224
}
222
225
223
226
// patch has 'apiVersion: apps/v2' but live version is apps/v1 -> error
224
- _ , err = f .Apply (obj , []byte (`{
227
+ err = f .Apply ([]byte (`{
225
228
"apiVersion": "apps/v2",
226
229
"kind": "Deployment",
227
230
}` ), "fieldmanager_test" , false )
@@ -242,10 +245,7 @@ func TestVersionCheck(t *testing.T) {
242
245
func TestApplyDoesNotStripLabels (t * testing.T ) {
243
246
f := NewTestFieldManager ()
244
247
245
- obj := & corev1.Pod {}
246
- obj .ObjectMeta .ManagedFields = []metav1.ManagedFieldsEntry {{}}
247
-
248
- newObj , err := f .Apply (obj , []byte (`{
248
+ err := f .Apply ([]byte (`{
249
249
"apiVersion": "apps/v1",
250
250
"kind": "Pod",
251
251
"metadata": {
@@ -258,25 +258,18 @@ func TestApplyDoesNotStripLabels(t *testing.T) {
258
258
t .Fatalf ("failed to apply object: %v" , err )
259
259
}
260
260
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 {
267
262
t .Fatalf ("labels shouldn't get stripped on apply: %v" , m )
268
263
}
269
264
}
270
265
271
266
func BenchmarkApplyNewObject (b * testing.B ) {
272
267
f := NewTestFieldManager ()
273
268
274
- obj := & corev1.Pod {}
275
-
276
269
b .ReportAllocs ()
277
270
b .ResetTimer ()
278
271
for n := 0 ; n < b .N ; n ++ {
279
- _ , err := f .Apply (obj , []byte (`{
272
+ err := f .Apply ([]byte (`{
280
273
"apiVersion": "apps/v1",
281
274
"kind": "Pod",
282
275
"metadata": {
@@ -314,13 +307,13 @@ func BenchmarkApplyNewObject(b *testing.B) {
314
307
if err != nil {
315
308
b .Fatal (err )
316
309
}
310
+ f .Reset ()
317
311
}
318
312
}
319
313
320
314
func BenchmarkUpdateNewObject (b * testing.B ) {
321
315
f := NewTestFieldManager ()
322
316
323
- oldObj := & corev1.Pod {}
324
317
y := `{
325
318
"apiVersion": "apps/v1",
326
319
"kind": "Deployment",
@@ -365,18 +358,17 @@ func BenchmarkUpdateNewObject(b *testing.B) {
365
358
b .ReportAllocs ()
366
359
b .ResetTimer ()
367
360
for n := 0 ; n < b .N ; n ++ {
368
- _ , err := f .Update (oldObj , newObj , "fieldmanager_test" )
361
+ err := f .Update (newObj , "fieldmanager_test" )
369
362
if err != nil {
370
363
b .Fatal (err )
371
364
}
365
+ f .Reset ()
372
366
}
373
367
}
374
368
375
369
func BenchmarkRepeatedUpdate (b * testing.B ) {
376
370
f := NewTestFieldManager ()
377
371
378
- var oldObj runtime.Object
379
- oldObj = & unstructured.Unstructured {Object : map [string ]interface {}{}}
380
372
y1 := `{
381
373
"apiVersion": "apps/v1",
382
374
"kind": "Deployment",
@@ -505,36 +497,33 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
505
497
506
498
objs := []* unstructured.Unstructured {obj1 , obj2 , obj3 }
507
499
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 {
511
501
b .Fatal (err )
512
502
}
513
503
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 {
516
505
b .Fatal (err )
517
506
}
518
507
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 {
521
509
b .Fatal (err )
522
510
}
523
511
524
512
b .ReportAllocs ()
525
513
b .ResetTimer ()
526
514
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 ))
528
516
if err != nil {
529
517
b .Fatal (err )
530
518
}
519
+ f .Reset ()
531
520
}
532
521
}
533
522
534
523
func TestApplyFailsWithManagedFields (t * testing.T ) {
535
524
f := NewTestFieldManager ()
536
525
537
- _ , err := f .Apply (& corev1. Pod {}, []byte (`{
526
+ err := f .Apply ([]byte (`{
538
527
"apiVersion": "apps/v1",
539
528
"kind": "Pod",
540
529
"metadata": {
@@ -554,7 +543,7 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
554
543
func TestApplySuccessWithNoManagedFields (t * testing.T ) {
555
544
f := NewTestFieldManager ()
556
545
557
- _ , err := f .Apply (& corev1. Pod {}, []byte (`{
546
+ err := f .Apply ([]byte (`{
558
547
"apiVersion": "apps/v1",
559
548
"kind": "Pod",
560
549
"metadata": {
0 commit comments