@@ -3,12 +3,16 @@ package manager
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "net/http"
6
7
"testing"
7
8
"time"
8
9
9
10
"github.com/stretchr/testify/require"
11
+ v1 "k8s.io/api/core/v1"
10
12
"k8s.io/apimachinery/pkg/runtime/schema"
13
+ "k8s.io/apimachinery/pkg/types"
11
14
"k8s.io/client-go/kubernetes/fake"
15
+ "k8s.io/client-go/kubernetes/scheme"
12
16
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
13
17
"k8s.io/client-go/tools/record"
14
18
ctrlmanageropts "k8s.io/controller-manager/options"
@@ -52,7 +56,7 @@ func TestControllerQueueDone(t *testing.T) {
52
56
CtxQueue := queue .NewQueueOperationsCtx ()
53
57
registry := typed .NewRegistry ()
54
58
broadcaster := record .NewBroadcaster ()
55
- eventSink := & typedcorev1. EventSinkImpl { Interface : fake . NewSimpleClientset (). CoreV1 (). Events ( "" )}
59
+ eventSink := newFakeEventSink ()
56
60
57
61
controller := NewOwnedResourceController (klogr .New (), "my-controller" , gvr , CtxQueue , registry , broadcaster , func (_ context.Context , gvr schema.GroupVersionResource , namespace , name string ) {
58
62
fmt .Println ("processing" , gvr , namespace , name )
@@ -81,3 +85,71 @@ func TestControllerQueueDone(t *testing.T) {
81
85
return controller .Queue .Len () == 0
82
86
}, 1 * time .Second , 1 * time .Millisecond )
83
87
}
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