diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion.go index ed755e03e23..70a2265c8c1 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion.go @@ -172,3 +172,41 @@ func Convert_v1_CustomResourceDefinitionSpec_To_apiextensions_CustomResourceDefi return nil } + +func Convert_v1_CustomResourceConversion_To_apiextensions_CustomResourceConversion(in *CustomResourceConversion, out *apiextensions.CustomResourceConversion, s conversion.Scope) error { + if err := autoConvert_v1_CustomResourceConversion_To_apiextensions_CustomResourceConversion(in, out, s); err != nil { + return err + } + + out.WebhookClientConfig = nil + out.ConversionReviewVersions = nil + if in.Webhook != nil { + out.ConversionReviewVersions = in.Webhook.ConversionReviewVersions + if in.Webhook.ClientConfig != nil { + out.WebhookClientConfig = &apiextensions.WebhookClientConfig{} + if err := Convert_v1_WebhookClientConfig_To_apiextensions_WebhookClientConfig(in.Webhook.ClientConfig, out.WebhookClientConfig, s); err != nil { + return err + } + } + } + return nil +} + +func Convert_apiextensions_CustomResourceConversion_To_v1_CustomResourceConversion(in *apiextensions.CustomResourceConversion, out *CustomResourceConversion, s conversion.Scope) error { + if err := autoConvert_apiextensions_CustomResourceConversion_To_v1_CustomResourceConversion(in, out, s); err != nil { + return err + } + + out.Webhook = nil + if in.WebhookClientConfig != nil || in.ConversionReviewVersions != nil { + out.Webhook = &WebhookConversion{} + out.Webhook.ConversionReviewVersions = in.ConversionReviewVersions + if in.WebhookClientConfig != nil { + out.Webhook.ClientConfig = &WebhookClientConfig{} + if err := Convert_apiextensions_WebhookClientConfig_To_v1_WebhookClientConfig(in.WebhookClientConfig, out.Webhook.ClientConfig, s); err != nil { + return err + } + } + } + return nil +} diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion_test.go index bcfedbc117c..63a501ae457 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/conversion_test.go @@ -374,6 +374,118 @@ func TestConversion(t *testing.T) { }, }, }, + // webhook conversion config + { + Name: "internal to v1, no webhook client config", + In: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{}, + }, + }, + Out: &CustomResourceDefinition{}, + ExpectOut: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{}, + }, + }, + }, + { + Name: "internal to v1, webhook client config", + In: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{ + WebhookClientConfig: &apiextensions.WebhookClientConfig{URL: pointer.StringPtr("http://example.com")}, + }, + }, + }, + Out: &CustomResourceDefinition{}, + ExpectOut: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{ + Webhook: &WebhookConversion{ + ClientConfig: &WebhookClientConfig{URL: pointer.StringPtr("http://example.com")}, + }, + }, + }, + }, + }, + { + Name: "internal to v1, webhook versions", + In: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{ + ConversionReviewVersions: []string{"v1"}, + }, + }, + }, + Out: &CustomResourceDefinition{}, + ExpectOut: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{ + Webhook: &WebhookConversion{ + ConversionReviewVersions: []string{"v1"}, + }, + }, + }, + }, + }, + { + Name: "v1 to internal, no webhook client config", + In: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{}, + }, + }, + Out: &apiextensions.CustomResourceDefinition{}, + ExpectOut: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{}, + PreserveUnknownFields: pointer.BoolPtr(false), + }, + }, + }, + { + Name: "v1 to internal, webhook client config", + In: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{ + Webhook: &WebhookConversion{ + ClientConfig: &WebhookClientConfig{URL: pointer.StringPtr("http://example.com")}, + }, + }, + }, + }, + Out: &apiextensions.CustomResourceDefinition{}, + ExpectOut: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{ + WebhookClientConfig: &apiextensions.WebhookClientConfig{URL: pointer.StringPtr("http://example.com")}, + }, + PreserveUnknownFields: pointer.BoolPtr(false), + }, + }, + }, + { + Name: "v1 to internal, webhook versions", + In: &CustomResourceDefinition{ + Spec: CustomResourceDefinitionSpec{ + Conversion: &CustomResourceConversion{ + Webhook: &WebhookConversion{ + ConversionReviewVersions: []string{"v1"}, + }, + }, + }, + }, + Out: &apiextensions.CustomResourceDefinition{}, + ExpectOut: &apiextensions.CustomResourceDefinition{ + Spec: apiextensions.CustomResourceDefinitionSpec{ + Conversion: &apiextensions.CustomResourceConversion{ + ConversionReviewVersions: []string{"v1"}, + }, + PreserveUnknownFields: pointer.BoolPtr(false), + }, + }, + }, } scheme := runtime.NewScheme() diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go index 31c8ae19436..1b7ea2ffe0b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults.go @@ -51,9 +51,6 @@ func SetDefaults_CustomResourceDefinitionSpec(obj *CustomResourceDefinitionSpec) Strategy: NoneConverter, } } - if obj.Conversion.Strategy == WebhookConverter && len(obj.Conversion.ConversionReviewVersions) == 0 { - obj.Conversion.ConversionReviewVersions = []string{SchemeGroupVersion.Version} - } if obj.PreserveUnknownFields == nil { obj.PreserveUnknownFields = utilpointer.BoolPtr(true) } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go index c4f15a52410..ba29b4bf995 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/defaults_test.go @@ -51,8 +51,10 @@ func TestDefaults(t *testing.T) { Scope: NamespaceScoped, Conversion: &CustomResourceConversion{ Strategy: WebhookConverter, - WebhookClientConfig: &WebhookClientConfig{ - Service: &ServiceReference{}, + Webhook: &WebhookConversion{ + ClientConfig: &WebhookClientConfig{ + Service: &ServiceReference{}, + }, }, }, PreserveUnknownFields: utilpointer.BoolPtr(true), @@ -62,10 +64,11 @@ func TestDefaults(t *testing.T) { Spec: CustomResourceDefinitionSpec{ Scope: NamespaceScoped, Conversion: &CustomResourceConversion{ - Strategy: WebhookConverter, - ConversionReviewVersions: []string{"v1"}, - WebhookClientConfig: &WebhookClientConfig{ - Service: &ServiceReference{Port: utilpointer.Int32Ptr(443)}, + Strategy: WebhookConverter, + Webhook: &WebhookConversion{ + ClientConfig: &WebhookClientConfig{ + Service: &ServiceReference{Port: utilpointer.Int32Ptr(443)}, + }, }, }, PreserveUnknownFields: utilpointer.BoolPtr(true), diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go index 53c40df75e7..3c819624048 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/types.go @@ -69,10 +69,16 @@ type CustomResourceConversion struct { // is needed for this option. This requires spec.preserveUnknownFields to be false. Strategy ConversionStrategyType `json:"strategy" protobuf:"bytes,1,name=strategy"` - // `webhookClientConfig` is the instructions for how to call the webhook if strategy is `Webhook`. This field is - // alpha-level and is only honored by servers that enable the CustomResourceWebhookConversion feature. + // webhook describes how to call the conversion webhook. Required when strategy is "Webhook". // +optional - WebhookClientConfig *WebhookClientConfig `json:"webhookClientConfig,omitempty" protobuf:"bytes,2,name=webhookClientConfig"` + Webhook *WebhookConversion `json:"webhook,omitempty" protobuf:"bytes,2,opt,name=webhook"` +} + +// WebhookConversion describes how to call a conversion webhook +type WebhookConversion struct { + // `clientConfig` is the instructions for how to call the webhook if strategy is `Webhook`. + // +optional + ClientConfig *WebhookClientConfig `json:"clientConfig,omitempty" protobuf:"bytes,2,name=clientConfig"` // ConversionReviewVersions is an ordered list of preferred `ConversionReview` // versions the Webhook expects. API server will try to use first version in @@ -80,9 +86,7 @@ type CustomResourceConversion struct { // supported by API server, conversion will fail for this object. // If a persisted Webhook configuration specifies allowed versions and does not // include any versions known to the API Server, calls to the webhook will fail. - // Default to `['v1']`. - // +optional - ConversionReviewVersions []string `json:"conversionReviewVersions,omitempty" protobuf:"bytes,3,rep,name=conversionReviewVersions"` + ConversionReviewVersions []string `json:"conversionReviewVersions" protobuf:"bytes,3,rep,name=conversionReviewVersions"` } // WebhookClientConfig contains the information to make a TLS