Skip to content

Commit c684de5

Browse files
authored
Merge pull request kubernetes#118990 from alexzielenski/apiserver/apiextensions/crd-validation-ratcheting
CRD Validation Ratcheting alpha implementation
2 parents 31d662e + bfb2c6a commit c684de5

File tree

13 files changed

+2245
-33
lines changed

13 files changed

+2245
-33
lines changed

pkg/features/kube_features.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package features
1818

1919
import (
20+
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
2021
"k8s.io/apimachinery/pkg/util/runtime"
2122
genericfeatures "k8s.io/apiserver/pkg/features"
2223
utilfeature "k8s.io/apiserver/pkg/util/feature"
@@ -1191,6 +1192,11 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
11911192

11921193
genericfeatures.ServerSideFieldValidation: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.29
11931194

1195+
// inherited features from apiextensions-apiserver, relisted here to get a conflict if it is changed
1196+
// unintentionally on either side:
1197+
1198+
apiextensionsfeatures.CRDValidationRatcheting: {Default: false, PreRelease: featuregate.Alpha},
1199+
11941200
// features that enable backwards compatibility but are scheduled to be removed
11951201
// ...
11961202
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},

staging/src/k8s.io/apiextensions-apiserver/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ go 1.20
66

77
require (
88
github.com/emicklei/go-restful/v3 v3.9.0
9+
github.com/evanphx/json-patch v5.6.0+incompatible
910
github.com/gogo/protobuf v1.3.2
1011
github.com/google/cel-go v0.16.0
1112
github.com/google/gnostic-models v0.6.8
@@ -49,7 +50,6 @@ require (
4950
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
5051
github.com/davecgh/go-spew v1.1.1 // indirect
5152
github.com/dustin/go-humanize v1.0.1 // indirect
52-
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
5353
github.com/felixge/httpsnoop v1.0.3 // indirect
5454
github.com/fsnotify/fsnotify v1.6.0 // indirect
5555
github.com/go-logr/logr v1.2.4 // indirect

staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ func validateCustomResourceDefinitionValidation(ctx context.Context, customResou
825825

826826
// if validation passed otherwise, make sure we can actually construct a schema validator from this custom resource validation.
827827
if len(allErrs) == 0 {
828-
if _, _, err := apiservervalidation.NewSchemaValidator(customResourceValidation); err != nil {
828+
if _, _, err := apiservervalidation.NewSchemaValidator(customResourceValidation.OpenAPIV3Schema); err != nil {
829829
allErrs = append(allErrs, field.Invalid(fldPath, "", fmt.Sprintf("error building validator: %v", err)))
830830
}
831831
}

staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ import (
7979
"k8s.io/klog/v2"
8080
"k8s.io/kube-openapi/pkg/spec3"
8181
"k8s.io/kube-openapi/pkg/validation/spec"
82-
"k8s.io/kube-openapi/pkg/validation/strfmt"
83-
"k8s.io/kube-openapi/pkg/validation/validate"
8482
)
8583

8684
// crdHandler serves the `/apis` endpoint.
@@ -739,20 +737,22 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
739737
utilruntime.HandleError(err)
740738
return nil, fmt.Errorf("the server could not properly serve the CR schema")
741739
}
740+
var internalSchemaProps *apiextensionsinternal.JSONSchemaProps
742741
var internalValidationSchema *apiextensionsinternal.CustomResourceValidation
743742
if validationSchema != nil {
744743
internalValidationSchema = &apiextensionsinternal.CustomResourceValidation{}
745744
if err := apiextensionsv1.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(validationSchema, internalValidationSchema, nil); err != nil {
746745
return nil, fmt.Errorf("failed to convert CRD validation to internal version: %v", err)
747746
}
747+
internalSchemaProps = internalValidationSchema.OpenAPIV3Schema
748748
}
749-
validator, _, err := apiservervalidation.NewSchemaValidator(internalValidationSchema)
749+
validator, _, err := apiservervalidation.NewSchemaValidator(internalSchemaProps)
750750
if err != nil {
751751
return nil, err
752752
}
753753

754754
var statusSpec *apiextensionsinternal.CustomResourceSubresourceStatus
755-
var statusValidator *validate.SchemaValidator
755+
var statusValidator apiservervalidation.SchemaValidator
756756
subresources, err := apiextensionshelpers.GetSubresourcesForVersion(crd, v.Name)
757757
if err != nil {
758758
utilruntime.HandleError(err)
@@ -767,11 +767,10 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
767767
// for the status subresource, validate only against the status schema
768768
if internalValidationSchema != nil && internalValidationSchema.OpenAPIV3Schema != nil && internalValidationSchema.OpenAPIV3Schema.Properties != nil {
769769
if statusSchema, ok := internalValidationSchema.OpenAPIV3Schema.Properties["status"]; ok {
770-
openapiSchema := &spec.Schema{}
771-
if err := apiservervalidation.ConvertJSONSchemaPropsWithPostProcess(&statusSchema, openapiSchema, apiservervalidation.StripUnsupportedFormatsPostProcess); err != nil {
770+
statusValidator, _, err = apiservervalidation.NewSchemaValidator(&statusSchema)
771+
if err != nil {
772772
return nil, err
773773
}
774-
statusValidator = validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default)
775774
}
776775
}
777776
}

0 commit comments

Comments
 (0)