@@ -13,7 +13,6 @@ import (
13
13
14
14
"github.com/ghodss/yaml"
15
15
16
- "github.com/openshift/api/annotations"
17
16
kubecontrolplanev1 "github.com/openshift/api/kubecontrolplane/v1"
18
17
operatorv1 "github.com/openshift/api/operator/v1"
19
18
"github.com/openshift/cluster-kube-apiserver-operator/bindata"
@@ -24,6 +23,7 @@ import (
24
23
"github.com/openshift/library-go/pkg/operator/certrotation"
25
24
"github.com/openshift/library-go/pkg/operator/events"
26
25
"github.com/openshift/library-go/pkg/operator/resource/resourceapply"
26
+ "github.com/openshift/library-go/pkg/operator/resource/resourcehelper"
27
27
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
28
28
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
29
29
"github.com/openshift/library-go/pkg/operator/resourcesynccontroller"
@@ -39,6 +39,7 @@ import (
39
39
"k8s.io/client-go/kubernetes"
40
40
coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
41
41
corev1listers "k8s.io/client-go/listers/core/v1"
42
+ "k8s.io/klog/v2"
42
43
)
43
44
44
45
const (
@@ -354,12 +355,33 @@ func generateOptionalStartupMonitorPod(isStartupMonitorEnabledFn func() (bool, e
354
355
}
355
356
356
357
func ManageClientCABundle (ctx context.Context , lister corev1listers.ConfigMapLister , client coreclientv1.ConfigMapsGetter , recorder events.Recorder ) (* corev1.ConfigMap , bool , error ) {
357
- requiredConfigMap , err := resourcesynccontroller .CombineCABundleConfigMaps (
358
- resourcesynccontroller.ResourceLocation {Namespace : operatorclient .TargetNamespace , Name : "client-ca" },
358
+
359
+ additionalAnnotations := certrotation.AdditionalAnnotations {
360
+ JiraComponent : "kube-apiserver" ,
361
+ }
362
+ caBundleConfigMapName := "client-ca"
363
+
364
+ creationRequired := false
365
+ updateRequired := false
366
+
367
+ caBundleConfigMap , err := lister .ConfigMaps (operatorclient .TargetNamespace ).Get (caBundleConfigMapName )
368
+ switch {
369
+ case apierrors .IsNotFound (err ):
370
+ creationRequired = true
371
+ caBundleConfigMap = & corev1.ConfigMap {
372
+ ObjectMeta : metav1.ObjectMeta {
373
+ Name : caBundleConfigMapName ,
374
+ Namespace : operatorclient .TargetNamespace ,
375
+ },
376
+ }
377
+ case err != nil :
378
+ return nil , false , err
379
+ }
380
+
381
+ requiredConfigMap , updateRequired , err := resourcesynccontroller .CombineCABundleConfigMapsOptimistically (
382
+ caBundleConfigMap ,
359
383
lister ,
360
- certrotation.AdditionalAnnotations {
361
- JiraComponent : "kube-apiserver" ,
362
- },
384
+ additionalAnnotations ,
363
385
// this is from the installer and contains the value to verify the admin.kubeconfig user
364
386
resourcesynccontroller.ResourceLocation {Namespace : operatorclient .GlobalUserSpecifiedConfigNamespace , Name : "admin-kubeconfig-client-ca" },
365
387
// this is from the installer and contains the value to verify the node bootstrapping cert that is baked into images
@@ -379,21 +401,56 @@ func ManageClientCABundle(ctx context.Context, lister corev1listers.ConfigMapLis
379
401
if err != nil {
380
402
return nil , false , err
381
403
}
382
- if requiredConfigMap .Annotations == nil {
383
- requiredConfigMap .Annotations = map [string ]string {}
404
+
405
+ if creationRequired {
406
+ caBundleConfigMap , err = client .ConfigMaps (operatorclient .TargetNamespace ).Create (ctx , requiredConfigMap , metav1.CreateOptions {})
407
+ resourcehelper .ReportCreateEvent (recorder , caBundleConfigMap , err )
408
+ if err != nil {
409
+ return nil , false , err
410
+ }
411
+ klog .V (2 ).Infof ("Created client CA bundle configmap %s/%s" , caBundleConfigMap .Namespace , caBundleConfigMap .Name )
412
+ return caBundleConfigMap , true , nil
413
+ } else if updateRequired {
414
+ caBundleConfigMap , err = client .ConfigMaps (operatorclient .TargetNamespace ).Update (ctx , requiredConfigMap , metav1.UpdateOptions {})
415
+ resourcehelper .ReportUpdateEvent (recorder , caBundleConfigMap , err )
416
+ if err != nil {
417
+ return nil , false , err
418
+ }
419
+ klog .V (2 ).Infof ("Updated client CA bundle configmap %s/%s" , caBundleConfigMap .Namespace , caBundleConfigMap .Name )
420
+ return caBundleConfigMap , true , nil
384
421
}
385
- requiredConfigMap .Annotations [annotations .OpenShiftComponent ] = "kube-apiserver"
386
422
387
- return resourceapply . ApplyConfigMap ( ctx , client , recorder , requiredConfigMap )
423
+ return caBundleConfigMap , false , nil
388
424
}
389
425
390
426
func manageKubeAPIServerCABundle (ctx context.Context , lister corev1listers.ConfigMapLister , client coreclientv1.ConfigMapsGetter , recorder events.Recorder ) (* corev1.ConfigMap , bool , error ) {
391
- requiredConfigMap , err := resourcesynccontroller .CombineCABundleConfigMaps (
392
- resourcesynccontroller.ResourceLocation {Namespace : operatorclient .TargetNamespace , Name : "kube-apiserver-server-ca" },
427
+
428
+ additionalAnnotations := certrotation.AdditionalAnnotations {
429
+ JiraComponent : "kube-apiserver" ,
430
+ }
431
+ caBundleConfigMapName := "kube-apiserver-server-ca"
432
+
433
+ creationRequired := false
434
+ updateRequired := false
435
+
436
+ caBundleConfigMap , err := lister .ConfigMaps (operatorclient .TargetNamespace ).Get (caBundleConfigMapName )
437
+ switch {
438
+ case apierrors .IsNotFound (err ):
439
+ creationRequired = true
440
+ caBundleConfigMap = & corev1.ConfigMap {
441
+ ObjectMeta : metav1.ObjectMeta {
442
+ Name : caBundleConfigMapName ,
443
+ Namespace : operatorclient .TargetNamespace ,
444
+ },
445
+ }
446
+ case err != nil :
447
+ return nil , false , err
448
+ }
449
+
450
+ requiredConfigMap , updateRequired , err := resourcesynccontroller .CombineCABundleConfigMapsOptimistically (
451
+ caBundleConfigMap ,
393
452
lister ,
394
- certrotation.AdditionalAnnotations {
395
- JiraComponent : "kube-apiserver" ,
396
- },
453
+ additionalAnnotations ,
397
454
// this bundle is what this operator uses to mint loadbalancers certs
398
455
resourcesynccontroller.ResourceLocation {Namespace : operatorclient .OperatorNamespace , Name : "loadbalancer-serving-ca" },
399
456
// this bundle is what this operator uses to mint localhost certs
@@ -406,12 +463,26 @@ func manageKubeAPIServerCABundle(ctx context.Context, lister corev1listers.Confi
406
463
if err != nil {
407
464
return nil , false , err
408
465
}
409
- if requiredConfigMap .Annotations == nil {
410
- requiredConfigMap .Annotations = map [string ]string {}
466
+
467
+ if creationRequired {
468
+ caBundleConfigMap , err := client .ConfigMaps (operatorclient .TargetNamespace ).Create (ctx , requiredConfigMap , metav1.CreateOptions {})
469
+ resourcehelper .ReportCreateEvent (recorder , caBundleConfigMap , err )
470
+ if err != nil {
471
+ return nil , false , err
472
+ }
473
+ klog .V (2 ).Infof ("Created kube apiserver CA bundle configmap %s/%s" , caBundleConfigMap .Namespace , caBundleConfigMap .Name )
474
+ return caBundleConfigMap , true , nil
475
+ } else if updateRequired {
476
+ caBundleConfigMap , err := client .ConfigMaps (operatorclient .TargetNamespace ).Update (ctx , requiredConfigMap , metav1.UpdateOptions {})
477
+ resourcehelper .ReportUpdateEvent (recorder , caBundleConfigMap , err )
478
+ if err != nil {
479
+ return nil , false , err
480
+ }
481
+ klog .V (2 ).Infof ("Updated kube apiserver CA bundle configmap %s/%s" , caBundleConfigMap .Namespace , caBundleConfigMap .Name )
482
+ return caBundleConfigMap , true , nil
411
483
}
412
- requiredConfigMap .Annotations [annotations .OpenShiftComponent ] = "kube-apiserver"
413
484
414
- return resourceapply . ApplyConfigMap ( ctx , client , recorder , requiredConfigMap )
485
+ return caBundleConfigMap , false , nil
415
486
}
416
487
417
488
func ensureKubeAPIServerTrustedCA (ctx context.Context , client coreclientv1.CoreV1Interface , recorder events.Recorder ) error {
0 commit comments