in pkg/webhooks/admission/queues/validate/validate_queue.go [111:165]
func validateHierarchicalAttributes(queue *schedulingv1beta1.Queue, fldPath *field.Path) field.ErrorList {
errs := field.ErrorList{}
hierarchy := queue.Annotations[schedulingv1beta1.KubeHierarchyAnnotationKey]
hierarchicalWeights := queue.Annotations[schedulingv1beta1.KubeHierarchyWeightAnnotationKey]
if hierarchy != "" || hierarchicalWeights != "" {
paths := strings.Split(hierarchy, "/")
weights := strings.Split(hierarchicalWeights, "/")
// path length must be the same with weights length
if len(paths) != len(weights) {
return append(errs, field.Invalid(fldPath, hierarchy,
fmt.Sprintf("%s must have the same length with %s",
schedulingv1beta1.KubeHierarchyAnnotationKey,
schedulingv1beta1.KubeHierarchyWeightAnnotationKey,
)))
}
// check weights format
for _, weight := range weights {
weightFloat, err := strconv.ParseFloat(weight, 64)
if err != nil {
return append(errs, field.Invalid(fldPath, hierarchicalWeights,
fmt.Sprintf("%s in the %s is invalid number: %v",
weight, hierarchicalWeights, err,
)))
}
if weightFloat <= 0 {
return append(errs, field.Invalid(fldPath, hierarchicalWeights,
fmt.Sprintf("%s in the %s must be larger than 0",
weight, hierarchicalWeights,
)))
}
}
// The node is not allowed to be in the sub path of a node.
// For example, a queue with "root/sci" conflicts with a queue with "root/sci/dev"
queueList, err := config.VolcanoClient.SchedulingV1beta1().Queues().List(context.TODO(), metav1.ListOptions{})
if err != nil {
return append(errs, field.Invalid(fldPath, hierarchy,
fmt.Sprintf("checking %s, list queues failed: %v",
schedulingv1beta1.KubeHierarchyAnnotationKey,
err,
)))
}
for _, queueInTree := range queueList.Items {
hierarchyInTree := queueInTree.Annotations[schedulingv1beta1.KubeHierarchyAnnotationKey]
if hierarchyInTree != "" && queue.Name != queueInTree.Name &&
strings.HasPrefix(hierarchyInTree, hierarchy) {
return append(errs, field.Invalid(fldPath, hierarchy,
fmt.Sprintf("%s is not allowed to be in the sub path of %s of queue %s",
hierarchy, hierarchyInTree, queueInTree.Name)))
}
}
}
return errs
}