2019-01-12 04:58:27 +00:00
/ *
Copyright 2017 The Kubernetes Authors .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package validation
import (
"fmt"
"strings"
apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
"k8s.io/apimachinery/pkg/util/validation/field"
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
"k8s.io/kubernetes/pkg/apis/scheduling"
)
// ValidatePriorityClass tests whether required fields in the PriorityClass are
// set correctly.
func ValidatePriorityClass ( pc * scheduling . PriorityClass ) field . ErrorList {
allErrs := field . ErrorList { }
allErrs = append ( allErrs , apivalidation . ValidateObjectMeta ( & pc . ObjectMeta , false , apimachineryvalidation . NameIsDNSSubdomain , field . NewPath ( "metadata" ) ) ... )
// If the priorityClass starts with a system prefix, it must be one of the
// predefined system priority classes.
if strings . HasPrefix ( pc . Name , scheduling . SystemPriorityClassPrefix ) {
if is , err := scheduling . IsKnownSystemPriorityClass ( pc ) ; ! is {
allErrs = append ( allErrs , field . Forbidden ( field . NewPath ( "metadata" , "name" ) , "priority class names with '" + scheduling . SystemPriorityClassPrefix + "' prefix are reserved for system use only. error: " + err . Error ( ) ) )
}
} else if pc . Value > scheduling . HighestUserDefinablePriority {
// Non-system critical priority classes are not allowed to have a value larger than HighestUserDefinablePriority.
allErrs = append ( allErrs , field . Forbidden ( field . NewPath ( "value" ) , fmt . Sprintf ( "maximum allowed value of a user defined priority is %v" , scheduling . HighestUserDefinablePriority ) ) )
}
2019-08-30 18:33:25 +00:00
if pc . PreemptionPolicy != nil {
allErrs = append ( allErrs , apivalidation . ValidatePreemptionPolicy ( pc . PreemptionPolicy , field . NewPath ( "preemptionPolicy" ) ) ... )
}
2019-01-12 04:58:27 +00:00
return allErrs
}
// ValidatePriorityClassUpdate tests if required fields in the PriorityClass are
// set and are valid. PriorityClass does not allow updating Name, and Value.
func ValidatePriorityClassUpdate ( pc , oldPc * scheduling . PriorityClass ) field . ErrorList {
allErrs := apivalidation . ValidateObjectMetaUpdate ( & pc . ObjectMeta , & oldPc . ObjectMeta , field . NewPath ( "metadata" ) )
// Name is immutable and is checked by the ObjectMeta validator.
if pc . Value != oldPc . Value {
allErrs = append ( allErrs , field . Forbidden ( field . NewPath ( "Value" ) , "may not be changed in an update." ) )
}
2019-08-30 18:33:25 +00:00
// PreemptionPolicy is immutable and is checked by the ObjectMeta validator.
allErrs = append ( allErrs , apivalidation . ValidateImmutableField ( pc . PreemptionPolicy , oldPc . PreemptionPolicy , field . NewPath ( "preemptionPolicy" ) ) ... )
2019-01-12 04:58:27 +00:00
return allErrs
}