44 "context"
55 "encoding/base64"
66 "fmt"
7+ "reflect"
78 "strings"
89 "time"
910
@@ -20,12 +21,17 @@ import (
2021 "github.com/openshift/library-go/pkg/operator/resource/resourceread"
2122 "github.com/openshift/library-go/pkg/operator/v1helpers"
2223 corev1 "k8s.io/api/core/v1"
24+ apierrors "k8s.io/apimachinery/pkg/api/errors"
2325 "k8s.io/client-go/kubernetes"
2426 coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
2527 corev1listers "k8s.io/client-go/listers/core/v1"
2628)
2729
28- const workQueueKey = "key"
30+ const (
31+ workQueueKey = "key"
32+ kubeApiserverServerCA = "kube-apiserver-server-ca"
33+ nodeSystemAdminClient = "node-system-admin-client"
34+ )
2935
3036type NodeKubeconfigController struct {
3137 operatorClient v1helpers.StaticPodOperatorClient
@@ -40,24 +46,37 @@ func NewNodeKubeconfigController(
4046 operatorClient v1helpers.StaticPodOperatorClient ,
4147 kubeInformersForNamespaces v1helpers.KubeInformersForNamespaces ,
4248 kubeClient kubernetes.Interface ,
43- infrastuctureInformer configv1informers.InfrastructureInformer ,
49+ infrastructureInformer configv1informers.InfrastructureInformer ,
4450 eventRecorder events.Recorder ,
4551) factory.Controller {
4652 c := & NodeKubeconfigController {
4753 operatorClient : operatorClient ,
4854 kubeClient : kubeClient ,
4955 configMapLister : kubeInformersForNamespaces .ConfigMapLister (),
5056 secretLister : kubeInformersForNamespaces .SecretLister (),
51- infrastructureLister : infrastuctureInformer .Lister (),
52- }
53-
54- return factory .New ().WithInformers (
57+ infrastructureLister : infrastructureInformer .Lister (),
58+ }
59+
60+ return factory .New ().WithFilteredEventsInformers (
61+ func (obj interface {}) bool {
62+ if cm , ok := obj .(* corev1.ConfigMap ); ok {
63+ if cm .Namespace == operatorclient .OperatorNamespace && cm .Name == kubeApiserverServerCA {
64+ return true
65+ }
66+ return false
67+ }
68+ if secret , ok := obj .(* corev1.Secret ); ok {
69+ if secret .Namespace == operatorclient .OperatorNamespace && secret .Name == nodeSystemAdminClient {
70+ return true
71+ }
72+ return false
73+ }
74+ return true
75+ },
5576 operatorClient .Informer (),
56- kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
5777 kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
5878 kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().Secrets ().Informer (),
59- kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().Secrets ().Informer (),
60- infrastuctureInformer .Informer (),
79+ infrastructureInformer .Informer (),
6180 ).WithSync (c .sync ).WithSyncDegradedOnError (c .operatorClient ).ResyncEvery (5 * time .Minute ).ToController ("NodeKubeconfigController" , eventRecorder .WithComponentSuffix ("node-kubeconfig-controller" ))
6281}
6382
@@ -99,27 +118,27 @@ func (c NodeKubeconfigController) sync(ctx context.Context, syncContext factory.
99118func ensureNodeKubeconfigs (ctx context.Context , client coreclientv1.CoreV1Interface , secretLister corev1listers.SecretLister , configmapLister corev1listers.ConfigMapLister , infrastructureLister configv1listers.InfrastructureLister , recorder events.Recorder ) error {
100119 requiredSecret := resourceread .ReadSecretV1OrDie (bindata .MustAsset ("assets/kube-apiserver/node-kubeconfigs.yaml" ))
101120
102- systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get ("node-system-admin-client" )
121+ systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get (nodeSystemAdminClient )
103122 if err != nil {
104123 return err
105124 }
106125
107126 systemAdminClientCert := systemAdminCredsSecret .Data [corev1 .TLSCertKey ]
108127 if len (systemAdminClientCert ) == 0 {
109- return fmt .Errorf ("system:admin client certificate missing from secret %s/node-system-admin-client " , operatorclient .OperatorNamespace )
128+ return fmt .Errorf ("system:admin client certificate missing from secret %s/%s " , operatorclient .OperatorNamespace , nodeSystemAdminClient )
110129 }
111130 systemAdminClientKey := systemAdminCredsSecret .Data [corev1 .TLSPrivateKeyKey ]
112131 if len (systemAdminClientKey ) == 0 {
113- return fmt .Errorf ("system:admin client private key missing from secret %s/node-system-admin-client " , operatorclient .OperatorNamespace )
132+ return fmt .Errorf ("system:admin client private key missing from secret %s/%s " , operatorclient .OperatorNamespace , nodeSystemAdminClient )
114133 }
115134
116- servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get ("kube-apiserver-server-ca" )
135+ servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get (kubeApiserverServerCA )
117136 if err != nil {
118137 return err
119138 }
120139 servingCABundleData := servingCABundleCM .Data ["ca-bundle.crt" ]
121140 if len (servingCABundleData ) == 0 {
122- return fmt .Errorf ("serving CA bundle missing from configmap %s/kube-apiserver-server-ca " , operatorclient .TargetNamespace )
141+ return fmt .Errorf ("serving CA bundle missing from configmap %s/%s " , operatorclient .TargetNamespace , kubeApiserverServerCA )
123142 }
124143
125144 infrastructure , err := infrastructureLister .Get ("cluster" )
@@ -161,10 +180,15 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
161180 requiredSecret .Annotations [certrotation .CertificateNotAfterAnnotation ] = systemAdminCredsSecret .Annotations [certrotation .CertificateNotAfterAnnotation ]
162181 }
163182
164- _ , _ , err = resourceapply .ApplySecret (ctx , client , recorder , requiredSecret )
165- if err != nil {
166- return err
183+ actualSecret , err := secretLister .Secrets (requiredSecret .Namespace ).Get (requiredSecret .Name )
184+ if ! apierrors .IsNotFound (err ) {
185+ if err != nil {
186+ return err
187+ }
188+ if reflect .DeepEqual (actualSecret .Data , requiredSecret .Data ) {
189+ return nil
190+ }
167191 }
168-
169- return nil
192+ _ , _ , err = resourceapply . ApplySecret ( ctx , client , recorder , requiredSecret )
193+ return err
170194}
0 commit comments