@@ -2,6 +2,7 @@ package ray
2
2
3
3
import (
4
4
"context"
5
+ "strings"
5
6
"testing"
6
7
7
8
"github.com/stretchr/testify/assert"
@@ -12,10 +13,13 @@ import (
12
13
"k8s.io/apimachinery/pkg/types"
13
14
"k8s.io/client-go/tools/record"
14
15
"k8s.io/utils/ptr"
16
+ "sigs.k8s.io/controller-runtime/pkg/client"
15
17
clientFake "sigs.k8s.io/controller-runtime/pkg/client/fake"
18
+ "sigs.k8s.io/controller-runtime/pkg/client/interceptor"
16
19
17
20
rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1"
18
21
utils "github.com/ray-project/kuberay/ray-operator/controllers/ray/utils"
22
+ "github.com/ray-project/kuberay/ray-operator/pkg/client/clientset/versioned/scheme"
19
23
)
20
24
21
25
func TestCreateK8sJobIfNeed (t * testing.T ) {
@@ -370,3 +374,58 @@ func TestValidateRayJobSpec(t *testing.T) {
370
374
})
371
375
assert .Error (t , err , "The RayJob is invalid because the backoffLimit must be a positive integer." )
372
376
}
377
+
378
+ func TestFailedCreatek8sJob (t * testing.T ) {
379
+ rayJob := & rayv1.RayJob {
380
+ ObjectMeta : metav1.ObjectMeta {
381
+ Name : "test-rayjob" ,
382
+ Namespace : "default" ,
383
+ },
384
+ }
385
+
386
+ submitterTemplate := corev1.PodTemplateSpec {
387
+ ObjectMeta : metav1.ObjectMeta {
388
+ Name : "test-submit-pod" ,
389
+ Namespace : "default" ,
390
+ },
391
+ Spec : corev1.PodSpec {
392
+ Containers : []corev1.Container {
393
+ {
394
+ Name : "ray-submit" ,
395
+ Image : "rayproject/ray:latest" ,
396
+ },
397
+ },
398
+ },
399
+ }
400
+
401
+ fakeClient := clientFake .NewClientBuilder ().WithInterceptorFuncs (interceptor.Funcs {
402
+ Create : func (_ context.Context , _ client.WithWatch , _ client.Object , _ ... client.CreateOption ) error {
403
+ return utils .ErrFailedCreateWorkerPod
404
+ },
405
+ }).WithScheme (scheme .Scheme ).Build ()
406
+
407
+ recorder := record .NewFakeRecorder (100 )
408
+
409
+ reconciler := & RayJobReconciler {
410
+ Client : fakeClient ,
411
+ Recorder : recorder ,
412
+ Scheme : scheme .Scheme ,
413
+ }
414
+
415
+ err := reconciler .createNewK8sJob (context .Background (), rayJob , submitterTemplate )
416
+
417
+ assert .NotNil (t , err , "Expected error due to simulated job creation failure" )
418
+
419
+ var foundFailureEvent bool
420
+ events := []string {}
421
+ for len (recorder .Events ) > 0 {
422
+ event := <- recorder .Events
423
+ if strings .Contains (event , "Failed to create new Kubernetes Job" ) {
424
+ foundFailureEvent = true
425
+ break
426
+ }
427
+ events = append (events , event )
428
+ }
429
+
430
+ assert .Truef (t , foundFailureEvent , "Expected event to be generated for job creation failure, got events: %s" , strings .Join (events , "\n " ))
431
+ }
0 commit comments