Skip to content

Commit

Permalink
Add feature gate for FieldValidation
Browse files Browse the repository at this point in the history
  • Loading branch information
kevindelgado committed Oct 20, 2021
1 parent d57bcc9 commit fb910cd
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 2 deletions.
1 change: 1 addition & 0 deletions pkg/features/kube_features.go
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
genericfeatures.WarningHeaders: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.24
genericfeatures.OpenAPIEnums: {Default: false, PreRelease: featuregate.Alpha},
genericfeatures.CustomResourceValidationExpressions: {Default: false, PreRelease: featuregate.Alpha},
genericfeatures.FieldValidation: {Default: false, PreRelease: featuregate.Alpha},
// features that enable backwards compatibility but are scheduled to be removed
// ...
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
Expand Down
4 changes: 4 additions & 0 deletions staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,10 @@ func isDryRun(url *url.URL) bool {
// media type, because the list of media types that support field validation are a subset of
// all supported media types (protobuf does not support field validation).
func fieldValidation(req *http.Request) (runtime.FieldValidationDirective, error) {
if !utilfeature.DefaultFeatureGate.Enabled(features.FieldValidation) {
return runtime.IgnoreFieldValidation, nil
}

supportedContentTypes := []string{runtime.ContentTypeJSON, runtime.ContentTypeJSONMergePatch, runtime.ContentTypeJSONStrategicMergePatch, runtime.ContentTypeYAML}
contentType := req.Header.Get("Content-Type")
// TODO: not sure if it is okay to assume empty content type is a valid one
Expand Down
8 changes: 8 additions & 0 deletions staging/src/k8s.io/apiserver/pkg/features/kube_features.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,13 @@ const (
//
// Enables expression validation for Custom Resource
CustomResourceValidationExpressions featuregate.Feature = "CustomResourceValidationExpressions"

// owner: @kevindelgado
// kep: http://kep.k8s.io/2885
// alpha: v1.23
//
// Enables server-side field validation.
FieldValidation featuregate.Feature = "FieldValidation"
)

func init() {
Expand Down Expand Up @@ -215,4 +222,5 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
APIServerTracing: {Default: false, PreRelease: featuregate.Alpha},
OpenAPIEnums: {Default: false, PreRelease: featuregate.Alpha},
CustomResourceValidationExpressions: {Default: false, PreRelease: featuregate.Alpha},
FieldValidation: {Default: false, PreRelease: featuregate.Alpha},
}
12 changes: 10 additions & 2 deletions test/integration/apiserver/field_validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import (
// TestFieldValidationPost tests POST requests containing unknown fields with
// strict and non-strict field validation.
func TestFieldValidationPost(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServerSideApply, true)()
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

_, client, closeFn := setup(t)
defer closeFn()
Expand Down Expand Up @@ -120,7 +120,7 @@ func TestFieldValidationPost(t *testing.T) {
// TestFieldValidationPut tests PUT requests containing unknown fields with
// strict and non-strict field validation.
func TestFieldValidationPut(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServerSideApply, true)()
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

_, client, closeFn := setup(t)
defer closeFn()
Expand Down Expand Up @@ -210,6 +210,8 @@ func TestFieldValidationPut(t *testing.T) {

// Benchmark field validation for strict vs non-strict
func BenchmarkFieldValidationPostPut(b *testing.B) {
defer featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

_, client, closeFn := setup(b)
defer closeFn()

Expand Down Expand Up @@ -384,6 +386,7 @@ type smpTestCase struct {
// but succeeds when fieldValidation is ignored.
func TestFieldValidationSMP(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServerSideApply, true)()
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

_, client, closeFn := setup(t)
defer closeFn()
Expand Down Expand Up @@ -420,6 +423,7 @@ func TestFieldValidationSMP(t *testing.T) {
// Benchmark strategic-merge-patch field validation for strict vs non-strict
func BenchmarkFieldValidationSMP(b *testing.B) {
defer featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.ServerSideApply, true)()
defer featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

_, client, closeFn := setup(b)
defer closeFn()
Expand Down Expand Up @@ -513,6 +517,8 @@ func patchCRDTestSetup(t testing.TB, server kubeapiservertesting.TestServer, nam
// TestFieldValidationPatchCRD tests that server-side schema validation
// works for jsonpatch and mergepatch requests.
func TestFieldValidationPatchCRD(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

var testcases = []struct {
name string
patchType types.PatchType
Expand Down Expand Up @@ -600,6 +606,8 @@ func TestFieldValidationPatchCRD(t *testing.T) {

// Benchmark patch CRD for strict vs non-strict
func BenchmarkFieldValidationPatchCRD(b *testing.B) {
defer featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.FieldValidation, true)()

benchmarks := []struct {
name string
patchType types.PatchType
Expand Down

0 comments on commit fb910cd

Please sign in to comment.