@@ -25,15 +25,20 @@ import (
25
25
"strings"
26
26
"testing"
27
27
28
+ "github.com/stretchr/testify/assert"
29
+ "github.com/stretchr/testify/require"
28
30
v1 "k8s.io/api/core/v1"
31
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
32
"k8s.io/apimachinery/pkg/util/intstr"
30
33
"k8s.io/client-go/tools/record"
34
+ "k8s.io/kubernetes/pkg/api/legacyscheme"
31
35
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
32
36
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
33
37
"k8s.io/kubernetes/pkg/kubelet/prober/results"
34
38
"k8s.io/kubernetes/pkg/kubelet/util/ioutils"
35
39
"k8s.io/kubernetes/pkg/probe"
36
40
execprobe "k8s.io/kubernetes/pkg/probe/exec"
41
+ "k8s.io/kubernetes/test/utils/ktesting"
37
42
)
38
43
39
44
func TestGetURLParts (t * testing.T ) {
@@ -141,6 +146,7 @@ func TestProbe(t *testing.T) {
141
146
Exec : & v1.ExecAction {},
142
147
},
143
148
}
149
+
144
150
tests := []struct {
145
151
probe * v1.Probe
146
152
env []v1.EnvVar
@@ -149,6 +155,7 @@ func TestProbe(t *testing.T) {
149
155
execResult probe.Result
150
156
expectedResult results.Result
151
157
expectCommand []string
158
+ unsupported bool
152
159
}{
153
160
{ // No probe
154
161
probe : nil ,
@@ -174,18 +181,25 @@ func TestProbe(t *testing.T) {
174
181
execResult : probe .Warning ,
175
182
expectedResult : results .Success ,
176
183
},
177
- { // Probe result is unknown
184
+ { // Probe result is unknown with no error
178
185
probe : execProbe ,
179
186
execResult : probe .Unknown ,
187
+ expectError : false ,
180
188
expectedResult : results .Failure ,
181
189
},
182
- { // Probe has an error
190
+ { // Probe result is unknown with an error
183
191
probe : execProbe ,
184
192
execError : true ,
185
193
expectError : true ,
186
194
execResult : probe .Unknown ,
187
195
expectedResult : results .Failure ,
188
196
},
197
+ { // Unsupported probe type
198
+ probe : nil ,
199
+ expectedResult : results .Failure ,
200
+ expectError : true ,
201
+ unsupported : true ,
202
+ },
189
203
{ // Probe arguments are passed through
190
204
probe : & v1.Probe {
191
205
ProbeHandler : v1.ProbeHandler {
@@ -216,13 +230,17 @@ func TestProbe(t *testing.T) {
216
230
}
217
231
218
232
for i , test := range tests {
219
- for _ , probeType := range [... ]probeType {liveness , readiness , startup } {
233
+ for _ , pType := range [... ]probeType {liveness , readiness , startup } {
234
+
235
+ if test .unsupported {
236
+ pType = probeType (666 )
237
+ }
220
238
prober := & prober {
221
239
recorder : & record.FakeRecorder {},
222
240
}
223
- testID := fmt .Sprintf ("%d-%s" , i , probeType )
241
+ testID := fmt .Sprintf ("%d-%s" , i , pType )
224
242
testContainer := v1.Container {Env : test .env }
225
- switch probeType {
243
+ switch pType {
226
244
case liveness :
227
245
testContainer .LivenessProbe = test .probe
228
246
case readiness :
@@ -236,25 +254,22 @@ func TestProbe(t *testing.T) {
236
254
prober .exec = fakeExecProber {test .execResult , nil }
237
255
}
238
256
239
- result , err := prober .probe (ctx , probeType , & v1.Pod {}, v1.PodStatus {}, testContainer , containerID )
240
- if test .expectError && err == nil {
241
- t .Errorf ("[%s] Expected probe error but no error was returned." , testID )
242
- }
243
- if ! test .expectError && err != nil {
244
- t .Errorf ("[%s] Didn't expect probe error but got: %v" , testID , err )
245
- }
246
- if test .expectedResult != result {
247
- t .Errorf ("[%s] Expected result to be %v but was %v" , testID , test .expectedResult , result )
257
+ result , err := prober .probe (ctx , pType , & v1.Pod {}, v1.PodStatus {}, testContainer , containerID )
258
+
259
+ if test .expectError {
260
+ require .Error (t , err , "[%s] Expected probe error but no error was returned." , testID )
261
+ } else {
262
+ require .NoError (t , err , "[%s] Didn't expect probe error" , testID )
248
263
}
249
264
265
+ require .Equal (t , test .expectedResult , result , "[%s] Expected result to be %v but was %v" , testID , test .expectedResult , result )
266
+
250
267
if len (test .expectCommand ) > 0 {
251
268
prober .exec = execprobe .New ()
252
269
prober .runner = & containertest.FakeContainerCommandRunner {}
253
- _ , err := prober .probe (ctx , probeType , & v1.Pod {}, v1.PodStatus {}, testContainer , containerID )
254
- if err != nil {
255
- t .Errorf ("[%s] Didn't expect probe error but got: %v" , testID , err )
256
- continue
257
- }
270
+ _ , err := prober .probe (ctx , pType , & v1.Pod {}, v1.PodStatus {}, testContainer , containerID )
271
+ require .NoError (t , err , "[%s] Didn't expect probe error " , testID )
272
+
258
273
if ! reflect .DeepEqual (test .expectCommand , prober .runner .(* containertest.FakeContainerCommandRunner ).Cmd ) {
259
274
t .Errorf ("[%s] unexpected probe arguments: %v" , testID , prober .runner .(* containertest.FakeContainerCommandRunner ).Cmd )
260
275
}
@@ -264,7 +279,7 @@ func TestProbe(t *testing.T) {
264
279
}
265
280
266
281
func TestNewExecInContainer (t * testing.T ) {
267
- ctx := context . Background ( )
282
+ ctx := ktesting . Init ( t )
268
283
limit := 1024
269
284
tenKilobyte := strings .Repeat ("logs-123" , 128 * 10 )
270
285
@@ -333,3 +348,95 @@ func TestNewExecInContainer(t *testing.T) {
333
348
}
334
349
}
335
350
}
351
+
352
+ func TestNewProber (t * testing.T ) {
353
+ runner := & containertest.FakeContainerCommandRunner {}
354
+ recorder := & record.FakeRecorder {}
355
+ prober := newProber (runner , recorder )
356
+
357
+ assert .NotNil (t , prober , "Expected prober to be non-nil" )
358
+ assert .Equal (t , runner , prober .runner , "Expected prober runner to match" )
359
+ assert .Equal (t , recorder , prober .recorder , "Expected prober recorder to match" )
360
+
361
+ assert .NotNil (t , prober .exec , "exec probe initialized" )
362
+ assert .NotNil (t , prober .http , "http probe initialized" )
363
+ assert .NotNil (t , prober .tcp , "tcp probe initialized" )
364
+ assert .NotNil (t , prober .grpc , "grpc probe initialized" )
365
+
366
+ }
367
+
368
+ func TestRecordContainerEventUnknownStatus (t * testing.T ) {
369
+
370
+ err := v1 .AddToScheme (legacyscheme .Scheme )
371
+ require .NoError (t , err , "failed to add v1 to scheme" )
372
+
373
+ pod := & v1.Pod {
374
+ ObjectMeta : metav1.ObjectMeta {
375
+ UID : "test-probe-pod" ,
376
+ },
377
+ Spec : v1.PodSpec {
378
+ Containers : []v1.Container {
379
+ {
380
+ Name : "test-probe-container" ,
381
+ },
382
+ },
383
+ },
384
+ }
385
+
386
+ container := pod .Spec .Containers [0 ]
387
+ output := "probe output"
388
+
389
+ testCases := []struct {
390
+ name string
391
+ probeType probeType
392
+ result probe.Result
393
+ expected []string
394
+ }{
395
+ {
396
+ name : "Readiness Probe Unknown" ,
397
+ probeType : readiness ,
398
+ result : probe .Unknown ,
399
+ expected : []string {
400
+ "Warning ContainerProbeWarning Readiness probe warning: probe output" ,
401
+ "Warning ContainerProbeWarning Unknown Readiness probe status: unknown" ,
402
+ },
403
+ },
404
+ {
405
+ name : "Liveness Probe Unknown" ,
406
+ probeType : liveness ,
407
+ result : probe .Unknown ,
408
+ expected : []string {
409
+ "Warning ContainerProbeWarning Liveness probe warning: probe output" ,
410
+ "Warning ContainerProbeWarning Unknown Liveness probe status: unknown" ,
411
+ },
412
+ },
413
+ {
414
+ name : "Startup Probe Unknown" ,
415
+ probeType : startup ,
416
+ result : probe .Unknown ,
417
+ expected : []string {
418
+ "Warning ContainerProbeWarning Startup probe warning: probe output" ,
419
+ "Warning ContainerProbeWarning Unknown Startup probe status: unknown" ,
420
+ },
421
+ },
422
+ }
423
+
424
+ for _ , tc := range testCases {
425
+ t .Run (tc .name , func (t * testing.T ) {
426
+ bufferSize := len (tc .expected ) + 1
427
+ fakeRecorder := record .NewFakeRecorder (bufferSize )
428
+
429
+ pb := & prober {
430
+ recorder : fakeRecorder ,
431
+ }
432
+
433
+ pb .recordContainerEvent (pod , & container , v1 .EventTypeWarning , "ContainerProbeWarning" , "%s probe warning: %s" , tc .probeType , output )
434
+ pb .recordContainerEvent (pod , & container , v1 .EventTypeWarning , "ContainerProbeWarning" , "Unknown %s probe status: %s" , tc .probeType , tc .result )
435
+
436
+ assert .Equal (t , len (tc .expected ), len (fakeRecorder .Events ), "unexpected number of events" )
437
+ for _ , expected := range tc .expected {
438
+ assert .Equal (t , expected , <- fakeRecorder .Events )
439
+ }
440
+ })
441
+ }
442
+ }
0 commit comments