@@ -20,6 +20,7 @@ import (
20
20
"bufio"
21
21
"bytes"
22
22
"context"
23
+ "encoding/base64"
23
24
"fmt"
24
25
"io"
25
26
"io/ioutil"
@@ -370,13 +371,22 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal
370
371
for _ , crd := range crds {
371
372
switch c := crd .(type ) {
372
373
case * apiextensionsv1beta1.CustomResourceDefinition :
374
+ // preserveUnknownFields defaults to true if `nil` in v1beta1.
375
+ if c .Spec .PreserveUnknownFields == nil || * c .Spec .PreserveUnknownFields {
376
+ continue
377
+ }
378
+ c .Spec .Conversion .Strategy = apiextensionsv1beta1 .WebhookConverter
373
379
c .Spec .Conversion .WebhookClientConfig .Service = nil
374
380
c .Spec .Conversion .WebhookClientConfig = & apiextensionsv1beta1.WebhookClientConfig {
375
381
Service : nil ,
376
382
URL : url ,
377
383
CABundle : webhookOptions .LocalServingCAData ,
378
384
}
379
385
case * apiextensionsv1.CustomResourceDefinition :
386
+ if c .Spec .PreserveUnknownFields {
387
+ continue
388
+ }
389
+ c .Spec .Conversion .Strategy = apiextensionsv1 .WebhookConverter
380
390
c .Spec .Conversion .Webhook .ClientConfig .Service = nil
381
391
c .Spec .Conversion .Webhook .ClientConfig = & apiextensionsv1.WebhookClientConfig {
382
392
Service : nil ,
@@ -386,18 +396,57 @@ func modifyConversionWebhooks(crds []client.Object, webhookOptions WebhookInstal
386
396
case * unstructured.Unstructured :
387
397
webhookClientConfig := map [string ]interface {}{
388
398
"url" : * url ,
389
- "caBundle" : webhookOptions .LocalServingCAData ,
399
+ "caBundle" : base64 . StdEncoding . EncodeToString ( webhookOptions .LocalServingCAData ) ,
390
400
}
391
401
392
402
switch c .GroupVersionKind ().Version {
393
403
case "v1beta1" :
404
+ // preserveUnknownFields defaults to true if `nil` in v1beta1.
405
+ if preserve , found , _ := unstructured .NestedBool (c .Object , "spec" , "preserveUnknownFields" ); preserve || ! found {
406
+ continue
407
+ }
408
+
409
+ // Set the strategy.
410
+ if err := unstructured .SetNestedField (
411
+ c .Object ,
412
+ string (apiextensionsv1beta1 .WebhookConverter ),
413
+ "spec" , "conversion" , "strategy" ); err != nil {
414
+ return err
415
+ }
416
+ // Set the conversion review versions.
417
+ if err := unstructured .SetNestedStringSlice (
418
+ c .Object ,
419
+ []string {"v1beta1" },
420
+ "spec" , "conversion" , "webhook" , "clientConfig" ); err != nil {
421
+ return err
422
+ }
423
+ // Set the client configuration.
394
424
if err := unstructured .SetNestedMap (
395
425
c .Object ,
396
426
webhookClientConfig ,
397
427
"spec" , "conversion" , "webhookClientConfig" ); err != nil {
398
428
return err
399
429
}
400
430
case "v1" :
431
+ if preserve , _ , _ := unstructured .NestedBool (c .Object , "spec" , "preserveUnknownFields" ); preserve {
432
+ continue
433
+ }
434
+
435
+ // Set the strategy.
436
+ if err := unstructured .SetNestedField (
437
+ c .Object ,
438
+ string (apiextensionsv1 .WebhookConverter ),
439
+ "spec" , "conversion" , "strategy" ); err != nil {
440
+ return err
441
+ }
442
+ // Set the conversion review versions.
443
+ if err := unstructured .SetNestedStringSlice (
444
+ c .Object ,
445
+ []string {"v1" , "v1beta1" },
446
+ "spec" , "conversion" , "webhook" , "conversionReviewVersions" ); err != nil {
447
+ return err
448
+ }
449
+ // Set the client configuration.
401
450
if err := unstructured .SetNestedMap (
402
451
c .Object ,
403
452
webhookClientConfig ,
0 commit comments