@@ -18,6 +18,7 @@ package source_test
18
18
19
19
import (
20
20
"fmt"
21
+ "time"
21
22
22
23
"sigs.k8s.io/controller-runtime/pkg/event"
23
24
"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -30,6 +31,8 @@ import (
30
31
corev1 "k8s.io/api/core/v1"
31
32
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
33
"k8s.io/apimachinery/pkg/runtime"
34
+ kubeinformers "k8s.io/client-go/informers"
35
+ toolscache "k8s.io/client-go/tools/cache"
33
36
"k8s.io/client-go/util/workqueue"
34
37
)
35
38
@@ -209,4 +212,161 @@ var _ = Describe("Source", func() {
209
212
})
210
213
})
211
214
})
215
+
216
+ Describe ("Informer" , func () {
217
+ var c chan struct {}
218
+ var rs * appsv1.ReplicaSet
219
+ var depInformer toolscache.SharedIndexInformer
220
+ var informerFactory kubeinformers.SharedInformerFactory
221
+ var stopTest chan struct {}
222
+
223
+ BeforeEach (func (done Done ) {
224
+ stopTest = make (chan struct {})
225
+ informerFactory = kubeinformers .NewSharedInformerFactory (clientset , time .Second * 30 )
226
+ depInformer = informerFactory .Apps ().V1 ().ReplicaSets ().Informer ()
227
+ informerFactory .Start (stopTest )
228
+ Eventually (depInformer .HasSynced ).Should (BeTrue ())
229
+
230
+ c = make (chan struct {})
231
+ rs = & appsv1.ReplicaSet {
232
+ ObjectMeta : metav1.ObjectMeta {Name : "informer-rs-name" },
233
+ Spec : appsv1.ReplicaSetSpec {
234
+ Selector : & metav1.LabelSelector {
235
+ MatchLabels : map [string ]string {"foo" : "bar" },
236
+ },
237
+ Template : corev1.PodTemplateSpec {
238
+ ObjectMeta : metav1.ObjectMeta {Labels : map [string ]string {"foo" : "bar" }},
239
+ Spec : corev1.PodSpec {
240
+ Containers : []corev1.Container {
241
+ {
242
+ Name : "nginx" ,
243
+ Image : "nginx" ,
244
+ },
245
+ },
246
+ },
247
+ },
248
+ },
249
+ }
250
+ close (done )
251
+ })
252
+
253
+ AfterEach (func (done Done ) {
254
+ close (stopTest )
255
+ close (done )
256
+ })
257
+
258
+ Context ("for a ReplicaSet resource" , func () {
259
+ It ("should provide a ReplicaSet CreateEvent" , func (done Done ) {
260
+ c := make (chan struct {})
261
+
262
+ q := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "test" )
263
+ instance := & source.Informer {Informer : depInformer }
264
+ err := instance .Start (handler.Funcs {
265
+ CreateFunc : func (evt event.CreateEvent , q2 workqueue.RateLimitingInterface ) {
266
+ defer GinkgoRecover ()
267
+ var err error
268
+ rs , err = clientset .AppsV1 ().ReplicaSets ("default" ).Get (rs .Name , metav1.GetOptions {})
269
+ Expect (err ).NotTo (HaveOccurred ())
270
+
271
+ Expect (q2 ).To (BeIdenticalTo (q ))
272
+ Expect (evt .Meta ).To (Equal (rs ))
273
+ Expect (evt .Object ).To (Equal (rs ))
274
+ close (c )
275
+ },
276
+ UpdateFunc : func (event.UpdateEvent , workqueue.RateLimitingInterface ) {
277
+ defer GinkgoRecover ()
278
+ Fail ("Unexpected UpdateEvent" )
279
+ },
280
+ DeleteFunc : func (event.DeleteEvent , workqueue.RateLimitingInterface ) {
281
+ defer GinkgoRecover ()
282
+ Fail ("Unexpected DeleteEvent" )
283
+ },
284
+ GenericFunc : func (event.GenericEvent , workqueue.RateLimitingInterface ) {
285
+ defer GinkgoRecover ()
286
+ Fail ("Unexpected GenericEvent" )
287
+ },
288
+ }, q )
289
+ Expect (err ).NotTo (HaveOccurred ())
290
+
291
+ rs , err = clientset .AppsV1 ().ReplicaSets ("default" ).Create (rs )
292
+ Expect (err ).NotTo (HaveOccurred ())
293
+ <- c
294
+ close (done )
295
+ }, 30 )
296
+
297
+ It ("should provide a ReplicaSet UpdateEvent" , func (done Done ) {
298
+ var err error
299
+ rs , err = clientset .AppsV1 ().ReplicaSets ("default" ).Get (rs .Name , metav1.GetOptions {})
300
+ Expect (err ).NotTo (HaveOccurred ())
301
+
302
+ rs2 := rs .DeepCopy ()
303
+ rs2 .SetLabels (map [string ]string {"biz" : "baz" })
304
+
305
+ q := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "test" )
306
+ instance := & source.Informer {Informer : depInformer }
307
+ err = instance .Start (handler.Funcs {
308
+ CreateFunc : func (evt event.CreateEvent , q2 workqueue.RateLimitingInterface ) {
309
+ },
310
+ UpdateFunc : func (evt event.UpdateEvent , q2 workqueue.RateLimitingInterface ) {
311
+ defer GinkgoRecover ()
312
+ var err error
313
+ rs2 , err = clientset .AppsV1 ().ReplicaSets ("default" ).Get (rs .Name , metav1.GetOptions {})
314
+ Expect (err ).NotTo (HaveOccurred ())
315
+
316
+ Expect (q2 ).To (Equal (q ))
317
+ Expect (evt .MetaOld ).To (Equal (rs ))
318
+ Expect (evt .ObjectOld ).To (Equal (rs ))
319
+
320
+ Expect (evt .MetaNew ).To (Equal (rs2 ))
321
+ Expect (evt .ObjectNew ).To (Equal (rs2 ))
322
+
323
+ close (c )
324
+ },
325
+ DeleteFunc : func (event.DeleteEvent , workqueue.RateLimitingInterface ) {
326
+ defer GinkgoRecover ()
327
+ Fail ("Unexpected DeleteEvent" )
328
+ },
329
+ GenericFunc : func (event.GenericEvent , workqueue.RateLimitingInterface ) {
330
+ defer GinkgoRecover ()
331
+ Fail ("Unexpected GenericEvent" )
332
+ },
333
+ }, q )
334
+ Expect (err ).NotTo (HaveOccurred ())
335
+
336
+ rs2 , err = clientset .AppsV1 ().ReplicaSets ("default" ).Update (rs2 )
337
+ Expect (err ).NotTo (HaveOccurred ())
338
+ <- c
339
+ close (done )
340
+ })
341
+
342
+ It ("should provide a ReplicaSet DeletedEvent" , func (done Done ) {
343
+ c := make (chan struct {})
344
+
345
+ q := workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "test" )
346
+ instance := & source.Informer {Informer : depInformer }
347
+ err := instance .Start (handler.Funcs {
348
+ CreateFunc : func (event.CreateEvent , workqueue.RateLimitingInterface ) {
349
+ },
350
+ UpdateFunc : func (event.UpdateEvent , workqueue.RateLimitingInterface ) {
351
+ },
352
+ DeleteFunc : func (evt event.DeleteEvent , q2 workqueue.RateLimitingInterface ) {
353
+ defer GinkgoRecover ()
354
+ Expect (q2 ).To (Equal (q ))
355
+ Expect (evt .Meta .GetName ()).To (Equal (rs .Name ))
356
+ close (c )
357
+ },
358
+ GenericFunc : func (event.GenericEvent , workqueue.RateLimitingInterface ) {
359
+ defer GinkgoRecover ()
360
+ Fail ("Unexpected GenericEvent" )
361
+ },
362
+ }, q )
363
+ Expect (err ).NotTo (HaveOccurred ())
364
+
365
+ err = clientset .AppsV1 ().ReplicaSets ("default" ).Delete (rs .Name , & metav1.DeleteOptions {})
366
+ Expect (err ).NotTo (HaveOccurred ())
367
+ <- c
368
+ close (done )
369
+ })
370
+ })
371
+ })
212
372
})
0 commit comments