mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 09:49:50 +00:00
Merge pull request #87475 from liggitt/drop-ga-gates
Remove deprecated GA feature gates that expire in 1.18
This commit is contained in:
commit
58c67632e5
@ -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/cmd/server
|
||||||
staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer
|
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/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/customresource
|
||||||
staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition
|
staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition
|
||||||
staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer
|
staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer
|
||||||
|
@ -10,7 +10,6 @@ go_library(
|
|||||||
srcs = ["kube_features.go"],
|
srcs = ["kube_features.go"],
|
||||||
importpath = "k8s.io/kubernetes/pkg/features",
|
importpath = "k8s.io/kubernetes/pkg/features",
|
||||||
deps = [
|
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/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
@ -17,7 +17,6 @@ limitations under the License.
|
|||||||
package features
|
package features
|
||||||
|
|
||||||
import (
|
import (
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
"k8s.io/apimachinery/pkg/util/runtime"
|
"k8s.io/apimachinery/pkg/util/runtime"
|
||||||
genericfeatures "k8s.io/apiserver/pkg/features"
|
genericfeatures "k8s.io/apiserver/pkg/features"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
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.ServerSideApply: {Default: true, PreRelease: featuregate.Beta},
|
||||||
genericfeatures.APIPriorityAndFairness: {Default: false, PreRelease: featuregate.Alpha},
|
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
|
// features that enable backwards compatibility but are scheduled to be removed
|
||||||
// ...
|
// ...
|
||||||
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
|
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
|
@ -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:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting: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/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/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/validation: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/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets: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:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field: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/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/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/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1: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/api/apitesting/fuzzer:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1: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",
|
"//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/runtime/serializer:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/json: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/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",
|
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -29,7 +29,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
utilvalidation "k8s.io/apimachinery/pkg/util/validation"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/apiserver/pkg/util/webhook"
|
"k8s.io/apiserver/pkg/util/webhook"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
@ -37,7 +36,6 @@ import (
|
|||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation"
|
apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation"
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
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)...)
|
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.Strategy == apiextensions.WebhookConverter {
|
||||||
if conversion.WebhookClientConfig == nil {
|
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"))
|
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"))
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
cc := conversion.WebhookClientConfig
|
cc := conversion.WebhookClientConfig
|
||||||
switch {
|
switch {
|
||||||
|
@ -25,7 +25,6 @@ import (
|
|||||||
apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer"
|
apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer"
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
|
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -33,9 +32,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
"k8s.io/apimachinery/pkg/util/json"
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"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"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -82,8 +78,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
resource *apiextensions.CustomResourceDefinition
|
resource *apiextensions.CustomResourceDefinition
|
||||||
requestGV schema.GroupVersion
|
requestGV schema.GroupVersion
|
||||||
errors []validationMatch
|
errors []validationMatch
|
||||||
enabledFeatures []featuregate.Feature
|
|
||||||
disabledFeatures []featuregate.Feature
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "invalid types allowed via v1beta1",
|
name: "invalid types allowed via v1beta1",
|
||||||
@ -1645,7 +1639,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
StoredVersions: []string{"version"},
|
StoredVersions: []string{"version"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
requestGV: apiextensionsv1beta1.SchemeGroupVersion,
|
requestGV: apiextensionsv1beta1.SchemeGroupVersion,
|
||||||
errors: []validationMatch{
|
errors: []validationMatch{
|
||||||
forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "default"), // disallowed via v1beta1
|
forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "default"), // disallowed via v1beta1
|
||||||
@ -1683,7 +1676,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
StoredVersions: []string{"version"},
|
StoredVersions: []string{"version"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
requestGV: apiextensionsv1.SchemeGroupVersion,
|
requestGV: apiextensionsv1.SchemeGroupVersion,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1937,7 +1929,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
required("spec", "validation", "openAPIV3Schema", "properties[a]", "type"),
|
required("spec", "validation", "openAPIV3Schema", "properties[a]", "type"),
|
||||||
required("spec", "validation", "openAPIV3Schema", "type"),
|
required("spec", "validation", "openAPIV3Schema", "type"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "defaults with enabled feature gate, structural schema",
|
name: "defaults with enabled feature gate, structural schema",
|
||||||
@ -1972,7 +1963,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
errors: []validationMatch{},
|
errors: []validationMatch{},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "defaults in value validation with enabled feature gate, structural schema",
|
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]", "anyOf[0]", "default"),
|
||||||
forbidden("spec", "validation", "openAPIV3Schema", "properties[a]", "oneOf[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",
|
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[preserveUnknownFields]", "default"),
|
||||||
invalid("spec", "validation", "openAPIV3Schema", "properties[e]", "properties[nestedProperties]", "default"),
|
invalid("spec", "validation", "openAPIV3Schema", "properties[e]", "properties[nestedProperties]", "default"),
|
||||||
},
|
},
|
||||||
|
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "additionalProperties at resource root",
|
name: "additionalProperties at resource root",
|
||||||
@ -2254,7 +2241,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
required("spec", "validation", "openAPIV3Schema", "properties[embedded1]", "properties"),
|
required("spec", "validation", "openAPIV3Schema", "properties[embedded1]", "properties"),
|
||||||
forbidden("spec", "validation", "openAPIV3Schema", "properties[embedded2]", "additionalProperties"),
|
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.
|
// 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 value: wrongly typed
|
||||||
invalid("spec", "versions[3]", "schema", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[name]", "default"),
|
invalid("spec", "versions[3]", "schema", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[name]", "default"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "default inside additionalSchema",
|
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: must not be set inside additionalProperties applying to object metadata
|
||||||
forbidden("spec", "validation", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[annotations]", "additionalProperties", "default"),
|
forbidden("spec", "validation", "openAPIV3Schema", "properties[embedded]", "properties[metadata]", "properties[annotations]", "additionalProperties", "default"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "top-level metadata default",
|
name: "top-level metadata default",
|
||||||
@ -2555,7 +2539,6 @@ func TestValidateCustomResourceDefinition(t *testing.T) {
|
|||||||
errors: []validationMatch{
|
errors: []validationMatch{
|
||||||
forbidden("spec", "validation", "openAPIV3Schema", "properties[metadata]", "default"),
|
forbidden("spec", "validation", "openAPIV3Schema", "properties[metadata]", "default"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "embedded metadata defaults",
|
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", "apiVersion"),
|
||||||
required("spec", "validation", "openAPIV3Schema", "properties[spanning-defaults-with-missing-typemeta]", "default", "embedded", "kind"),
|
required("spec", "validation", "openAPIV3Schema", "properties[spanning-defaults-with-missing-typemeta]", "default", "embedded", "kind"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "contradicting meta field types",
|
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[kind]", "type"),
|
||||||
invalid("spec", "validation", "openAPIV3Schema", "properties[nested]", "properties[invalid]", "properties[metadata]", "type"),
|
invalid("spec", "validation", "openAPIV3Schema", "properties[nested]", "properties[invalid]", "properties[metadata]", "type"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
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
|
// duplicate defaulting behaviour
|
||||||
if tc.resource.Spec.Conversion != nil && tc.resource.Spec.Conversion.Strategy == apiextensions.WebhookConverter && len(tc.resource.Spec.Conversion.ConversionReviewVersions) == 0 {
|
if tc.resource.Spec.Conversion != nil && tc.resource.Spec.Conversion.Strategy == apiextensions.WebhookConverter && len(tc.resource.Spec.Conversion.ConversionReviewVersions) == 0 {
|
||||||
@ -4137,8 +4112,6 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) {
|
|||||||
resource *apiextensions.CustomResourceDefinition
|
resource *apiextensions.CustomResourceDefinition
|
||||||
requestGV schema.GroupVersion
|
requestGV schema.GroupVersion
|
||||||
errors []validationMatch
|
errors []validationMatch
|
||||||
enabledFeatures []featuregate.Feature
|
|
||||||
disabledFeatures []featuregate.Feature
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "invalid type updates allowed via v1beta1",
|
name: "invalid type updates allowed via v1beta1",
|
||||||
@ -5882,7 +5855,6 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
requestGV: apiextensionsv1beta1.SchemeGroupVersion,
|
requestGV: apiextensionsv1beta1.SchemeGroupVersion,
|
||||||
errors: []validationMatch{forbidden("spec.validation.openAPIV3Schema.properties[a].default")},
|
errors: []validationMatch{forbidden("spec.validation.openAPIV3Schema.properties[a].default")},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "setting defaults with enabled feature gate via v1",
|
name: "setting defaults with enabled feature gate via v1",
|
||||||
@ -5965,7 +5937,6 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
requestGV: apiextensionsv1.SchemeGroupVersion,
|
requestGV: apiextensionsv1.SchemeGroupVersion,
|
||||||
errors: []validationMatch{},
|
errors: []validationMatch{},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "add default with enabled feature gate, structural schema, without pruning",
|
name: "add default with enabled feature gate, structural schema, without pruning",
|
||||||
@ -6032,19 +6003,11 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) {
|
|||||||
errors: []validationMatch{
|
errors: []validationMatch{
|
||||||
invalid("spec", "preserveUnknownFields"),
|
invalid("spec", "preserveUnknownFields"),
|
||||||
},
|
},
|
||||||
enabledFeatures: []featuregate.Feature{features.CustomResourceDefaulting},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
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)
|
errs := ValidateCustomResourceDefinitionUpdate(tc.resource, tc.old, tc.requestGV)
|
||||||
seenErrs := make([]bool, len(errs))
|
seenErrs := make([]bool, len(errs))
|
||||||
|
|
||||||
|
@ -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/openapi/builder:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status: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/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:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor: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",
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library",
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
|
"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/apis/apiextensions/v1beta1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
_ "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"
|
"k8s.io/apiextensions-apiserver/pkg/controller/nonstructuralschema"
|
||||||
openapicontroller "k8s.io/apiextensions-apiserver/pkg/controller/openapi"
|
openapicontroller "k8s.io/apiextensions-apiserver/pkg/controller/openapi"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/controller/status"
|
"k8s.io/apiextensions-apiserver/pkg/controller/status"
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition"
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -48,7 +47,6 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/registry/rest"
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
genericapiserver "k8s.io/apiserver/pkg/server"
|
genericapiserver "k8s.io/apiserver/pkg/server"
|
||||||
serverstorage "k8s.io/apiserver/pkg/server/storage"
|
serverstorage "k8s.io/apiserver/pkg/server/storage"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/apiserver/pkg/util/webhook"
|
"k8s.io/apiserver/pkg/util/webhook"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -218,10 +216,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
|
|||||||
crdClient.ApiextensionsV1(),
|
crdClient.ApiextensionsV1(),
|
||||||
crdHandler,
|
crdHandler,
|
||||||
)
|
)
|
||||||
var openapiController *openapicontroller.Controller
|
openapiController := openapicontroller.NewController(s.Informers.Apiextensions().V1().CustomResourceDefinitions())
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourcePublishOpenAPI) {
|
|
||||||
openapiController = openapicontroller.NewController(s.Informers.Apiextensions().V1().CustomResourceDefinitions())
|
|
||||||
}
|
|
||||||
|
|
||||||
s.GenericAPIServer.AddPostStartHookOrDie("start-apiextensions-informers", func(context genericapiserver.PostStartHookContext) error {
|
s.GenericAPIServer.AddPostStartHookOrDie("start-apiextensions-informers", func(context genericapiserver.PostStartHookContext) error {
|
||||||
s.Informers.Start(context.StopCh)
|
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
|
// 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
|
// 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.
|
// 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)
|
go openapiController.Run(s.GenericAPIServer.StaticOpenAPISpec, s.GenericAPIServer.OpenAPIVersionedService, context.StopCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ go_library(
|
|||||||
"//staging/src/k8s.io/api/autoscaling/v1:go_default_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/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1: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/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:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured: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/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/uuid: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/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/apiserver/pkg/util/webhook:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
||||||
|
@ -21,11 +21,9 @@ import (
|
|||||||
|
|
||||||
autoscalingv1 "k8s.io/api/autoscaling/v1"
|
autoscalingv1 "k8s.io/api/autoscaling/v1"
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/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/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/apiserver/pkg/util/webhook"
|
"k8s.io/apiserver/pkg/util/webhook"
|
||||||
typedscheme "k8s.io/client-go/kubernetes/scheme"
|
typedscheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
)
|
)
|
||||||
@ -44,13 +42,11 @@ var converterMetricFactorySingleton = newConverterMertricFactory()
|
|||||||
// NewCRConverterFactory creates a new CRConverterFactory
|
// NewCRConverterFactory creates a new CRConverterFactory
|
||||||
func NewCRConverterFactory(serviceResolver webhook.ServiceResolver, authResolverWrapper webhook.AuthenticationInfoResolverWrapper) (*CRConverterFactory, error) {
|
func NewCRConverterFactory(serviceResolver webhook.ServiceResolver, authResolverWrapper webhook.AuthenticationInfoResolverWrapper) (*CRConverterFactory, error) {
|
||||||
converterFactory := &CRConverterFactory{}
|
converterFactory := &CRConverterFactory{}
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) {
|
|
||||||
webhookConverterFactory, err := newWebhookConverterFactory(serviceResolver, authResolverWrapper)
|
webhookConverterFactory, err := newWebhookConverterFactory(serviceResolver, authResolverWrapper)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
converterFactory.webhookConverterFactory = webhookConverterFactory
|
converterFactory.webhookConverterFactory = webhookConverterFactory
|
||||||
}
|
|
||||||
return converterFactory, nil
|
return converterFactory, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,9 +62,6 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensionsv1.CustomResourceDef
|
|||||||
case apiextensionsv1.NoneConverter:
|
case apiextensionsv1.NoneConverter:
|
||||||
converter = &nopConverter{}
|
converter = &nopConverter{}
|
||||||
case apiextensionsv1.WebhookConverter:
|
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)
|
converter, err = m.webhookConverterFactory.NewWebhookConverter(crd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
@ -83,13 +76,11 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensionsv1.CustomResourceDef
|
|||||||
|
|
||||||
// Determine whether we should expect to be asked to "convert" autoscaling/v1 Scale types
|
// Determine whether we should expect to be asked to "convert" autoscaling/v1 Scale types
|
||||||
convertScale := false
|
convertScale := false
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) {
|
|
||||||
for _, version := range crd.Spec.Versions {
|
for _, version := range crd.Spec.Versions {
|
||||||
if version.Subresources != nil && version.Subresources.Scale != nil {
|
if version.Subresources != nil && version.Subresources.Scale != nil {
|
||||||
convertScale = true
|
convertScale = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
unsafe = &crConverter{
|
unsafe = &crConverter{
|
||||||
convertScale: convertScale,
|
convertScale: convertScale,
|
||||||
|
@ -44,7 +44,6 @@ import (
|
|||||||
"k8s.io/apiextensions-apiserver/pkg/controller/finalizer"
|
"k8s.io/apiextensions-apiserver/pkg/controller/finalizer"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder"
|
"k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/crdserverscheme"
|
"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"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor"
|
"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)
|
utilruntime.HandleError(err)
|
||||||
return nil, fmt.Errorf("the server could not properly serve the CR subresources")
|
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)
|
equivalentResourceRegistry.RegisterKindFor(resource, "status", kind)
|
||||||
statusSpec = &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
statusSpec = &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
||||||
if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceStatus_To_apiextensions_CustomResourceSubresourceStatus(subresources.Status, statusSpec, nil); err != nil {
|
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
|
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"))
|
equivalentResourceRegistry.RegisterKindFor(resource, "scale", autoscalingv1.SchemeGroupVersion.WithKind("Scale"))
|
||||||
scaleSpec = &apiextensionsinternal.CustomResourceSubresourceScale{}
|
scaleSpec = &apiextensionsinternal.CustomResourceSubresourceScale{}
|
||||||
if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(subresources.Scale, scaleSpec, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(subresources.Scale, scaleSpec, nil); err != nil {
|
||||||
|
@ -22,53 +22,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Every feature gate should add method here following this template:
|
// Every feature gate should add method here following this template:
|
||||||
//
|
//
|
||||||
// // owner: @username
|
// // owner: @username
|
||||||
// // alpha: v1.4
|
// // alpha: v1.4
|
||||||
// MyFeature() bool
|
// 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"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -78,10 +36,4 @@ func init() {
|
|||||||
// defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys.
|
// 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
|
// To add a new feature, define a key for it above and add it here. The features will be
|
||||||
// available throughout Kubernetes binaries.
|
// available throughout Kubernetes binaries.
|
||||||
var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
|
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},
|
|
||||||
}
|
|
||||||
|
@ -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:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta: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/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/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors: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",
|
"//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/registry/rest:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/storage: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/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",
|
"//vendor/github.com/go-openapi/validate:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -32,12 +32,10 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
apiserverstorage "k8s.io/apiserver/pkg/storage"
|
apiserverstorage "k8s.io/apiserver/pkg/storage"
|
||||||
"k8s.io/apiserver/pkg/storage/names"
|
"k8s.io/apiserver/pkg/storage/names"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
schemaobjectmeta "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta"
|
schemaobjectmeta "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/objectmeta"
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// customResourceStrategy implements behavior for CustomResources.
|
// customResourceStrategy implements behavior for CustomResources.
|
||||||
@ -75,7 +73,7 @@ func (a customResourceStrategy) NamespaceScoped() bool {
|
|||||||
|
|
||||||
// PrepareForCreate clears the status of a CustomResource before creation.
|
// PrepareForCreate clears the status of a CustomResource before creation.
|
||||||
func (a customResourceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) {
|
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)
|
customResourceObject := obj.(*unstructured.Unstructured)
|
||||||
customResource := customResourceObject.UnstructuredContent()
|
customResource := customResourceObject.UnstructuredContent()
|
||||||
|
|
||||||
@ -98,7 +96,7 @@ func (a customResourceStrategy) PrepareForUpdate(ctx context.Context, obj, old r
|
|||||||
oldCustomResource := oldCustomResourceObject.UnstructuredContent()
|
oldCustomResource := oldCustomResourceObject.UnstructuredContent()
|
||||||
|
|
||||||
// If the /status subresource endpoint is installed, update is not allowed to set status.
|
// 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"]
|
_, ok1 := newCustomResource["status"]
|
||||||
_, ok2 := oldCustomResource["status"]
|
_, ok2 := oldCustomResource["status"]
|
||||||
switch {
|
switch {
|
||||||
|
@ -13,7 +13,6 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
"//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/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/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors: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",
|
"//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/errors:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/storage/names: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/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/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/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema: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",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
"//vendor/k8s.io/utils/pointer:go_default_library",
|
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -22,7 +22,6 @@ import (
|
|||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
|
||||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
@ -33,7 +32,6 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
"k8s.io/apiserver/pkg/storage"
|
"k8s.io/apiserver/pkg/storage"
|
||||||
"k8s.io/apiserver/pkg/storage/names"
|
"k8s.io/apiserver/pkg/storage/names"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// strategy implements behavior for CustomResources.
|
// strategy implements behavior for CustomResources.
|
||||||
@ -56,8 +54,6 @@ func (strategy) PrepareForCreate(ctx context.Context, obj runtime.Object) {
|
|||||||
crd.Status = apiextensions.CustomResourceDefinitionStatus{}
|
crd.Status = apiextensions.CustomResourceDefinitionStatus{}
|
||||||
crd.Generation = 1
|
crd.Generation = 1
|
||||||
|
|
||||||
dropDisabledFields(&crd.Spec, nil)
|
|
||||||
|
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if v.Storage {
|
if v.Storage {
|
||||||
if !apiextensions.IsStoredVersion(crd, v.Name) {
|
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
|
newCRD.Generation = oldCRD.Generation + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
dropDisabledFields(&newCRD.Spec, &oldCRD.Spec)
|
|
||||||
|
|
||||||
for _, v := range newCRD.Spec.Versions {
|
for _, v := range newCRD.Spec.Versions {
|
||||||
if v.Storage {
|
if v.Storage {
|
||||||
if !apiextensions.IsStoredVersion(newCRD, v.Name) {
|
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 {
|
func CustomResourceDefinitionToSelectableFields(obj *apiextensions.CustomResourceDefinition) fields.Set {
|
||||||
return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true)
|
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
|
|
||||||
}
|
|
||||||
|
@ -17,8 +17,6 @@ limitations under the License.
|
|||||||
package customresourcedefinition
|
package customresourcedefinition
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
@ -26,333 +24,10 @@ import (
|
|||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/diff"
|
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/utils/pointer"
|
"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 {
|
func strPtr(in string) *string {
|
||||||
return &in
|
return &in
|
||||||
}
|
}
|
||||||
|
@ -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:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme: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/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/fixtures:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage: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",
|
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
@ -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/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/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/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/fixtures:go_default_library",
|
||||||
"//staging/src/k8s.io/apiextensions-apiserver/test/integration/storage: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",
|
"//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/uuid:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait: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/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/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",
|
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -38,15 +38,12 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
etcd3watcher "k8s.io/apiserver/pkg/storage/etcd3"
|
etcd3watcher "k8s.io/apiserver/pkg/storage/etcd3"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
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/fixtures"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/storage"
|
"k8s.io/apiextensions-apiserver/test/integration/storage"
|
||||||
)
|
)
|
||||||
@ -58,17 +55,13 @@ func checks(checkers ...Checker) []Checker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestWebhookConverterWithWatchCache(t *testing.T) {
|
func TestWebhookConverterWithWatchCache(t *testing.T) {
|
||||||
testWebhookConverter(t, false, true)
|
testWebhookConverter(t, true)
|
||||||
}
|
}
|
||||||
func TestWebhookConverterWithoutWatchCache(t *testing.T) {
|
func TestWebhookConverterWithoutWatchCache(t *testing.T) {
|
||||||
testWebhookConverter(t, false, false)
|
testWebhookConverter(t, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWebhookConverterWithDefaulting(t *testing.T) {
|
func testWebhookConverter(t *testing.T, watchCache bool) {
|
||||||
testWebhookConverter(t, true, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testWebhookConverter(t *testing.T, defaulting, watchCache bool) {
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
group string
|
group string
|
||||||
handler http.Handler
|
handler http.Handler
|
||||||
@ -167,11 +160,6 @@ func testWebhookConverter(t *testing.T, defaulting, watchCache bool) {
|
|||||||
etcd3watcher.TestOnlySetFatalOnDecodeError(false)
|
etcd3watcher.TestOnlySetFatalOnDecodeError(false)
|
||||||
defer etcd3watcher.TestOnlySetFatalOnDecodeError(true)
|
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))
|
tearDown, config, options, err := fixtures.StartDefaultServer(t, fmt.Sprintf("--watch-cache=%v", watchCache))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -192,12 +180,6 @@ func testWebhookConverter(t *testing.T, defaulting, watchCache bool) {
|
|||||||
|
|
||||||
crd := multiVersionFixture.DeepCopy()
|
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)
|
RESTOptionsGetter := serveroptions.NewCRDRESTOptionsGetter(*options.RecommendedOptions.Etcd)
|
||||||
restOptions, err := RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural})
|
restOptions, err := RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -32,14 +32,11 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/json"
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
utilfeaturetesting "k8s.io/component-base/featuregate/testing"
|
|
||||||
|
|
||||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
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/fixtures"
|
||||||
"k8s.io/apiextensions-apiserver/test/integration/storage"
|
"k8s.io/apiextensions-apiserver/test/integration/storage"
|
||||||
)
|
)
|
||||||
@ -167,8 +164,6 @@ func TestCustomResourceDefaultingWithoutWatchCache(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testDefaulting(t *testing.T, watchCache bool) {
|
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))
|
tearDownFn, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t, fmt.Sprintf("--watch-cache=%v", watchCache))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -572,8 +567,6 @@ metadata:
|
|||||||
`
|
`
|
||||||
|
|
||||||
func TestCustomResourceDefaultingOfMetaFields(t *testing.T) {
|
func TestCustomResourceDefaultingOfMetaFields(t *testing.T) {
|
||||||
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceDefaulting, true)()
|
|
||||||
|
|
||||||
tearDown, config, options, err := fixtures.StartDefaultServer(t)
|
tearDown, config, options, err := fixtures.StartDefaultServer(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -32,7 +32,6 @@ import (
|
|||||||
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
serveroptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
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/fixtures"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -41,9 +40,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/diff"
|
"k8s.io/apimachinery/pkg/util/diff"
|
||||||
"k8s.io/apimachinery/pkg/util/json"
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/dynamic"
|
"k8s.io/client-go/dynamic"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -431,8 +428,6 @@ invalidDefaults: {}
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestEmbeddedResources(t *testing.T) {
|
func TestEmbeddedResources(t *testing.T) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceDefaulting, true)()
|
|
||||||
|
|
||||||
tearDownFn, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
|
tearDownFn, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
1
vendor/modules.txt
vendored
1
vendor/modules.txt
vendored
@ -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/openapi/v2
|
||||||
k8s.io/apiextensions-apiserver/pkg/controller/status
|
k8s.io/apiextensions-apiserver/pkg/controller/status
|
||||||
k8s.io/apiextensions-apiserver/pkg/crdserverscheme
|
k8s.io/apiextensions-apiserver/pkg/crdserverscheme
|
||||||
k8s.io/apiextensions-apiserver/pkg/features
|
|
||||||
k8s.io/apiextensions-apiserver/pkg/generated/openapi
|
k8s.io/apiextensions-apiserver/pkg/generated/openapi
|
||||||
k8s.io/apiextensions-apiserver/pkg/registry/customresource
|
k8s.io/apiextensions-apiserver/pkg/registry/customresource
|
||||||
k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor
|
k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor
|
||||||
|
Loading…
Reference in New Issue
Block a user