CRD v1: combine webhookClientConfig and conversionReviewVersions under webhook struct

This commit is contained in:
Jordan Liggitt 2019-06-29 20:54:34 -04:00
parent 05d8b448d2
commit 9a2dd16a0f
5 changed files with 169 additions and 15 deletions

View File

@ -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
}

View File

@ -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()

View File

@ -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)
}

View File

@ -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),

View File

@ -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