in pkg/controller/jobs/rayjob/rayjob_webhook.go [79:120]
func (w *RayJobWebhook) validateCreate(job *rayjobapi.RayJob) field.ErrorList {
var allErrors field.ErrorList
kueueJob := (*RayJob)(job)
if w.manageJobsWithoutQueueName || jobframework.QueueName(kueueJob) != "" {
spec := &job.Spec
specPath := field.NewPath("spec")
// Should always delete the cluster after the sob has ended, otherwise it will continue to the queue's resources.
if !spec.ShutdownAfterJobFinishes {
allErrors = append(allErrors, field.Invalid(specPath.Child("shutdownAfterJobFinishes"), spec.ShutdownAfterJobFinishes, "a kueue managed job should delete the cluster after finishing"))
}
// Should not want existing cluster. Keuue (workload) should be able to control the admission of the actual work, not only the trigger.
if len(spec.ClusterSelector) > 0 {
allErrors = append(allErrors, field.Invalid(specPath.Child("clusterSelector"), spec.ClusterSelector, "a kueue managed job should not use an existing cluster"))
}
clusterSpec := spec.RayClusterSpec
clusterSpecPath := specPath.Child("rayClusterSpec")
// Should not use auto scaler. Once the resources are reserved by queue the cluster should do it's best to use them.
if pointer.BoolDeref(clusterSpec.EnableInTreeAutoscaling, false) {
allErrors = append(allErrors, field.Invalid(clusterSpecPath.Child("enableInTreeAutoscaling"), clusterSpec.EnableInTreeAutoscaling, "a kueue managed job should not use autoscaling"))
}
// Should limit the worker count to 8 - 1 (max podSets num - cluster head)
if len(clusterSpec.WorkerGroupSpecs) > 7 {
allErrors = append(allErrors, field.TooMany(clusterSpecPath.Child("workerGroupSpecs"), len(clusterSpec.WorkerGroupSpecs), 7))
}
// None of the workerGroups should be named "head"
for i := range clusterSpec.WorkerGroupSpecs {
if clusterSpec.WorkerGroupSpecs[i].GroupName == headGroupPodSetName {
allErrors = append(allErrors, field.Forbidden(clusterSpecPath.Child("workerGroupSpecs").Index(i).Child("groupName"), fmt.Sprintf("%q is reserved for the head group", headGroupPodSetName)))
}
}
}
allErrors = append(allErrors, jobframework.ValidateCreateForQueueName(kueueJob)...)
return allErrors
}