@@ -18,6 +18,7 @@ package source_test
1818
1919import (
2020 "fmt"
21+ "time"
2122
2223 "sigs.k8s.io/controller-runtime/pkg/event"
2324 "sigs.k8s.io/controller-runtime/pkg/handler"
@@ -30,6 +31,8 @@ import (
3031 corev1 "k8s.io/api/core/v1"
3132 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3233 "k8s.io/apimachinery/pkg/runtime"
34+ kubeinformers "k8s.io/client-go/informers"
35+ toolscache "k8s.io/client-go/tools/cache"
3336 "k8s.io/client-go/util/workqueue"
3437)
3538
@@ -209,4 +212,161 @@ var _ = Describe("Source", func() {
209212 })
210213 })
211214 })
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+ })
212372})
0 commit comments