@@ -71,7 +71,7 @@ var _ = Describe("Controllerutil", func() {
71
71
It ("should return an error if object is already owned by another controller" , func () {
72
72
t := true
73
73
rsOwners := []metav1.OwnerReference {
74
- metav1. OwnerReference {
74
+ {
75
75
Name : "bar" ,
76
76
Kind : "Deployment" ,
77
77
APIVersion : "extensions/v1beta1" ,
@@ -93,7 +93,7 @@ var _ = Describe("Controllerutil", func() {
93
93
f := false
94
94
t := true
95
95
rsOwners := []metav1.OwnerReference {
96
- metav1. OwnerReference {
96
+ {
97
97
Name : "foo" ,
98
98
Kind : "Deployment" ,
99
99
APIVersion : "extensions/v1beta1" ,
@@ -121,6 +121,7 @@ var _ = Describe("Controllerutil", func() {
121
121
var deploy * appsv1.Deployment
122
122
var deplSpec appsv1.DeploymentSpec
123
123
var deplKey types.NamespacedName
124
+ var specr controllerutil.MutateFn
124
125
125
126
BeforeEach (func () {
126
127
deploy = & appsv1.Deployment {
@@ -151,94 +152,111 @@ var _ = Describe("Controllerutil", func() {
151
152
},
152
153
}
153
154
154
- deploy .Spec = deplSpec
155
-
156
155
deplKey = types.NamespacedName {
157
156
Name : deploy .Name ,
158
157
Namespace : deploy .Namespace ,
159
158
}
159
+
160
+ specr = deploymentSpecr (deploy , deplSpec )
160
161
})
161
162
162
163
It ("creates a new object if one doesn't exists" , func () {
163
- op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentSpecr (deplSpec ))
164
-
165
- By ("returning OperationResultCreated" )
166
- Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
164
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , specr )
167
165
168
166
By ("returning no error" )
169
167
Expect (err ).NotTo (HaveOccurred ())
170
168
169
+ By ("returning OperationResultCreated" )
170
+ Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
171
+
171
172
By ("actually having the deployment created" )
172
173
fetched := & appsv1.Deployment {}
173
174
Expect (c .Get (context .TODO (), deplKey , fetched )).To (Succeed ())
175
+
176
+ By ("being mutated by MutateFn" )
177
+ Expect (fetched .Spec .Template .Spec .Containers ).To (HaveLen (1 ))
178
+ Expect (fetched .Spec .Template .Spec .Containers [0 ].Name ).To (Equal (deplSpec .Template .Spec .Containers [0 ].Name ))
179
+ Expect (fetched .Spec .Template .Spec .Containers [0 ].Image ).To (Equal (deplSpec .Template .Spec .Containers [0 ].Image ))
174
180
})
175
181
176
182
It ("updates existing object" , func () {
177
183
var scale int32 = 2
178
- op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentSpecr ( deplSpec ) )
184
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , specr )
179
185
Expect (err ).NotTo (HaveOccurred ())
180
186
Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
181
187
182
- op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentScaler (scale ))
183
- By ("returning OperationResultUpdated" )
184
- Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultUpdated ))
185
-
188
+ op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentScaler (deploy , scale ))
186
189
By ("returning no error" )
187
190
Expect (err ).NotTo (HaveOccurred ())
188
191
192
+ By ("returning OperationResultUpdated" )
193
+ Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultUpdated ))
194
+
189
195
By ("actually having the deployment scaled" )
190
196
fetched := & appsv1.Deployment {}
191
197
Expect (c .Get (context .TODO (), deplKey , fetched )).To (Succeed ())
192
198
Expect (* fetched .Spec .Replicas ).To (Equal (scale ))
193
199
})
194
200
195
201
It ("updates only changed objects" , func () {
196
- op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentSpecr ( deplSpec ) )
202
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , specr )
197
203
198
204
Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
199
205
Expect (err ).NotTo (HaveOccurred ())
200
206
201
207
op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentIdentity )
208
+ By ("returning no error" )
209
+ Expect (err ).NotTo (HaveOccurred ())
202
210
203
211
By ("returning OperationResultNone" )
204
212
Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
213
+ })
205
214
206
- By ("returning no error" )
207
- Expect (err ).NotTo (HaveOccurred ())
215
+ It ("errors when MutateFn changes objct name on creation" , func () {
216
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , func () error {
217
+ specr ()
218
+ return deploymentRenamer (deploy )()
219
+ })
220
+
221
+ By ("returning error" )
222
+ Expect (err ).To (HaveOccurred ())
223
+
224
+ By ("returning OperationResultNone" )
225
+ Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
208
226
})
209
227
210
- It ("errors when reconcile renames an object" , func () {
211
- op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentSpecr ( deplSpec ) )
228
+ It ("errors when MutateFn renames an object" , func () {
229
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , specr )
212
230
213
231
Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
214
232
Expect (err ).NotTo (HaveOccurred ())
215
233
216
- op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentRenamer )
217
-
218
- By ("returning OperationResultNone" )
219
- Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
234
+ op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentRenamer (deploy ))
220
235
221
236
By ("returning error" )
222
237
Expect (err ).To (HaveOccurred ())
238
+
239
+ By ("returning OperationResultNone" )
240
+ Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
223
241
})
224
242
225
243
It ("errors when object namespace changes" , func () {
226
- op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentSpecr ( deplSpec ) )
244
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), c , deploy , specr )
227
245
228
246
Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultCreated ))
229
247
Expect (err ).NotTo (HaveOccurred ())
230
248
231
- op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentNamespaceChanger )
232
-
233
- By ("returning OperationResultNone" )
234
- Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
249
+ op , err = controllerutil .CreateOrUpdate (context .TODO (), c , deploy , deploymentNamespaceChanger (deploy ))
235
250
236
251
By ("returning error" )
237
252
Expect (err ).To (HaveOccurred ())
253
+
254
+ By ("returning OperationResultNone" )
255
+ Expect (op ).To (BeEquivalentTo (controllerutil .OperationResultNone ))
238
256
})
239
257
240
258
It ("aborts immediately if there was an error initially retrieving the object" , func () {
241
- op , err := controllerutil .CreateOrUpdate (context .TODO (), errorReader {c }, deploy , func (_ runtime. Object ) error {
259
+ op , err := controllerutil .CreateOrUpdate (context .TODO (), errorReader {c }, deploy , func () error {
242
260
Fail ("Mutation method should not run" )
243
261
return nil
244
262
})
@@ -255,33 +273,34 @@ type errMetaObj struct {
255
273
metav1.ObjectMeta
256
274
}
257
275
258
- func deploymentSpecr (spec appsv1.DeploymentSpec ) controllerutil.MutateFn {
259
- return func (obj runtime.Object ) error {
260
- deploy := obj .(* appsv1.Deployment )
276
+ func deploymentSpecr (deploy * appsv1.Deployment , spec appsv1.DeploymentSpec ) controllerutil.MutateFn {
277
+ return func () error {
261
278
deploy .Spec = spec
262
279
return nil
263
280
}
264
281
}
265
282
266
- var deploymentIdentity controllerutil.MutateFn = func (obj runtime. Object ) error {
283
+ var deploymentIdentity controllerutil.MutateFn = func () error {
267
284
return nil
268
285
}
269
286
270
- var deploymentRenamer controllerutil.MutateFn = func (obj runtime.Object ) error {
271
- deploy := obj .(* appsv1.Deployment )
272
- deploy .Name = fmt .Sprintf ("%s-1" , deploy .Name )
273
- return nil
287
+ func deploymentRenamer (deploy * appsv1.Deployment ) controllerutil.MutateFn {
288
+ return func () error {
289
+ deploy .Name = fmt .Sprintf ("%s-1" , deploy .Name )
290
+ return nil
291
+ }
274
292
}
275
293
276
- var deploymentNamespaceChanger controllerutil.MutateFn = func (obj runtime.Object ) error {
277
- deploy := obj .(* appsv1.Deployment )
278
- deploy .Namespace = fmt .Sprintf ("%s-1" , deploy .Namespace )
279
- return nil
294
+ func deploymentNamespaceChanger (deploy * appsv1.Deployment ) controllerutil.MutateFn {
295
+ return func () error {
296
+ deploy .Namespace = fmt .Sprintf ("%s-1" , deploy .Namespace )
297
+ return nil
298
+
299
+ }
280
300
}
281
301
282
- func deploymentScaler (replicas int32 ) controllerutil.MutateFn {
283
- fn := func (obj runtime.Object ) error {
284
- deploy := obj .(* appsv1.Deployment )
302
+ func deploymentScaler (deploy * appsv1.Deployment , replicas int32 ) controllerutil.MutateFn {
303
+ fn := func () error {
285
304
deploy .Spec .Replicas = & replicas
286
305
return nil
287
306
}
0 commit comments