in ray-on-gke/tpu/kuberay-tpu-webhook/main.go [374:418]
func validateRayCluster(admissionReview *admissionv1.AdmissionReview) (*admissionv1.AdmissionResponse, error) {
raycluster, err := extractRayCluster(admissionReview)
if err != nil {
return nil, err
}
admit := true
status := "Success"
message := ""
clusterName := raycluster.Name
namespace := raycluster.Namespace
klog.V(1).InfoS("validateRayCluster", "RayCluster", namespace+"/"+clusterName)
workerGroupSpecs := raycluster.Spec.WorkerGroupSpecs
for i := 0; i < len(workerGroupSpecs); i++ {
workerGroupSpec := workerGroupSpecs[i]
workerGroupContainers := workerGroupSpec.Template.Spec.Containers
if len(workerGroupContainers) != 0 && !containerRequestingTPUs(workerGroupContainers...) {
// pass through if no TPUs are requested
continue
}
// validate NumOfHosts for worker group matches topology nodeSelector
workersMatchTopology, err := checkWorkersMatchTopology(clusterName, namespace, workerGroupSpec)
if err != nil {
return nil, err
}
if !workersMatchTopology {
admit = false
status = "Failure"
message = "Number of workers in worker group not equal to specified topology"
break
}
}
// Create AdmissionResponse
admissionResponse := &admissionv1.AdmissionResponse{
UID: admissionReview.Request.UID,
Allowed: admit,
Result: &metav1.Status{
Status: status,
Message: message,
},
}
return admissionResponse, nil
}