@@ -18,6 +18,7 @@ package hook_test
18
18
19
19
import (
20
20
"context"
21
+ "errors"
21
22
"fmt"
22
23
"reflect"
23
24
"strings"
@@ -130,8 +131,8 @@ var _ = Describe("Hook", func() {
130
131
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
131
132
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
132
133
Expect (c .WatchCalls ).To (HaveLen (2 ))
133
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
134
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
134
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
135
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
135
136
})
136
137
137
138
Context ("when the owner is cluster-scoped" , func () {
@@ -153,8 +154,8 @@ var _ = Describe("Hook", func() {
153
154
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
154
155
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
155
156
Expect (c .WatchCalls ).To (HaveLen (2 ))
156
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
157
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
157
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
158
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
158
159
})
159
160
It ("should watch cluster-scoped resources with ownerRef handler" , func () {
160
161
rel = & release.Release {
@@ -163,8 +164,8 @@ var _ = Describe("Hook", func() {
163
164
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
164
165
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
165
166
Expect (c .WatchCalls ).To (HaveLen (2 ))
166
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
167
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
167
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
168
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
168
169
})
169
170
It ("should watch resource policy keep resources with annotation handler" , func () {
170
171
rel = & release.Release {
@@ -173,10 +174,10 @@ var _ = Describe("Hook", func() {
173
174
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
174
175
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
175
176
Expect (c .WatchCalls ).To (HaveLen (4 ))
176
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
177
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
178
- Expect (validateSourceHandlerType (c .WatchCalls [2 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
179
- Expect (validateSourceHandlerType (c .WatchCalls [3 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
177
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
178
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
179
+ Expect (validateSourceHandlerType (c .WatchCalls [2 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
180
+ Expect (validateSourceHandlerType (c .WatchCalls [3 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
180
181
})
181
182
})
182
183
@@ -200,7 +201,7 @@ var _ = Describe("Hook", func() {
200
201
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
201
202
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
202
203
Expect (c .WatchCalls ).To (HaveLen (1 ))
203
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
204
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
204
205
})
205
206
It ("should watch cluster-scoped resources with annotation handler" , func () {
206
207
rel = & release.Release {
@@ -209,7 +210,7 @@ var _ = Describe("Hook", func() {
209
210
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
210
211
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
211
212
Expect (c .WatchCalls ).To (HaveLen (1 ))
212
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
213
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
213
214
})
214
215
It ("should watch namespace-scoped resources in a different namespace with annotation handler" , func () {
215
216
rel = & release.Release {
@@ -218,7 +219,7 @@ var _ = Describe("Hook", func() {
218
219
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
219
220
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
220
221
Expect (c .WatchCalls ).To (HaveLen (1 ))
221
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
222
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
222
223
})
223
224
It ("should watch resource policy keep resources with annotation handler" , func () {
224
225
rel = & release.Release {
@@ -227,9 +228,9 @@ var _ = Describe("Hook", func() {
227
228
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
228
229
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
229
230
Expect (c .WatchCalls ).To (HaveLen (3 ))
230
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
231
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
232
- Expect (validateSourceHandlerType (c .WatchCalls [2 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (BeNil ())
231
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
232
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
233
+ Expect (validateSourceHandlerType (c .WatchCalls [2 ].Source , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
233
234
})
234
235
It ("should iterate the kind list and be able to set watches on each item" , func () {
235
236
rel = & release.Release {
@@ -238,8 +239,8 @@ var _ = Describe("Hook", func() {
238
239
drw = internalhook .NewDependentResourceWatcher (c , rm , cache , sch )
239
240
Expect (drw .Exec (owner , * rel , log )).To (Succeed ())
240
241
Expect (c .WatchCalls ).To (HaveLen (2 ))
241
- Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
242
- Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (BeNil ())
242
+ Expect (validateSourceHandlerType (c .WatchCalls [0 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
243
+ Expect (validateSourceHandlerType (c .WatchCalls [1 ].Source , handler .TypedEnqueueRequestForOwner [* unstructured.Unstructured ](sch , rm , owner , handler .OnlyControllerOwner ()))).To (Succeed ())
243
244
})
244
245
It ("should error when unable to list objects" , func () {
245
246
rel = & release.Release {
@@ -254,17 +255,49 @@ var _ = Describe("Hook", func() {
254
255
})
255
256
})
256
257
258
+ var _ = Describe ("validateSourceHandlerType" , func () {
259
+ It ("should return an error when source.Source is nil" , func () {
260
+ Expect (validateSourceHandlerType (nil , & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (HaveOccurred ())
261
+ })
262
+ It ("should return an error when source.Kind.Handler is nil" , func () {
263
+ Expect (validateSourceHandlerType (source .Kind (nil , & unstructured.Unstructured {}, nil , nil ), & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (HaveOccurred ())
264
+ })
265
+ It ("should return an error when expected is nil" , func () {
266
+ Expect (validateSourceHandlerType (source .Kind (nil , & unstructured.Unstructured {}, & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{}, nil ), nil )).To (HaveOccurred ())
267
+ })
268
+ It ("should return an error when source.Kind.Handler does not match expected type" , func () {
269
+ Expect (validateSourceHandlerType (source .Kind (nil , & unstructured.Unstructured {}, & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{}, nil ), "string" )).To (HaveOccurred ())
270
+ })
271
+ It ("should not return an error when source.Kind.Handler matches expectedType" , func () {
272
+ Expect (validateSourceHandlerType (source .Kind (nil , & unstructured.Unstructured {}, & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{}, nil ), & sdkhandler.EnqueueRequestForAnnotation [* unstructured.Unstructured ]{})).To (Succeed ())
273
+ })
274
+ })
275
+
257
276
// validateSourceHandlerType takes in a source.Source and uses reflection to determine
258
277
// if the handler used by the source matches the expected type.
259
278
// It is assumed that the source.Source was created via the source.Kind() function.
260
279
func validateSourceHandlerType (s source.Source , expected interface {}) error {
280
+ if s == nil {
281
+ return errors .New ("nil source.Source provided" )
282
+ }
261
283
sourceVal := reflect .Indirect (reflect .ValueOf (s ))
284
+ if ! sourceVal .IsValid () {
285
+ return errors .New ("provided source.Source value is invalid" )
286
+ }
262
287
handlerFieldVal := sourceVal .FieldByName ("Handler" )
263
-
288
+ if ! handlerFieldVal .IsValid () {
289
+ return errors .New ("provided source.Source's Handler field is invalid" )
290
+ }
264
291
handlerField := reflect .Indirect (handlerFieldVal .Elem ())
292
+ if ! handlerField .IsValid () {
293
+ return errors .New ("provided source.Source's Handler field value is invalid" )
294
+ }
265
295
handlerType := handlerField .Type ()
266
296
267
297
expectedValue := reflect .Indirect (reflect .ValueOf (expected ))
298
+ if ! expectedValue .IsValid () {
299
+ return errors .New ("provided expected value is invalid" )
300
+ }
268
301
269
302
expectedType := expectedValue .Type ()
270
303
if handlerType != expectedType {
0 commit comments