From ce9bf3b28f79c10388c01d9c95a6dd5c101861cd Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Tue, 18 May 2021 13:43:05 -0700 Subject: [PATCH] :bug: Envtest conversion mods should set strategy and review versions Conversion webhooks require the strategy to be set and all the supported review versions. This change also fixes an issue where the CABundle wasn't previously base64 encoded. Signed-off-by: Vince Prignano --- pkg/envtest/crd.go | 51 ++++++++++++++++++++++++++++++++++++++++++- pkg/envtest/server.go | 1 + 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/pkg/envtest/crd.go b/pkg/envtest/crd.go index 923fa6da0b..e6c084574e 100644 --- a/pkg/envtest/crd.go +++ b/pkg/envtest/crd.go @@ -20,6 +20,7 @@ import ( "bufio" "bytes" "context" + "encoding/base64" "fmt" "io" "io/ioutil" @@ -370,6 +371,11 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal for _, crd := range crds { switch c := crd.(type) { case *apiextensionsv1beta1.CustomResourceDefinition: + // preserveUnknownFields defaults to true if `nil` in v1beta1. + if c.Spec.PreserveUnknownFields == nil || *c.Spec.PreserveUnknownFields { + continue + } + c.Spec.Conversion.Strategy = apiextensionsv1beta1.WebhookConverter c.Spec.Conversion.WebhookClientConfig.Service = nil c.Spec.Conversion.WebhookClientConfig = &apiextensionsv1beta1.WebhookClientConfig{ Service: nil, @@ -377,6 +383,10 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal CABundle: webhookOptions.LocalServingCAData, } case *apiextensionsv1.CustomResourceDefinition: + if c.Spec.PreserveUnknownFields { + continue + } + c.Spec.Conversion.Strategy = apiextensionsv1.WebhookConverter c.Spec.Conversion.Webhook.ClientConfig.Service = nil c.Spec.Conversion.Webhook.ClientConfig = &apiextensionsv1.WebhookClientConfig{ Service: nil, @@ -386,11 +396,31 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal case *unstructured.Unstructured: webhookClientConfig := map[string]interface{}{ "url": *url, - "caBundle": webhookOptions.LocalServingCAData, + "caBundle": base64.StdEncoding.EncodeToString(webhookOptions.LocalServingCAData), } switch c.GroupVersionKind().Version { case "v1beta1": + // preserveUnknownFields defaults to true if `nil` in v1beta1. + if preserve, found, _ := unstructured.NestedBool(c.Object, "spec", "preserveUnknownFields"); preserve || !found { + continue + } + + // Set the strategy. + if err := unstructured.SetNestedField( + c.Object, + string(apiextensionsv1beta1.WebhookConverter), + "spec", "conversion", "strategy"); err != nil { + return err + } + // Set the conversion review versions. + if err := unstructured.SetNestedStringSlice( + c.Object, + []string{"v1beta1"}, + "spec", "conversion", "webhook", "clientConfig"); err != nil { + return err + } + // Set the client configuration. if err := unstructured.SetNestedMap( c.Object, webhookClientConfig, @@ -398,6 +428,25 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal return err } case "v1": + if preserve, _, _ := unstructured.NestedBool(c.Object, "spec", "preserveUnknownFields"); preserve { + continue + } + + // Set the strategy. + if err := unstructured.SetNestedField( + c.Object, + string(apiextensionsv1.WebhookConverter), + "spec", "conversion", "strategy"); err != nil { + return err + } + // Set the conversion review versions. + if err := unstructured.SetNestedStringSlice( + c.Object, + []string{"v1", "v1beta1"}, + "spec", "conversion", "webhook", "conversionReviewVersions"); err != nil { + return err + } + // Set the client configuration. if err := unstructured.SetNestedMap( c.Object, webhookClientConfig, diff --git a/pkg/envtest/server.go b/pkg/envtest/server.go index b23e81fee9..776e435bf2 100644 --- a/pkg/envtest/server.go +++ b/pkg/envtest/server.go @@ -273,6 +273,7 @@ func (te *Environment) Start() (*rest.Config, error) { te.CRDInstallOptions.CRDs = mergeCRDs(te.CRDInstallOptions.CRDs, te.CRDs) te.CRDInstallOptions.Paths = mergePaths(te.CRDInstallOptions.Paths, te.CRDDirectoryPaths) te.CRDInstallOptions.ErrorIfPathMissing = te.ErrorIfCRDPathMissing + te.CRDInstallOptions.WebhookOptions = te.WebhookInstallOptions crds, err := InstallCRDs(te.Config, te.CRDInstallOptions) if err != nil { return te.Config, err