build source
This commit is contained in:
commit
ee1fec43ed
4171 changed files with 1351288 additions and 0 deletions
62
vendor/k8s.io/apimachinery/pkg/api/validate/content/decimal_int.go
generated
vendored
Normal file
62
vendor/k8s.io/apimachinery/pkg/api/validate/content/decimal_int.go
generated
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
Copyright 2025 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 content
|
||||
|
||||
const decimalIntegerErrMsg string = "must be a valid decimal integer in canonical form"
|
||||
|
||||
// IsDecimalInteger validates that a string represents a decimal integer in strict canonical form.
|
||||
// This means the string must be formatted exactly as a human would naturally write an integer,
|
||||
// without any programming language conventions like leading zeros, plus signs, or alternate bases.
|
||||
//
|
||||
// valid values:"0" or Non-zero integers (i.e., "123", "-456") where the first digit is 1-9,
|
||||
// followed by any digits 0-9.
|
||||
//
|
||||
// This validator is stricter than strconv.ParseInt, which accepts leading zeros values (i.e, "0700")
|
||||
// and interprets them as decimal 700, potentially causing confusion with octal notation.
|
||||
func IsDecimalInteger(value string) []string {
|
||||
n := len(value)
|
||||
if n == 0 {
|
||||
return []string{EmptyError()}
|
||||
}
|
||||
|
||||
i := 0
|
||||
if value[0] == '-' {
|
||||
if n == 1 {
|
||||
return []string{decimalIntegerErrMsg}
|
||||
}
|
||||
i = 1
|
||||
}
|
||||
|
||||
if value[i] == '0' {
|
||||
if n == 1 && i == 0 {
|
||||
return nil
|
||||
}
|
||||
return []string{decimalIntegerErrMsg}
|
||||
}
|
||||
|
||||
if value[i] < '1' || value[i] > '9' {
|
||||
return []string{decimalIntegerErrMsg}
|
||||
}
|
||||
|
||||
for i++; i < n; i++ {
|
||||
if value[i] < '0' || value[i] > '9' {
|
||||
return []string{decimalIntegerErrMsg}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
101
vendor/k8s.io/apimachinery/pkg/api/validate/content/dns.go
generated
vendored
Normal file
101
vendor/k8s.io/apimachinery/pkg/api/validate/content/dns.go
generated
vendored
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
Copyright 2025 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 content
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
)
|
||||
|
||||
const dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
|
||||
|
||||
const dns1123LabelErrMsg string = "a lowercase RFC 1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character"
|
||||
|
||||
// DNS1123LabelMaxLength is a label's max length in DNS (RFC 1123)
|
||||
const DNS1123LabelMaxLength int = 63
|
||||
|
||||
var dns1123LabelRegexp = regexp.MustCompile("^" + dns1123LabelFmt + "$")
|
||||
|
||||
// IsDNS1123Label tests for a string that conforms to the definition of a label in
|
||||
// DNS (RFC 1123).
|
||||
func IsDNS1123Label(value string) []string {
|
||||
var errs []string
|
||||
if len(value) > DNS1123LabelMaxLength {
|
||||
errs = append(errs, MaxLenError(DNS1123LabelMaxLength))
|
||||
}
|
||||
if !dns1123LabelRegexp.MatchString(value) {
|
||||
if dns1123SubdomainRegexp.MatchString(value) {
|
||||
// It was a valid subdomain and not a valid label. Since we
|
||||
// already checked length, it must be dots.
|
||||
errs = append(errs, "must not contain dots")
|
||||
} else {
|
||||
errs = append(errs, RegexError(dns1123LabelErrMsg, dns1123LabelFmt, "my-name", "123-abc"))
|
||||
}
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
const dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*"
|
||||
const dns1123SubdomainFmtCaseless string = "(?i)" + dns1123SubdomainFmt
|
||||
const dns1123SubdomainErrorMsg string = "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character"
|
||||
const dns1123SubdomainCaselessErrorMsg string = "an RFC 1123 subdomain must consist of alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character"
|
||||
|
||||
// DNS1123SubdomainMaxLength is a subdomain's max length in DNS (RFC 1123)
|
||||
const DNS1123SubdomainMaxLength int = 253
|
||||
|
||||
var dns1123SubdomainRegexp = regexp.MustCompile("^" + dns1123SubdomainFmt + "$")
|
||||
var dns1123SubdomainCaselessRegexp = regexp.MustCompile("^" + dns1123SubdomainFmtCaseless + "$")
|
||||
|
||||
// IsDNS1123Subdomain tests for a string that conforms to the definition of a
|
||||
// subdomain in DNS (RFC 1123) lowercase.
|
||||
func IsDNS1123Subdomain(value string) []string {
|
||||
return isDNS1123Subdomain(value, false)
|
||||
}
|
||||
|
||||
// IsDNS1123SubdomainCaseless tests for a string that conforms to the definition of a
|
||||
// subdomain in DNS (RFC 1123).
|
||||
//
|
||||
// Deprecated: API validation should never be caseless. Caseless validation is a vector
|
||||
// for bugs and failed uniqueness assumptions. For example, names like "foo.com" and
|
||||
// "FOO.COM" are both accepted as valid, but they are typically not treated as equal by
|
||||
// consumers (e.g. CSI and DRA driver names). This fails the "least surprise" principle and
|
||||
// can cause inconsistent behaviors.
|
||||
//
|
||||
// Note: This allows uppercase names but is not caseless — uppercase and lowercase are
|
||||
// treated as different values. Use IsDNS1123Subdomain for strict, lowercase validation
|
||||
// instead.
|
||||
func IsDNS1123SubdomainCaseless(value string) []string {
|
||||
return isDNS1123Subdomain(value, true)
|
||||
}
|
||||
|
||||
func isDNS1123Subdomain(value string, caseless bool) []string {
|
||||
var errs []string
|
||||
if len(value) > DNS1123SubdomainMaxLength {
|
||||
errs = append(errs, MaxLenError(DNS1123SubdomainMaxLength))
|
||||
}
|
||||
errorMsg := dns1123SubdomainErrorMsg
|
||||
example := "example.com"
|
||||
regexp := dns1123SubdomainRegexp
|
||||
if caseless {
|
||||
errorMsg = dns1123SubdomainCaselessErrorMsg
|
||||
example = "Example.com"
|
||||
regexp = dns1123SubdomainCaselessRegexp
|
||||
}
|
||||
if !regexp.MatchString(value) {
|
||||
errs = append(errs, RegexError(errorMsg, dns1123SubdomainFmt, example))
|
||||
}
|
||||
return errs
|
||||
}
|
||||
66
vendor/k8s.io/apimachinery/pkg/api/validate/content/errors.go
generated
vendored
Normal file
66
vendor/k8s.io/apimachinery/pkg/api/validate/content/errors.go
generated
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
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 content
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/validate/constraints"
|
||||
)
|
||||
|
||||
// MinError returns a string explanation of a "must be greater than or equal"
|
||||
// validation failure.
|
||||
func MinError[T constraints.Integer](min T) string {
|
||||
return fmt.Sprintf("must be greater than or equal to %d", min)
|
||||
}
|
||||
|
||||
// MaxLenError returns a string explanation of a "string too long" validation
|
||||
// failure.
|
||||
func MaxLenError(length int) string {
|
||||
return fmt.Sprintf("must be no more than %d bytes", length)
|
||||
}
|
||||
|
||||
// EmptyError returns a string explanation of an "empty string" validation.
|
||||
func EmptyError() string {
|
||||
return "must be non-empty"
|
||||
}
|
||||
|
||||
// RegexError returns a string explanation of a regex validation failure.
|
||||
func RegexError(msg string, re string, examples ...string) string {
|
||||
if len(examples) == 0 {
|
||||
return msg + " (regex used for validation is '" + re + "')"
|
||||
}
|
||||
msg += " (e.g. "
|
||||
for i := range examples {
|
||||
if i > 0 {
|
||||
msg += " or "
|
||||
}
|
||||
msg += "'" + examples[i] + "', "
|
||||
}
|
||||
msg += "regex used for validation is '" + re + "')"
|
||||
return msg
|
||||
}
|
||||
|
||||
// NEQError returns a string explanation of a "must not be equal to" validation failure.
|
||||
func NEQError[T any](disallowed T) string {
|
||||
format := "%v"
|
||||
if reflect.ValueOf(disallowed).Kind() == reflect.String {
|
||||
format = "%q"
|
||||
}
|
||||
return fmt.Sprintf("must not be equal to "+format, disallowed)
|
||||
}
|
||||
35
vendor/k8s.io/apimachinery/pkg/api/validate/content/identifier.go
generated
vendored
Normal file
35
vendor/k8s.io/apimachinery/pkg/api/validate/content/identifier.go
generated
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
Copyright 2025 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 content
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
)
|
||||
|
||||
const cIdentifierFmt string = "[A-Za-z_][A-Za-z0-9_]*"
|
||||
const identifierErrMsg string = "a valid C identifier must start with alphabetic character or '_', followed by a string of alphanumeric characters or '_'"
|
||||
|
||||
var cIdentifierRegexp = regexp.MustCompile("^" + cIdentifierFmt + "$")
|
||||
|
||||
// IsCIdentifier tests for a string that conforms the definition of an identifier
|
||||
// in C. This checks the format, but not the length.
|
||||
func IsCIdentifier(value string) []string {
|
||||
if !cIdentifierRegexp.MatchString(value) {
|
||||
return []string{RegexError(identifierErrMsg, cIdentifierFmt, "my_name", "MY_NAME", "MyName")}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
101
vendor/k8s.io/apimachinery/pkg/api/validate/content/kube.go
generated
vendored
Normal file
101
vendor/k8s.io/apimachinery/pkg/api/validate/content/kube.go
generated
vendored
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
Copyright 2025 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 content
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const labelKeyCharFmt string = "[A-Za-z0-9]"
|
||||
const labelKeyExtCharFmt string = "[-A-Za-z0-9_.]"
|
||||
const labelKeyFmt string = "(" + labelKeyCharFmt + labelKeyExtCharFmt + "*)?" + labelKeyCharFmt
|
||||
const labelKeyErrMsg string = "must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character"
|
||||
const labelKeyMaxLength int = 63
|
||||
|
||||
var labelKeyRegexp = regexp.MustCompile("^" + labelKeyFmt + "$")
|
||||
|
||||
// IsQualifiedName tests whether the value passed is what Kubernetes calls a
|
||||
// "qualified name", which is the same as a label key.
|
||||
//
|
||||
// Deprecated: use IsLabelKey instead.
|
||||
var IsQualifiedName = IsLabelKey
|
||||
|
||||
// IsLabelKey tests whether the value passed is a valid label key. This format
|
||||
// is used to validate many fields in the Kubernetes API.
|
||||
// Label keys consist of an optional prefix and a name, separated by a '/'.
|
||||
// If the value is not valid, a list of error strings is returned. Otherwise, an
|
||||
// empty list (or nil) is returned.
|
||||
func IsLabelKey(value string) []string {
|
||||
var errs []string
|
||||
parts := strings.Split(value, "/")
|
||||
var name string
|
||||
switch len(parts) {
|
||||
case 1:
|
||||
name = parts[0]
|
||||
case 2:
|
||||
var prefix string
|
||||
prefix, name = parts[0], parts[1]
|
||||
if len(prefix) == 0 {
|
||||
errs = append(errs, "prefix part "+EmptyError())
|
||||
} else if msgs := IsDNS1123Subdomain(prefix); len(msgs) != 0 {
|
||||
errs = append(errs, prefixEach(msgs, "prefix part ")...)
|
||||
}
|
||||
default:
|
||||
return append(errs, "a valid label key "+RegexError(labelKeyErrMsg, labelKeyFmt, "MyName", "my.name", "123-abc")+
|
||||
" with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')")
|
||||
}
|
||||
|
||||
if len(name) == 0 {
|
||||
errs = append(errs, "name part "+EmptyError())
|
||||
} else if len(name) > labelKeyMaxLength {
|
||||
errs = append(errs, "name part "+MaxLenError(labelKeyMaxLength))
|
||||
}
|
||||
if !labelKeyRegexp.MatchString(name) {
|
||||
errs = append(errs, "name part "+RegexError(labelKeyErrMsg, labelKeyFmt, "MyName", "my.name", "123-abc"))
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
const labelValueFmt string = "(" + labelKeyFmt + ")?"
|
||||
const labelValueErrMsg string = "a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character"
|
||||
|
||||
// LabelValueMaxLength is a label's max length
|
||||
const LabelValueMaxLength int = 63
|
||||
|
||||
var labelValueRegexp = regexp.MustCompile("^" + labelValueFmt + "$")
|
||||
|
||||
// IsLabelValue tests whether the value passed is a valid label value. If
|
||||
// the value is not valid, a list of error strings is returned. Otherwise an
|
||||
// empty list (or nil) is returned.
|
||||
func IsLabelValue(value string) []string {
|
||||
var errs []string
|
||||
if len(value) > LabelValueMaxLength {
|
||||
errs = append(errs, MaxLenError(LabelValueMaxLength))
|
||||
}
|
||||
if !labelValueRegexp.MatchString(value) {
|
||||
errs = append(errs, RegexError(labelValueErrMsg, labelValueFmt, "MyValue", "my_value", "12345"))
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
func prefixEach(msgs []string, prefix string) []string {
|
||||
for i := range msgs {
|
||||
msgs[i] = prefix + msgs[i]
|
||||
}
|
||||
return msgs
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue