mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
apiextensions: factor out predicate iterator in validation
This commit is contained in:
parent
e4e1c2cd80
commit
9be78b2b06
@ -1067,81 +1067,91 @@ func allowDefaults(requestGV schema.GroupVersion, oldCRDSpec *apiextensions.Cust
|
|||||||
}
|
}
|
||||||
|
|
||||||
func specHasDefaults(spec *apiextensions.CustomResourceDefinitionSpec) bool {
|
func specHasDefaults(spec *apiextensions.CustomResourceDefinitionSpec) bool {
|
||||||
if spec.Validation != nil && schemaHasDefaults(spec.Validation.OpenAPIV3Schema) {
|
return hasSchemaWith(spec, schemaHasDefaults)
|
||||||
|
}
|
||||||
|
|
||||||
|
func schemaHasDefaults(s *apiextensions.JSONSchemaProps) bool {
|
||||||
|
return schemaHas(s, func(s *apiextensions.JSONSchemaProps) bool {
|
||||||
|
return s.Default != nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasSchemaWith(spec *apiextensions.CustomResourceDefinitionSpec, pred func(s *apiextensions.JSONSchemaProps) bool) bool {
|
||||||
|
if spec.Validation != nil && spec.Validation.OpenAPIV3Schema != nil && pred(spec.Validation.OpenAPIV3Schema) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for _, v := range spec.Versions {
|
for _, v := range spec.Versions {
|
||||||
if v.Schema != nil && schemaHasDefaults(v.Schema.OpenAPIV3Schema) {
|
if v.Schema != nil && v.Schema.OpenAPIV3Schema != nil && pred(v.Schema.OpenAPIV3Schema) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func schemaHasDefaults(s *apiextensions.JSONSchemaProps) bool {
|
func schemaHas(s *apiextensions.JSONSchemaProps, pred func(s *apiextensions.JSONSchemaProps) bool) bool {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Default != nil {
|
if pred(s) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.Items != nil {
|
if s.Items != nil {
|
||||||
if s.Items != nil && schemaHasDefaults(s.Items.Schema) {
|
if s.Items != nil && schemaHas(s.Items.Schema, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for _, s := range s.Items.JSONSchemas {
|
for _, s := range s.Items.JSONSchemas {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, s := range s.AllOf {
|
for _, s := range s.AllOf {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, s := range s.AnyOf {
|
for _, s := range s.AnyOf {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, s := range s.OneOf {
|
for _, s := range s.OneOf {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if schemaHasDefaults(s.Not) {
|
if schemaHas(s.Not, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for _, s := range s.Properties {
|
for _, s := range s.Properties {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.AdditionalProperties != nil {
|
if s.AdditionalProperties != nil {
|
||||||
if schemaHasDefaults(s.AdditionalProperties.Schema) {
|
if schemaHas(s.AdditionalProperties.Schema, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, s := range s.PatternProperties {
|
for _, s := range s.PatternProperties {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.AdditionalItems != nil {
|
if s.AdditionalItems != nil {
|
||||||
if schemaHasDefaults(s.AdditionalItems.Schema) {
|
if schemaHas(s.AdditionalItems.Schema, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, s := range s.Definitions {
|
for _, s := range s.Definitions {
|
||||||
if schemaHasDefaults(&s) {
|
if schemaHas(&s, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, d := range s.Dependencies {
|
for _, d := range s.Dependencies {
|
||||||
if schemaHasDefaults(d.Schema) {
|
if schemaHas(d.Schema, pred) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1162,74 +1172,9 @@ func specHasKubernetesExtensions(spec *apiextensions.CustomResourceDefinitionSpe
|
|||||||
}
|
}
|
||||||
|
|
||||||
func schemaHasKubernetesExtensions(s *apiextensions.JSONSchemaProps) bool {
|
func schemaHasKubernetesExtensions(s *apiextensions.JSONSchemaProps) bool {
|
||||||
if s == nil {
|
return schemaHas(s, func(s *apiextensions.JSONSchemaProps) bool {
|
||||||
return false
|
return s.XEmbeddedResource || s.XPreserveUnknownFields != nil || s.XIntOrString || len(s.XListMapKeys) > 0 || s.XListType != nil
|
||||||
}
|
})
|
||||||
|
|
||||||
if s.XEmbeddedResource || s.XPreserveUnknownFields != nil || s.XIntOrString || len(s.XListMapKeys) > 0 || s.XListType != nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.Items != nil {
|
|
||||||
if s.Items != nil && schemaHasKubernetesExtensions(s.Items.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, s := range s.Items.JSONSchemas {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.AllOf {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.AnyOf {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.OneOf {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if schemaHasKubernetesExtensions(s.Not) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, s := range s.Properties {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if s.AdditionalProperties != nil {
|
|
||||||
if schemaHasKubernetesExtensions(s.AdditionalProperties.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.PatternProperties {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if s.AdditionalItems != nil {
|
|
||||||
if schemaHasKubernetesExtensions(s.AdditionalItems.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.Definitions {
|
|
||||||
if schemaHasKubernetesExtensions(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, d := range s.Dependencies {
|
|
||||||
if schemaHasKubernetesExtensions(d.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// requireStructuralSchema returns true if schemas specified must be structural
|
// requireStructuralSchema returns true if schemas specified must be structural
|
||||||
@ -1389,72 +1334,7 @@ func specHasInvalidTypes(spec *apiextensions.CustomResourceDefinitionSpec) bool
|
|||||||
|
|
||||||
// SchemaHasInvalidTypes returns true if it contains invalid offending openapi-v3 specification.
|
// SchemaHasInvalidTypes returns true if it contains invalid offending openapi-v3 specification.
|
||||||
func SchemaHasInvalidTypes(s *apiextensions.JSONSchemaProps) bool {
|
func SchemaHasInvalidTypes(s *apiextensions.JSONSchemaProps) bool {
|
||||||
if s == nil {
|
return schemaHas(s, func(s *apiextensions.JSONSchemaProps) bool {
|
||||||
return false
|
return len(s.Type) > 0 && !openapiV3Types.Has(s.Type)
|
||||||
}
|
})
|
||||||
|
|
||||||
if len(s.Type) > 0 && !openapiV3Types.Has(s.Type) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.Items != nil {
|
|
||||||
if s.Items != nil && SchemaHasInvalidTypes(s.Items.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, s := range s.Items.JSONSchemas {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.AllOf {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.AnyOf {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.OneOf {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if SchemaHasInvalidTypes(s.Not) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, s := range s.Properties {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if s.AdditionalProperties != nil {
|
|
||||||
if SchemaHasInvalidTypes(s.AdditionalProperties.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.PatternProperties {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if s.AdditionalItems != nil {
|
|
||||||
if SchemaHasInvalidTypes(s.AdditionalItems.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, s := range s.Definitions {
|
|
||||||
if SchemaHasInvalidTypes(&s) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, d := range s.Dependencies {
|
|
||||||
if SchemaHasInvalidTypes(d.Schema) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user