@@ -17,91 +17,260 @@ limitations under the License.
17
17
package controller
18
18
19
19
import (
20
+ "fmt"
21
+
22
+ "github.com/kubernetes-sigs/controller-runtime/pkg/client"
23
+ "github.com/kubernetes-sigs/controller-runtime/pkg/controller/reconcile"
24
+ "github.com/kubernetes-sigs/controller-runtime/pkg/internal/informer"
25
+ "github.com/kubernetes-sigs/controller-runtime/pkg/internal/informer/informertest"
20
26
. "github.com/onsi/ginkgo"
27
+ . "github.com/onsi/gomega"
28
+ "k8s.io/apimachinery/pkg/api/meta"
29
+ "k8s.io/apimachinery/pkg/runtime"
30
+ "k8s.io/client-go/rest"
31
+ "k8s.io/client-go/tools/cache"
21
32
)
22
33
34
+ var TestConfig * rest.Config
35
+
23
36
var _ = Describe ("controller" , func () {
37
+ var stop chan struct {}
38
+
39
+ rec := reconcile .Func (func (reconcile.Request ) (reconcile.Result , error ) {
40
+ return reconcile.Result {}, nil
41
+ })
24
42
BeforeEach (func () {
43
+ stop = make (chan struct {})
25
44
})
26
45
27
46
AfterEach (func () {
47
+ close (stop )
28
48
})
29
49
30
50
Describe ("Creating a Manager" , func () {
31
51
32
- It ("should return an error if Name is not Specified" , func () {
52
+ It ("should return an error if there is no Config" , func () {
53
+ m , err := NewManager (ManagerArgs {})
54
+ Expect (m ).To (BeNil ())
55
+ Expect (err .Error ()).To (ContainSubstring ("must specify Config" ))
33
56
34
57
})
35
58
36
59
It ("should return an error if it can't create a RestMapper" , func () {
37
-
38
- })
39
-
40
- It ("should return an error if it cannot get a Config" , func () {
41
-
42
- })
43
-
44
- It ("should default the Config if none is specified" , func () {
60
+ expected := fmt .Errorf ("expected error: RestMapper" )
61
+ m , err := NewManager (ManagerArgs {
62
+ Config : TestConfig ,
63
+ MapperProvider : func (c * rest.Config ) (meta.RESTMapper , error ) { return nil , expected },
64
+ })
65
+ Expect (m ).To (BeNil ())
66
+ Expect (err ).To (Equal (expected ))
45
67
46
68
})
47
69
})
48
70
49
71
Describe ("Staring a Manager" , func () {
50
72
51
73
It ("should Start each Controller" , func () {
52
-
74
+ // TODO(community): write this
53
75
})
54
76
55
- It ("should return an error if any Controllers fail to stop" , func () {
56
-
77
+ It ("should return an error if any Controllers fail to stop" , func (done Done ) {
78
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
79
+ Expect (err ).NotTo (HaveOccurred ())
80
+ c , err := m .NewController (Args {Name : "foo" }, rec )
81
+ Expect (err ).NotTo (HaveOccurred ())
82
+ ctrl , ok := c .(* controller )
83
+ Expect (ok ).To (BeTrue ())
84
+
85
+ // Make Controller startup fail
86
+ ctrl .waitForCache = func (stopCh <- chan struct {}, cacheSyncs ... cache.InformerSynced ) bool { return false }
87
+ err = m .Start (stop )
88
+ Expect (err ).To (HaveOccurred ())
89
+ Expect (err .Error ()).To (ContainSubstring ("caches to sync" ))
90
+
91
+ close (done )
57
92
})
58
93
})
59
94
60
95
Describe ("Manager" , func () {
61
96
It ("should provide a function to get the Config" , func () {
62
-
97
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
98
+ Expect (err ).NotTo (HaveOccurred ())
99
+ mrg , ok := m .(* controllerManager )
100
+ Expect (ok ).To (BeTrue ())
101
+ Expect (m .GetConfig ()).To (Equal (mrg .config ))
63
102
})
64
103
65
104
It ("should provide a function to get the Client" , func () {
66
-
105
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
106
+ Expect (err ).NotTo (HaveOccurred ())
107
+ mrg , ok := m .(* controllerManager )
108
+ Expect (ok ).To (BeTrue ())
109
+ Expect (m .GetClient ()).To (Equal (mrg .client ))
67
110
})
68
111
69
112
It ("should provide a function to get the Scheme" , func () {
70
-
113
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
114
+ Expect (err ).NotTo (HaveOccurred ())
115
+ mrg , ok := m .(* controllerManager )
116
+ Expect (ok ).To (BeTrue ())
117
+ Expect (m .GetScheme ()).To (Equal (mrg .scheme ))
71
118
})
72
119
73
120
It ("should provide a function to get the FieldIndexer" , func () {
74
-
75
- })
76
- })
77
-
78
- Describe ("Creating a Controller" , func () {
79
-
80
- It ("should immediately start the Controller if the ControllerManager has already Started" , func () {
81
-
82
- })
83
-
84
- It ("should provide an inject function for providing dependencies" , func () {
85
-
121
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
122
+ Expect (err ).NotTo (HaveOccurred ())
123
+ mrg , ok := m .(* controllerManager )
124
+ Expect (ok ).To (BeTrue ())
125
+ Expect (m .GetFieldIndexer ()).To (Equal (mrg .fieldIndexes ))
86
126
})
87
127
})
88
128
89
129
Describe ("Creating a Controller" , func () {
90
130
It ("should return an error if Name is not Specified" , func () {
91
-
92
- } )
93
-
94
- It ( "should return an error if it cannot get a Config" , func () {
95
-
131
+ m , err := NewManager ( ManagerArgs { Config : TestConfig })
132
+ Expect ( err ). NotTo ( HaveOccurred () )
133
+ c , err := m . NewController ( Args {}, rec )
134
+ Expect ( c ). To ( BeNil ())
135
+ Expect ( err . Error ()). To ( ContainSubstring ( "must specify Name for Controller" ))
96
136
})
97
137
98
- It ("should default the Config if none is specified" , func () {
138
+ It ("should return an error if Reconcile is not Specified" , func () {
139
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
140
+ Expect (err ).NotTo (HaveOccurred ())
141
+ c , err := m .NewController (Args {Name : "foo" }, nil )
142
+ Expect (c ).To (BeNil ())
143
+ Expect (err .Error ()).To (ContainSubstring ("must specify Reconcile" ))
99
144
100
145
})
101
146
102
147
It ("should immediately start the Controller if the ControllerManager has already Started" , func () {
103
-
148
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
149
+ Expect (err ).NotTo (HaveOccurred ())
150
+ mrg , ok := m .(* controllerManager )
151
+ Expect (ok ).To (BeTrue ())
152
+
153
+ // Make Controller startup fail
154
+ go func () {
155
+ defer GinkgoRecover ()
156
+ Expect (m .Start (stop )).NotTo (HaveOccurred ())
157
+ }()
158
+ Eventually (func () bool { return mrg .started }).Should (BeTrue ())
159
+
160
+ c , err := m .NewController (Args {Name : "Foo" }, rec )
161
+ Expect (err ).NotTo (HaveOccurred ())
162
+ ctrl , ok := c .(* controller )
163
+ Expect (ok ).To (BeTrue ())
164
+
165
+ // Wait for Controller to start
166
+ Eventually (func () bool { return ctrl .started }).Should (BeTrue ())
104
167
})
105
168
169
+ It ("should provide an inject function for providing dependencies" , func (done Done ) {
170
+ m , err := NewManager (ManagerArgs {Config : TestConfig })
171
+ Expect (err ).NotTo (HaveOccurred ())
172
+ mrg , ok := m .(* controllerManager )
173
+ Expect (ok ).To (BeTrue ())
174
+
175
+ mrg .informers = & informertest.FakeInformers {}
176
+
177
+ c , err := m .NewController (Args {Name : "foo" }, rec )
178
+ Expect (err ).NotTo (HaveOccurred ())
179
+ ctrl , ok := c .(* controller )
180
+ Expect (ok ).To (BeTrue ())
181
+
182
+ By ("Injecting the dependencies" )
183
+ err = ctrl .inject (& injectable {
184
+ scheme : func (scheme * runtime.Scheme ) error {
185
+ defer GinkgoRecover ()
186
+ Expect (scheme ).To (Equal (mrg .scheme ))
187
+ return nil
188
+ },
189
+ config : func (config * rest.Config ) error {
190
+ defer GinkgoRecover ()
191
+ Expect (config ).To (Equal (mrg .config ))
192
+ return nil
193
+ },
194
+ client : func (client client.Interface ) error {
195
+ defer GinkgoRecover ()
196
+ Expect (client ).To (Equal (mrg .client ))
197
+ return nil
198
+ },
199
+ informers : func (informers informer.Informers ) error {
200
+ defer GinkgoRecover ()
201
+ Expect (informers ).To (Equal (mrg .informers ))
202
+ return nil
203
+ },
204
+ })
205
+ Expect (err ).NotTo (HaveOccurred ())
206
+
207
+ By ("Returning an error if dependency injection fails" )
208
+
209
+ expected := fmt .Errorf ("expected error" )
210
+ err = ctrl .inject (& injectable {
211
+ client : func (client client.Interface ) error {
212
+ return expected
213
+ },
214
+ })
215
+ Expect (err ).To (Equal (expected ))
216
+
217
+ err = ctrl .inject (& injectable {
218
+ scheme : func (scheme * runtime.Scheme ) error {
219
+ return expected
220
+ },
221
+ })
222
+ Expect (err ).To (Equal (expected ))
223
+
224
+ err = ctrl .inject (& injectable {
225
+ config : func (config * rest.Config ) error {
226
+ return expected
227
+ },
228
+ })
229
+ Expect (err ).To (Equal (expected ))
230
+
231
+ err = ctrl .inject (& injectable {
232
+ informers : func (informers informer.Informers ) error {
233
+ return expected
234
+ },
235
+ })
236
+ Expect (err ).To (Equal (expected ))
237
+
238
+ close (done )
239
+ })
106
240
})
107
241
})
242
+
243
+ type injectable struct {
244
+ scheme func (scheme * runtime.Scheme ) error
245
+ client func (client.Interface ) error
246
+ config func (config * rest.Config ) error
247
+ informers func (informer.Informers ) error
248
+ }
249
+
250
+ func (i * injectable ) InjectInformers (informers informer.Informers ) error {
251
+ if i .informers == nil {
252
+ return nil
253
+ }
254
+ return i .informers (informers )
255
+ }
256
+
257
+ func (i * injectable ) InjectConfig (config * rest.Config ) error {
258
+ if i .config == nil {
259
+ return nil
260
+ }
261
+ return i .config (config )
262
+ }
263
+
264
+ func (i * injectable ) InjectClient (c client.Interface ) error {
265
+ if i .client == nil {
266
+ return nil
267
+ }
268
+ return i .client (c )
269
+ }
270
+
271
+ func (i * injectable ) InjectScheme (scheme * runtime.Scheme ) error {
272
+ if i .scheme == nil {
273
+ return nil
274
+ }
275
+ return i .scheme (scheme )
276
+ }
0 commit comments