| /* |
| Copyright 2014 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 ( |
| "strings" |
| |
| "k8s.io/apimachinery/pkg/util/validation" |
| "k8s.io/apimachinery/pkg/util/validation/field" |
| ) |
| |
| const IsNegativeErrorMsg string = `must be greater than or equal to 0` |
| |
| // ValidateNameFunc validates that the provided name is valid for a given resource type. |
| // Not all resources have the same validation rules for names. Prefix is true |
| // if the name will have a value appended to it. If the name is not valid, |
| // this returns a list of descriptions of individual characteristics of the |
| // value that were not valid. Otherwise this returns an empty list or nil. |
| type ValidateNameFunc func(name string, prefix bool) []string |
| |
| // NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain. |
| func NameIsDNSSubdomain(name string, prefix bool) []string { |
| if prefix { |
| name = maskTrailingDash(name) |
| } |
| return validation.IsDNS1123Subdomain(name) |
| } |
| |
| // NameIsDNSLabel is a ValidateNameFunc for names that must be a DNS 1123 label. |
| func NameIsDNSLabel(name string, prefix bool) []string { |
| if prefix { |
| name = maskTrailingDash(name) |
| } |
| return validation.IsDNS1123Label(name) |
| } |
| |
| // NameIsDNS1035Label is a ValidateNameFunc for names that must be a DNS 952 label. |
| func NameIsDNS1035Label(name string, prefix bool) []string { |
| if prefix { |
| name = maskTrailingDash(name) |
| } |
| return validation.IsDNS1035Label(name) |
| } |
| |
| // ValidateNamespaceName can be used to check whether the given namespace name is valid. |
| // Prefix indicates this name will be used as part of generation, in which case |
| // trailing dashes are allowed. |
| var ValidateNamespaceName = NameIsDNSLabel |
| |
| // ValidateServiceAccountName can be used to check whether the given service account name is valid. |
| // Prefix indicates this name will be used as part of generation, in which case |
| // trailing dashes are allowed. |
| var ValidateServiceAccountName = NameIsDNSSubdomain |
| |
| // maskTrailingDash replaces the final character of a string with a subdomain safe |
| // value if is a dash. |
| func maskTrailingDash(name string) string { |
| if strings.HasSuffix(name, "-") { |
| return name[:len(name)-2] + "a" |
| } |
| return name |
| } |
| |
| // Validates that given value is not negative. |
| func ValidateNonnegativeField(value int64, fldPath *field.Path) field.ErrorList { |
| allErrs := field.ErrorList{} |
| if value < 0 { |
| allErrs = append(allErrs, field.Invalid(fldPath, value, IsNegativeErrorMsg)) |
| } |
| return allErrs |
| } |