diff --git a/hack/.golint_failures b/hack/.golint_failures index 7ca3f17f9a0..4e67ada4930 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -270,7 +270,6 @@ staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status -staging/src/k8s.io/apiextensions-apiserver/pkg/features staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer diff --git a/pkg/features/BUILD b/pkg/features/BUILD index 37a6372a870..1f1b927d767 100644 --- a/pkg/features/BUILD +++ b/pkg/features/BUILD @@ -10,7 +10,6 @@ go_library( srcs = ["kube_features.go"], importpath = "k8s.io/kubernetes/pkg/features", deps = [ - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 0747234c63a..623c2f39f13 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -17,7 +17,6 @@ limitations under the License. package features import ( - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apimachinery/pkg/util/runtime" genericfeatures "k8s.io/apiserver/pkg/features" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -627,14 +626,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS genericfeatures.ServerSideApply: {Default: true, PreRelease: featuregate.Beta}, genericfeatures.APIPriorityAndFairness: {Default: false, PreRelease: featuregate.Alpha}, - // inherited features from apiextensions-apiserver, relisted here to get a conflict if it is changed - // unintentionally on either side: - apiextensionsfeatures.CustomResourceValidation: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - apiextensionsfeatures.CustomResourceSubresources: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - apiextensionsfeatures.CustomResourceWebhookConversion: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - apiextensionsfeatures.CustomResourcePublishOpenAPI: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - apiextensionsfeatures.CustomResourceDefaulting: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // TODO: remove in 1.18 - // features that enable backwards compatibility but are scheduled to be removed // ... HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha}, diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD index d7768676c53..cef98b9da58 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD @@ -19,14 +19,12 @@ go_library( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", ], ) @@ -40,7 +38,6 @@ go_test( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -48,9 +45,6 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index f570dd82a4b..cf7c9ba1e0a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" utilvalidation "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/webhook" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" @@ -37,7 +36,6 @@ import ( apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" ) var ( @@ -381,11 +379,7 @@ func validateCustomResourceConversion(conversion *apiextensions.CustomResourceCo allErrs = append(allErrs, validateEnumStrings(fldPath.Child("strategy"), string(conversion.Strategy), []string{string(apiextensions.NoneConverter), string(apiextensions.WebhookConverter)}, true)...) if conversion.Strategy == apiextensions.WebhookConverter { if conversion.WebhookClientConfig == nil { - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) { - allErrs = append(allErrs, field.Required(fldPath.Child("webhookClientConfig"), "required when strategy is set to Webhook")) - } else { - allErrs = append(allErrs, field.Required(fldPath.Child("webhookClientConfig"), "required when strategy is set to Webhook, but not allowed because the CustomResourceWebhookConversion feature is disabled")) - } + allErrs = append(allErrs, field.Required(fldPath.Child("webhookClientConfig"), "required when strategy is set to Webhook")) } else { cc := conversion.WebhookClientConfig switch { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go index 9186e0b8378..0a6dee6c7ca 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go @@ -25,7 +25,6 @@ import ( apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -33,9 +32,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/validation/field" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/component-base/featuregate" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/utils/pointer" ) @@ -78,12 +74,10 @@ func TestValidateCustomResourceDefinition(t *testing.T) { }, } tests := []struct { - name string - resource *apiextensions.CustomResourceDefinition - requestGV schema.GroupVersion - errors []validationMatch - enabledFeatures []featuregate.Feature - disabledFeatures []featuregate.Feature + name string + resource *apiextensions.CustomResourceDefinition + requestGV schema.GroupVersion + errors []validationMatch }{ { name: "invalid types allowed via v1beta1", @@ -1645,8 +1639,7 @@ func TestValidateCustomResourceDefinition(t *testing.T) { StoredVersions: []string{"version"}, }, }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, - requestGV: apiextensionsv1beta1.SchemeGroupVersion, + requestGV: apiextensionsv1beta1.SchemeGroupVersion, errors: []validationMatch{ forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "default"), // disallowed via v1beta1 }, @@ -1683,8 +1676,7 @@ func TestValidateCustomResourceDefinition(t *testing.T) { StoredVersions: []string{"version"}, }, }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, - requestGV: apiextensionsv1.SchemeGroupVersion, + requestGV: apiextensionsv1.SchemeGroupVersion, }, { name: "x-kubernetes-int-or-string without structural", @@ -1937,7 +1929,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { required("spec", "validation", "openAPIV3Schema", "properties[a]", "type"), required("spec", "validation", "openAPIV3Schema", "type"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "defaults with enabled feature gate, structural schema", @@ -1971,8 +1962,7 @@ func TestValidateCustomResourceDefinition(t *testing.T) { StoredVersions: []string{"version"}, }, }, - errors: []validationMatch{}, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, + errors: []validationMatch{}, }, { name: "defaults in value validation with enabled feature gate, structural schema", @@ -2029,7 +2019,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "anyOf[0]", "default"), forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "oneOf[0]", "default"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "invalid defaults with enabled feature gate, structural schema", @@ -2203,8 +2192,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { invalid("spec", "validation", "openAPIV3Schema", "properties[e]", "properties[preserveUnknownFields]", "default"), invalid("spec", "validation", "openAPIV3Schema", "properties[e]", "properties[nestedProperties]", "default"), }, - - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "additionalProperties at resource root", @@ -2254,7 +2241,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { required("spec", "validation", "openAPIV3Schema", "properties[embedded1]", "properties"), forbidden("spec", "validation", "openAPIV3Schema", "properties[embedded2]", "additionalProperties"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { // TODO: remove in a follow-up. This blocks is here for easy review. @@ -2448,7 +2434,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { // Invalid value: wrongly typed invalid("spec", "versions[3]", "schema", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[name]", "default"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "default inside additionalSchema", @@ -2509,7 +2494,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { // Forbidden: must not be set inside additionalProperties applying to object metadata forbidden("spec", "validation", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[annotations]", "additionalProperties", "default"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "top-level metadata default", @@ -2555,7 +2539,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { errors: []validationMatch{ forbidden("spec", "validation", "openAPIV3Schema", "properties[metadata]", "default"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "embedded metadata defaults", @@ -3937,7 +3920,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) { required("spec", "validation", "openAPIV3Schema", "properties[spanning-defaults-with-missing-typemeta]", "default", "embedded", "apiVersion"), required("spec", "validation", "openAPIV3Schema", "properties[spanning-defaults-with-missing-typemeta]", "default", "embedded", "kind"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, { name: "contradicting meta field types", @@ -4086,18 +4068,11 @@ func TestValidateCustomResourceDefinition(t *testing.T) { invalid("spec", "validation", "openAPIV3Schema", "properties[nested]", "properties[invalid]", "properties[kind]", "type"), invalid("spec", "validation", "openAPIV3Schema", "properties[nested]", "properties[invalid]", "properties[metadata]", "type"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - for _, gate := range tc.enabledFeatures { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, gate, true)() - } - for _, gate := range tc.disabledFeatures { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, gate, false)() - } // duplicate defaulting behaviour if tc.resource.Spec.Conversion != nil && tc.resource.Spec.Conversion.Strategy == apiextensions.WebhookConverter && len(tc.resource.Spec.Conversion.ConversionReviewVersions) == 0 { @@ -4132,13 +4107,11 @@ func TestValidateCustomResourceDefinition(t *testing.T) { func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { tests := []struct { - name string - old *apiextensions.CustomResourceDefinition - resource *apiextensions.CustomResourceDefinition - requestGV schema.GroupVersion - errors []validationMatch - enabledFeatures []featuregate.Feature - disabledFeatures []featuregate.Feature + name string + old *apiextensions.CustomResourceDefinition + resource *apiextensions.CustomResourceDefinition + requestGV schema.GroupVersion + errors []validationMatch }{ { name: "invalid type updates allowed via v1beta1", @@ -5880,9 +5853,8 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { StoredVersions: []string{"version"}, }, }, - requestGV: apiextensionsv1beta1.SchemeGroupVersion, - errors: []validationMatch{forbidden("spec.validation.openAPIV3Schema.properties[a].default")}, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, + requestGV: apiextensionsv1beta1.SchemeGroupVersion, + errors: []validationMatch{forbidden("spec.validation.openAPIV3Schema.properties[a].default")}, }, { name: "setting defaults with enabled feature gate via v1", @@ -5963,9 +5935,8 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { StoredVersions: []string{"version"}, }, }, - requestGV: apiextensionsv1.SchemeGroupVersion, - errors: []validationMatch{}, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, + requestGV: apiextensionsv1.SchemeGroupVersion, + errors: []validationMatch{}, }, { name: "add default with enabled feature gate, structural schema, without pruning", @@ -6032,19 +6003,11 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { errors: []validationMatch{ invalid("spec", "preserveUnknownFields"), }, - enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting}, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - for _, gate := range tc.enabledFeatures { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, gate, true)() - } - for _, gate := range tc.disabledFeatures { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, gate, false)() - } - errs := ValidateCustomResourceDefinitionUpdate(tc.resource, tc.old, tc.requestGV) seenErrs := make([]bool, len(errs)) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD index d53c1c5942e..2bb62a08081 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD @@ -43,7 +43,6 @@ go_library( "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/crdserverscheme:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go index 84066786776..390b5a4471b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -23,7 +23,7 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" _ "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" @@ -35,7 +35,6 @@ import ( "k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema" openapicontroller "k8s.io/apiextensions-apiserver/pkg/controller/openapi" "k8s.io/apiextensions-apiserver/pkg/controller/status" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -48,7 +47,6 @@ import ( "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" serverstorage "k8s.io/apiserver/pkg/server/storage" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/webhook" ) @@ -218,10 +216,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) crdClient.ApiextensionsV1(), crdHandler, ) - var openapiController *openapicontroller.Controller - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourcePublishOpenAPI) { - openapiController = openapicontroller.NewController(s.Informers.Apiextensions().V1().CustomResourceDefinitions()) - } + openapiController := openapicontroller.NewController(s.Informers.Apiextensions().V1().CustomResourceDefinitions()) s.GenericAPIServer.AddPostStartHookOrDie("start-apiextensions-informers", func(context genericapiserver.PostStartHookContext) error { s.Informers.Start(context.StopCh) @@ -232,7 +227,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) // Together they serve the /openapi/v2 endpoint on a generic apiserver. A generic apiserver may // choose to not enable OpenAPI by having null openAPIConfig, and thus OpenAPIVersionedService // and StaticOpenAPISpec are both null. In that case we don't run the CRD OpenAPI controller. - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourcePublishOpenAPI) && s.GenericAPIServer.OpenAPIVersionedService != nil && s.GenericAPIServer.StaticOpenAPISpec != nil { + if s.GenericAPIServer.OpenAPIVersionedService != nil && s.GenericAPIServer.StaticOpenAPISpec != nil { go openapiController.Run(s.GenericAPIServer.StaticOpenAPISpec, s.GenericAPIServer.OpenAPIVersionedService, context.StopCh) } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD index 8150ce2791f..f1a6b656c0e 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD @@ -15,7 +15,6 @@ go_library( "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", @@ -25,7 +24,6 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go index dcd5443c659..23564762c75 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go @@ -21,11 +21,9 @@ import ( autoscalingv1 "k8s.io/api/autoscaling/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/webhook" typedscheme "k8s.io/client-go/kubernetes/scheme" ) @@ -44,13 +42,11 @@ var converterMetricFactorySingleton = newConverterMertricFactory() // NewCRConverterFactory creates a new CRConverterFactory func NewCRConverterFactory(serviceResolver webhook.ServiceResolver, authResolverWrapper webhook.AuthenticationInfoResolverWrapper) (*CRConverterFactory, error) { converterFactory := &CRConverterFactory{} - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) { - webhookConverterFactory, err := newWebhookConverterFactory(serviceResolver, authResolverWrapper) - if err != nil { - return nil, err - } - converterFactory.webhookConverterFactory = webhookConverterFactory + webhookConverterFactory, err := newWebhookConverterFactory(serviceResolver, authResolverWrapper) + if err != nil { + return nil, err } + converterFactory.webhookConverterFactory = webhookConverterFactory return converterFactory, nil } @@ -66,9 +62,6 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensionsv1.CustomResourceDef case apiextensionsv1.NoneConverter: converter = &nopConverter{} case apiextensionsv1.WebhookConverter: - if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) { - return nil, nil, fmt.Errorf("webhook conversion is disabled on this cluster") - } converter, err = m.webhookConverterFactory.NewWebhookConverter(crd) if err != nil { return nil, nil, err @@ -83,11 +76,9 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensionsv1.CustomResourceDef // Determine whether we should expect to be asked to "convert" autoscaling/v1 Scale types convertScale := false - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) { - for _, version := range crd.Spec.Versions { - if version.Subresources != nil && version.Subresources.Scale != nil { - convertScale = true - } + for _, version := range crd.Spec.Versions { + if version.Subresources != nil && version.Subresources.Scale != nil { + convertScale = true } } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index 3bafc1d0ea1..fcaa954c942 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -44,7 +44,6 @@ import ( "k8s.io/apiextensions-apiserver/pkg/controller/finalizer" "k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder" "k8s.io/apiextensions-apiserver/pkg/crdserverscheme" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/pkg/registry/customresource" "k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor" @@ -701,7 +700,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd utilruntime.HandleError(err) return nil, fmt.Errorf("the server could not properly serve the CR subresources") } - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Status != nil { + if subresources != nil && subresources.Status != nil { equivalentResourceRegistry.RegisterKindFor(resource, "status", kind) statusSpec = &apiextensionsinternal.CustomResourceSubresourceStatus{} if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceStatus_To_apiextensions_CustomResourceSubresourceStatus(subresources.Status, statusSpec, nil); err != nil { @@ -720,7 +719,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd } var scaleSpec *apiextensionsinternal.CustomResourceSubresourceScale - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Scale != nil { + if subresources != nil && subresources.Scale != nil { equivalentResourceRegistry.RegisterKindFor(resource, "scale", autoscalingv1.SchemeGroupVersion.WithKind("Scale")) scaleSpec = &apiextensionsinternal.CustomResourceSubresourceScale{} if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(subresources.Scale, scaleSpec, nil); err != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go index dd5a3a48a03..a5932281367 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go @@ -22,53 +22,11 @@ import ( ) const ( - // Every feature gate should add method here following this template: - // - // // owner: @username - // // alpha: v1.4 - // MyFeature() bool - - // owner: @sttts, @nikhita - // alpha: v1.8 - // beta: v1.9 - // GA: v1.16 - // - // CustomResourceValidation is a list of validation methods for CustomResources - CustomResourceValidation featuregate.Feature = "CustomResourceValidation" - - // owner: @roycaihw, @sttts - // alpha: v1.14 - // beta: v1.15 - // GA: v1.16 - // - // CustomResourcePublishOpenAPI enables publishing of CRD OpenAPI specs. - CustomResourcePublishOpenAPI featuregate.Feature = "CustomResourcePublishOpenAPI" - - // owner: @sttts, @nikhita - // alpha: v1.10 - // beta: v1.11 - // GA: v1.16 - // - // CustomResourceSubresources defines the subresources for CustomResources - CustomResourceSubresources featuregate.Feature = "CustomResourceSubresources" - - // owner: @mbohlool, @roycaihw - // alpha: v1.13 - // beta: v1.15 - // GA: v1.16 - // - // CustomResourceWebhookConversion defines the webhook conversion for Custom Resources. - CustomResourceWebhookConversion featuregate.Feature = "CustomResourceWebhookConversion" - - // owner: @sttts - // alpha: v1.15 - // beta: v1.16 - // GA: v1.17 - // - // CustomResourceDefaulting enables OpenAPI defaulting in CustomResources. - // - // TODO: remove in 1.18 - CustomResourceDefaulting featuregate.Feature = "CustomResourceDefaulting" +// Every feature gate should add method here following this template: +// +// // owner: @username +// // alpha: v1.4 +// MyFeature() bool ) func init() { @@ -78,10 +36,4 @@ func init() { // defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys. // To add a new feature, define a key for it above and add it here. The features will be // available throughout Kubernetes binaries. -var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{ - CustomResourceValidation: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - CustomResourceSubresources: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - CustomResourceWebhookConversion: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - CustomResourcePublishOpenAPI: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - CustomResourceDefaulting: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, -} +var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD index bff3eede773..ca597e1b0fa 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD @@ -22,7 +22,6 @@ go_library( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", @@ -40,7 +39,6 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/go-openapi/validate:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go index 7d40962cdab..886ca393ba6 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go @@ -32,12 +32,10 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" apiserverstorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" schemaobjectmeta "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" ) // customResourceStrategy implements behavior for CustomResources. @@ -75,7 +73,7 @@ func (a customResourceStrategy) NamespaceScoped() bool { // PrepareForCreate clears the status of a CustomResource before creation. func (a customResourceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && a.status != nil { + if a.status != nil { customResourceObject := obj.(*unstructured.Unstructured) customResource := customResourceObject.UnstructuredContent() @@ -98,7 +96,7 @@ func (a customResourceStrategy) PrepareForUpdate(ctx context.Context, obj, old r oldCustomResource := oldCustomResourceObject.UnstructuredContent() // If the /status subresource endpoint is installed, update is not allowed to set status. - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && a.status != nil { + if a.status != nil { _, ok1 := newCustomResource["status"] _, ok2 := oldCustomResource["status"] switch { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD index 46b2ef05c4b..1429d3d384d 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD @@ -13,7 +13,6 @@ go_library( deps = [ "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -30,7 +29,6 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/storage/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/dryrun:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -57,7 +55,6 @@ go_test( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go index 0569f17bedc..6702bcb6e69 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go @@ -22,7 +22,6 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" @@ -33,7 +32,6 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - utilfeature "k8s.io/apiserver/pkg/util/feature" ) // strategy implements behavior for CustomResources. @@ -56,8 +54,6 @@ func (strategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { crd.Status = apiextensions.CustomResourceDefinitionStatus{} crd.Generation = 1 - dropDisabledFields(&crd.Spec, nil) - for _, v := range crd.Spec.Versions { if v.Storage { if !apiextensions.IsStoredVersion(crd, v.Name) { @@ -86,8 +82,6 @@ func (strategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newCRD.Generation = oldCRD.Generation + 1 } - dropDisabledFields(&newCRD.Spec, &oldCRD.Spec) - for _, v := range newCRD.Spec.Versions { if v.Storage { if !apiextensions.IsStoredVersion(newCRD, v.Name) { @@ -198,102 +192,3 @@ func MatchCustomResourceDefinition(label labels.Selector, field fields.Selector) func CustomResourceDefinitionToSelectableFields(obj *apiextensions.CustomResourceDefinition) fields.Set { return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true) } - -func dropDisabledFields(crdSpec, oldCrdSpec *apiextensions.CustomResourceDefinitionSpec) { - // if the feature gate is disabled, drop the feature. - if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceValidation) && - !validationInUse(oldCrdSpec) { - crdSpec.Validation = nil - for i := range crdSpec.Versions { - crdSpec.Versions[i].Schema = nil - } - } - if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && - !subresourceInUse(oldCrdSpec) { - crdSpec.Subresources = nil - for i := range crdSpec.Versions { - crdSpec.Versions[i].Subresources = nil - } - } - - // 1. On CREATE (in which case the old CRD spec is nil), if the CustomResourceWebhookConversion feature gate is off, we auto-clear - // the per-version fields. This is to be consistent with the other built-in types, as the - // apiserver drops unknown fields. - // 2. On UPDATE, if the CustomResourceWebhookConversion feature gate is off, we auto-clear - // the per-version fields if the old CRD doesn't use per-version fields already. - // This is to be consistent with the other built-in types, as the apiserver drops unknown - // fields. If the old CRD already uses per-version fields, the CRD is allowed to continue - // use per-version fields. - if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) && - !hasPerVersionField(oldCrdSpec) { - for i := range crdSpec.Versions { - crdSpec.Versions[i].Schema = nil - crdSpec.Versions[i].Subresources = nil - crdSpec.Versions[i].AdditionalPrinterColumns = nil - } - } - - if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) && - !conversionWebhookInUse(oldCrdSpec) { - if crdSpec.Conversion != nil { - crdSpec.Conversion.WebhookClientConfig = nil - } - } - -} - -func validationInUse(crdSpec *apiextensions.CustomResourceDefinitionSpec) bool { - if crdSpec == nil { - return false - } - if crdSpec.Validation != nil { - return true - } - - for i := range crdSpec.Versions { - if crdSpec.Versions[i].Schema != nil { - return true - } - } - return false -} - -func subresourceInUse(crdSpec *apiextensions.CustomResourceDefinitionSpec) bool { - if crdSpec == nil { - return false - } - if crdSpec.Subresources != nil { - return true - } - - for i := range crdSpec.Versions { - if crdSpec.Versions[i].Subresources != nil { - return true - } - } - return false -} - -// hasPerVersionField returns true if a CRD uses per-version schema/subresources/columns fields. -//func hasPerVersionField(versions []apiextensions.CustomResourceDefinitionVersion) bool { -func hasPerVersionField(crdSpec *apiextensions.CustomResourceDefinitionSpec) bool { - if crdSpec == nil { - return false - } - for _, v := range crdSpec.Versions { - if v.Schema != nil || v.Subresources != nil || len(v.AdditionalPrinterColumns) > 0 { - return true - } - } - return false -} - -func conversionWebhookInUse(crdSpec *apiextensions.CustomResourceDefinitionSpec) bool { - if crdSpec == nil { - return false - } - if crdSpec.Conversion == nil { - return false - } - return crdSpec.Conversion.WebhookClientConfig != nil -} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy_test.go index 868dd45437a..14323d32575 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy_test.go @@ -17,8 +17,6 @@ limitations under the License. package customresourcedefinition import ( - "fmt" - "reflect" "testing" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" @@ -26,333 +24,10 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/utils/pointer" ) -func TestDropDisableFieldsCustomResourceDefinition(t *testing.T) { - t.Log("testing unversioned validation..") - crdWithUnversionedValidation := func() *apiextensions.CustomResourceDefinition { - // crd with non-versioned validation - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Validation: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{}, - }, - }, - } - } - crdWithoutUnversionedValidation := func() *apiextensions.CustomResourceDefinition { - // crd with non-versioned validation - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{}, - } - } - crdInfos := []struct { - name string - crd func() *apiextensions.CustomResourceDefinition - }{ - { - name: "has unversioned validation", - crd: crdWithUnversionedValidation, - }, - { - name: "doesn't have unversioned validation", - crd: crdWithoutUnversionedValidation, - }, - { - name: "nil", - crd: func() *apiextensions.CustomResourceDefinition { return nil }, - }, - } - for _, oldCRDInfo := range crdInfos { - for _, newCRDInfo := range crdInfos { - oldCRD := oldCRDInfo.crd() - newCRD := newCRDInfo.crd() - if newCRD == nil { - continue - } - t.Run(fmt.Sprintf("old CRD %v, new CRD %v", oldCRDInfo.name, newCRDInfo.name), - func(t *testing.T) { - var oldCRDSpec *apiextensions.CustomResourceDefinitionSpec - if oldCRD != nil { - oldCRDSpec = &oldCRD.Spec - } - dropDisabledFields(&newCRD.Spec, oldCRDSpec) - // old CRD should never be changed - if !reflect.DeepEqual(oldCRD, oldCRDInfo.crd()) { - t.Errorf("old crd changed: %v", diff.ObjectReflectDiff(oldCRD, oldCRDInfo.crd())) - } - if !reflect.DeepEqual(newCRD, newCRDInfo.crd()) { - t.Errorf("new crd changed: %v", diff.ObjectReflectDiff(newCRD, newCRDInfo.crd())) - } - }, - ) - } - } - - t.Log("testing unversioned subresources...") - crdWithUnversionedSubresources := func() *apiextensions.CustomResourceDefinition { - // crd with unversioned subresources - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Subresources: &apiextensions.CustomResourceSubresources{}, - }, - } - } - crdWithoutUnversionedSubresources := func() *apiextensions.CustomResourceDefinition { - // crd without unversioned subresources - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{}, - } - } - crdInfos = []struct { - name string - crd func() *apiextensions.CustomResourceDefinition - }{ - { - name: "has unversioned subresources", - crd: crdWithUnversionedSubresources, - }, - { - name: "doesn't have unversioned subresources", - crd: crdWithoutUnversionedSubresources, - }, - { - name: "nil", - crd: func() *apiextensions.CustomResourceDefinition { return nil }, - }, - } - for _, oldCRDInfo := range crdInfos { - for _, newCRDInfo := range crdInfos { - oldCRD := oldCRDInfo.crd() - newCRD := newCRDInfo.crd() - if newCRD == nil { - continue - } - t.Run(fmt.Sprintf("old CRD %v, new CRD %v", oldCRDInfo.name, newCRDInfo.name), - func(t *testing.T) { - var oldCRDSpec *apiextensions.CustomResourceDefinitionSpec - if oldCRD != nil { - oldCRDSpec = &oldCRD.Spec - } - dropDisabledFields(&newCRD.Spec, oldCRDSpec) - // old CRD should never be changed - if !reflect.DeepEqual(oldCRD, oldCRDInfo.crd()) { - t.Errorf("old crd changed: %v", diff.ObjectReflectDiff(oldCRD, oldCRDInfo.crd())) - } - if !reflect.DeepEqual(newCRD, newCRDInfo.crd()) { - t.Errorf("new crd changed: %v", diff.ObjectReflectDiff(newCRD, newCRDInfo.crd())) - } - }, - ) - } - } - - t.Log("testing versioned validation..") - crdWithVersionedValidation := func() *apiextensions.CustomResourceDefinition { - // crd with versioned validation - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1", - Schema: &apiextensions.CustomResourceValidation{ - OpenAPIV3Schema: &apiextensions.JSONSchemaProps{}, - }, - }, - }, - }, - } - } - crdWithoutVersionedValidation := func() *apiextensions.CustomResourceDefinition { - // crd with versioned validation - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1", - }, - }, - }, - } - } - crdInfos = []struct { - name string - crd func() *apiextensions.CustomResourceDefinition - }{ - { - name: "has versioned validation", - crd: crdWithVersionedValidation, - }, - { - name: "doesn't have versioned validation", - crd: crdWithoutVersionedValidation, - }, - { - name: "nil", - crd: func() *apiextensions.CustomResourceDefinition { return nil }, - }, - } - for _, oldCRDInfo := range crdInfos { - for _, newCRDInfo := range crdInfos { - oldCRD := oldCRDInfo.crd() - newCRD := newCRDInfo.crd() - if newCRD == nil { - continue - } - t.Run(fmt.Sprintf("old CRD %v, new CRD %v", oldCRDInfo.name, newCRDInfo.name), - func(t *testing.T) { - var oldCRDSpec *apiextensions.CustomResourceDefinitionSpec - if oldCRD != nil { - oldCRDSpec = &oldCRD.Spec - } - dropDisabledFields(&newCRD.Spec, oldCRDSpec) - // old CRD should never be changed - if !reflect.DeepEqual(oldCRD, oldCRDInfo.crd()) { - t.Errorf("old crd changed: %v", diff.ObjectReflectDiff(oldCRD, oldCRDInfo.crd())) - } - if !reflect.DeepEqual(newCRD, newCRDInfo.crd()) { - t.Errorf("new crd changed: %v", diff.ObjectReflectDiff(newCRD, newCRDInfo.crd())) - } - }, - ) - } - } - - t.Log("testing versioned subresources w/ conversion enabled..") - crdWithVersionedSubresources := func() *apiextensions.CustomResourceDefinition { - // crd with versioned subresources - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1", - Subresources: &apiextensions.CustomResourceSubresources{}, - }, - }, - }, - } - } - crdWithoutVersionedSubresources := func() *apiextensions.CustomResourceDefinition { - // crd without versioned subresources - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Versions: []apiextensions.CustomResourceDefinitionVersion{ - { - Name: "v1", - }, - }, - }, - } - } - crdInfos = []struct { - name string - crd func() *apiextensions.CustomResourceDefinition - }{ - { - name: "has versioned subresources", - crd: crdWithVersionedSubresources, - }, - { - name: "doesn't have versioned subresources", - crd: crdWithoutVersionedSubresources, - }, - { - name: "nil", - crd: func() *apiextensions.CustomResourceDefinition { return nil }, - }, - } - for _, oldCRDInfo := range crdInfos { - for _, newCRDInfo := range crdInfos { - oldCRD := oldCRDInfo.crd() - newCRD := newCRDInfo.crd() - if newCRD == nil { - continue - } - t.Run(fmt.Sprintf("old CRD %v, new CRD %v", oldCRDInfo.name, newCRDInfo.name), - func(t *testing.T) { - var oldCRDSpec *apiextensions.CustomResourceDefinitionSpec - if oldCRD != nil { - oldCRDSpec = &oldCRD.Spec - } - dropDisabledFields(&newCRD.Spec, oldCRDSpec) - // old CRD should never be changed - if !reflect.DeepEqual(oldCRD, oldCRDInfo.crd()) { - t.Errorf("old crd changed: %v", diff.ObjectReflectDiff(oldCRD, oldCRDInfo.crd())) - } - if !reflect.DeepEqual(newCRD, newCRDInfo.crd()) { - t.Errorf("new crd changed: %v", diff.ObjectReflectDiff(newCRD, newCRDInfo.crd())) - } - }, - ) - } - } - - t.Log("testing conversion webhook..") - crdWithUnversionedConversionWebhook := func() *apiextensions.CustomResourceDefinition { - // crd with conversion webhook - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Conversion: &apiextensions.CustomResourceConversion{ - WebhookClientConfig: &apiextensions.WebhookClientConfig{}, - }, - }, - } - } - crdWithoutUnversionedConversionWebhook := func() *apiextensions.CustomResourceDefinition { - // crd with conversion webhook - return &apiextensions.CustomResourceDefinition{ - Spec: apiextensions.CustomResourceDefinitionSpec{ - Conversion: &apiextensions.CustomResourceConversion{}, - }, - } - } - crdInfos = []struct { - name string - crd func() *apiextensions.CustomResourceDefinition - }{ - { - name: "has conversion webhook", - crd: crdWithUnversionedConversionWebhook, - }, - { - name: "doesn't have conversion webhook", - crd: crdWithoutUnversionedConversionWebhook, - }, - { - name: "nil", - crd: func() *apiextensions.CustomResourceDefinition { return nil }, - }, - } - for _, oldCRDInfo := range crdInfos { - for _, newCRDInfo := range crdInfos { - oldCRD := oldCRDInfo.crd() - newCRD := newCRDInfo.crd() - if newCRD == nil { - continue - } - t.Run(fmt.Sprintf("old CRD %v, new CRD %v", oldCRDInfo.name, newCRDInfo.name), - func(t *testing.T) { - var oldCRDSpec *apiextensions.CustomResourceDefinitionSpec - if oldCRD != nil { - oldCRDSpec = &oldCRD.Spec - } - dropDisabledFields(&newCRD.Spec, oldCRDSpec) - // old CRD should never be changed - if !reflect.DeepEqual(oldCRD, oldCRDInfo.crd()) { - t.Errorf("old crd changed: %v", diff.ObjectReflectDiff(oldCRD, oldCRDInfo.crd())) - } - if !reflect.DeepEqual(newCRD, newCRDInfo.crd()) { - t.Errorf("new crd changed: %v", diff.ObjectReflectDiff(newCRD, newCRDInfo.crd())) - } - }, - ) - } - } -} - func strPtr(in string) *string { return &in } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD b/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD index e7e888d7a7f..100480ae76a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/BUILD @@ -35,7 +35,6 @@ go_test( "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/BUILD index 75dd7342153..764ddc6bc01 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/BUILD @@ -12,7 +12,6 @@ go_test( "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -25,9 +24,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/dynamic:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", "//vendor/github.com/google/go-cmp/cmp:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/conversion_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/conversion_test.go index 8955921a5f7..5c18683507b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/conversion_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/conversion/conversion_test.go @@ -38,15 +38,12 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/wait" etcd3watcher "k8s.io/apiserver/pkg/storage/etcd3" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/dynamic" - featuregatetesting "k8s.io/component-base/featuregate/testing" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" - apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/test/integration/fixtures" "k8s.io/apiextensions-apiserver/test/integration/storage" ) @@ -58,17 +55,13 @@ func checks(checkers ...Checker) []Checker { } func TestWebhookConverterWithWatchCache(t *testing.T) { - testWebhookConverter(t, false, true) + testWebhookConverter(t, true) } func TestWebhookConverterWithoutWatchCache(t *testing.T) { - testWebhookConverter(t, false, false) + testWebhookConverter(t, false) } -func TestWebhookConverterWithDefaulting(t *testing.T) { - testWebhookConverter(t, true, true) -} - -func testWebhookConverter(t *testing.T, defaulting, watchCache bool) { +func testWebhookConverter(t *testing.T, watchCache bool) { tests := []struct { group string handler http.Handler @@ -167,11 +160,6 @@ func testWebhookConverter(t *testing.T, defaulting, watchCache bool) { etcd3watcher.TestOnlySetFatalOnDecodeError(false) defer etcd3watcher.TestOnlySetFatalOnDecodeError(true) - // enable necessary features - if defaulting { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, apiextensionsfeatures.CustomResourceDefaulting, true)() - } - tearDown, config, options, err := fixtures.StartDefaultServer(t, fmt.Sprintf("--watch-cache=%v", watchCache)) if err != nil { t.Fatal(err) @@ -192,12 +180,6 @@ func testWebhookConverter(t *testing.T, defaulting, watchCache bool) { crd := multiVersionFixture.DeepCopy() - if !defaulting { - for i := range crd.Spec.Versions { - delete(crd.Spec.Versions[i].Schema.OpenAPIV3Schema.Properties, "defaults") - } - } - RESTOptionsGetter := serveroptions.NewCRDRESTOptionsGetter(*options.RecommendedOptions.Etcd) restOptions, err := RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural}) if err != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/defaulting_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/defaulting_test.go index 1c9688f47c3..3505b4097bd 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/defaulting_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/defaulting_test.go @@ -32,14 +32,11 @@ import ( "k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/dynamic" - utilfeaturetesting "k8s.io/component-base/featuregate/testing" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" - "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/test/integration/fixtures" "k8s.io/apiextensions-apiserver/test/integration/storage" ) @@ -167,8 +164,6 @@ func TestCustomResourceDefaultingWithoutWatchCache(t *testing.T) { } func testDefaulting(t *testing.T, watchCache bool) { - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceDefaulting, true)() - tearDownFn, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t, fmt.Sprintf("--watch-cache=%v", watchCache)) if err != nil { t.Fatal(err) @@ -572,8 +567,6 @@ metadata: ` func TestCustomResourceDefaultingOfMetaFields(t *testing.T) { - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceDefaulting, true)() - tearDown, config, options, err := fixtures.StartDefaultServer(t) if err != nil { t.Fatal(err) diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go index 6a75f60b1f1..fa1fb0828b8 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go @@ -32,7 +32,6 @@ import ( apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" - "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/test/integration/fixtures" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -41,9 +40,7 @@ import ( "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/json" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/dynamic" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/utils/pointer" ) @@ -431,8 +428,6 @@ invalidDefaults: {} ) func TestEmbeddedResources(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceDefaulting, true)() - tearDownFn, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t) if err != nil { t.Fatal(err) diff --git a/vendor/modules.txt b/vendor/modules.txt index 7d33d53d3e2..c384557e79e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1182,7 +1182,6 @@ k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2 k8s.io/apiextensions-apiserver/pkg/controller/status k8s.io/apiextensions-apiserver/pkg/crdserverscheme -k8s.io/apiextensions-apiserver/pkg/features k8s.io/apiextensions-apiserver/pkg/generated/openapi k8s.io/apiextensions-apiserver/pkg/registry/customresource k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor