@@ -3,12 +3,16 @@ package manager
33import (
44 "context"
55 "fmt"
6+ "net/http"
67 "testing"
78 "time"
89
910 "github.com/stretchr/testify/require"
11+ v1 "k8s.io/api/core/v1"
1012 "k8s.io/apimachinery/pkg/runtime/schema"
13+ "k8s.io/apimachinery/pkg/types"
1114 "k8s.io/client-go/kubernetes/fake"
15+ "k8s.io/client-go/kubernetes/scheme"
1216 typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
1317 "k8s.io/client-go/tools/record"
1418 ctrlmanageropts "k8s.io/controller-manager/options"
@@ -52,7 +56,7 @@ func TestControllerQueueDone(t *testing.T) {
5256 CtxQueue := queue .NewQueueOperationsCtx ()
5357 registry := typed .NewRegistry ()
5458 broadcaster := record .NewBroadcaster ()
55- eventSink := & typedcorev1. EventSinkImpl { Interface : fake . NewSimpleClientset (). CoreV1 (). Events ( "" )}
59+ eventSink := newFakeEventSink ()
5660
5761 controller := NewOwnedResourceController (klogr .New (), "my-controller" , gvr , CtxQueue , registry , broadcaster , func (_ context.Context , gvr schema.GroupVersionResource , namespace , name string ) {
5862 fmt .Println ("processing" , gvr , namespace , name )
@@ -81,3 +85,71 @@ func TestControllerQueueDone(t *testing.T) {
8185 return controller .Queue .Len () == 0
8286 }, 1 * time .Second , 1 * time .Millisecond )
8387}
88+
89+ func TestControllerEventsBroadcast (t * testing.T ) {
90+ gvr := schema.GroupVersionResource {
91+ Group : "example.com" ,
92+ Version : "v1" ,
93+ Resource : "mytypes" ,
94+ }
95+ CtxQueue := queue .NewQueueOperationsCtx ()
96+ registry := typed .NewRegistry ()
97+ broadcaster := record .NewBroadcaster ()
98+ eventSink := newFakeEventSink ()
99+ recorder := broadcaster .NewRecorder (scheme .Scheme , v1.EventSource {Component : "my-controller" })
100+
101+ controller := NewOwnedResourceController (klogr .New (), "my-controller" , gvr , CtxQueue , registry , broadcaster , func (_ context.Context , gvr schema.GroupVersionResource , namespace , name string ) {
102+ fmt .Println ("processing" , gvr , namespace , name )
103+ })
104+
105+ mgr := NewManager (ctrlmanageropts .RecommendedDebuggingOptions ().DebuggingConfiguration , ":8888" , broadcaster , eventSink )
106+ ctx , cancel := context .WithCancel (context .Background ())
107+ defer cancel ()
108+ go func () {
109+ _ = mgr .Start (ctx , controller )
110+ }()
111+ require .Eventually (t , healthCheckPassing (), 1 * time .Second , 50 * time .Millisecond )
112+
113+ recorder .Event (& v1.ObjectReference {Namespace : "test" , Name : "a" }, v1 .EventTypeNormal , "test" , "test" )
114+
115+ require .Eventually (t , func () bool {
116+ return len (eventSink .Events ) > 0
117+ }, 5 * time .Second , 1 * time .Millisecond )
118+ }
119+
120+ type fakeEventSink struct {
121+ Events map [types.UID ]* v1.Event
122+ }
123+
124+ func newFakeEventSink () * fakeEventSink {
125+ return & fakeEventSink {
126+ Events : make (map [types.UID ]* v1.Event ),
127+ }
128+ }
129+
130+ func (f * fakeEventSink ) Create (event * v1.Event ) (* v1.Event , error ) {
131+ f .Events [event .UID ] = event
132+ return event , nil
133+ }
134+
135+ func (f * fakeEventSink ) Update (event * v1.Event ) (* v1.Event , error ) {
136+ f .Events [event .UID ] = event
137+ return event , nil
138+ }
139+
140+ func (f * fakeEventSink ) Patch (oldEvent * v1.Event , _ []byte ) (* v1.Event , error ) {
141+ f .Events [oldEvent .UID ] = oldEvent
142+ return oldEvent , nil
143+ }
144+
145+ func healthCheckPassing () func () bool {
146+ return func () bool {
147+ resp , err := http .Get ("http://localhost:8888/healthz" )
148+ if err != nil {
149+ return false
150+ }
151+ defer resp .Body .Close ()
152+
153+ return resp .StatusCode == http .StatusOK
154+ }
155+ }
0 commit comments