44 "context"
55 "encoding/base64"
66 "fmt"
7+ "reflect"
78 "strings"
89 "time"
910
@@ -16,16 +17,20 @@ import (
1617 "github.com/openshift/library-go/pkg/controller/factory"
1718 "github.com/openshift/library-go/pkg/operator/certrotation"
1819 "github.com/openshift/library-go/pkg/operator/events"
19- "github.com/openshift/library-go/pkg/operator/resource/resourceapply"
2020 "github.com/openshift/library-go/pkg/operator/resource/resourceread"
2121 "github.com/openshift/library-go/pkg/operator/v1helpers"
2222 corev1 "k8s.io/api/core/v1"
23+ apierrors "k8s.io/apimachinery/pkg/api/errors"
2324 "k8s.io/client-go/kubernetes"
2425 coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
2526 corev1listers "k8s.io/client-go/listers/core/v1"
2627)
2728
28- const workQueueKey = "key"
29+ const (
30+ workQueueKey = "key"
31+ kubeApiserverServerCA = "kube-apiserver-server-ca"
32+ nodeSystemAdminClient = "node-system-admin-client"
33+ )
2934
3035type NodeKubeconfigController struct {
3136 operatorClient v1helpers.StaticPodOperatorClient
@@ -40,24 +45,37 @@ func NewNodeKubeconfigController(
4045 operatorClient v1helpers.StaticPodOperatorClient ,
4146 kubeInformersForNamespaces v1helpers.KubeInformersForNamespaces ,
4247 kubeClient kubernetes.Interface ,
43- infrastuctureInformer configv1informers.InfrastructureInformer ,
48+ infrastructureInformer configv1informers.InfrastructureInformer ,
4449 eventRecorder events.Recorder ,
4550) factory.Controller {
4651 c := & NodeKubeconfigController {
4752 operatorClient : operatorClient ,
4853 kubeClient : kubeClient ,
4954 configMapLister : kubeInformersForNamespaces .ConfigMapLister (),
5055 secretLister : kubeInformersForNamespaces .SecretLister (),
51- infrastructureLister : infrastuctureInformer .Lister (),
52- }
53-
54- return factory .New ().WithInformers (
56+ infrastructureLister : infrastructureInformer .Lister (),
57+ }
58+
59+ return factory .New ().WithFilteredEventsInformers (
60+ func (obj interface {}) bool {
61+ if cm , ok := obj .(* corev1.ConfigMap ); ok {
62+ if cm .Namespace == operatorclient .OperatorNamespace && cm .Name == kubeApiserverServerCA {
63+ return true
64+ }
65+ return false
66+ }
67+ if secret , ok := obj .(* corev1.Secret ); ok {
68+ if secret .Namespace == operatorclient .OperatorNamespace && secret .Name == nodeSystemAdminClient {
69+ return true
70+ }
71+ return false
72+ }
73+ return true
74+ },
5575 operatorClient .Informer (),
56- kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
5776 kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
5877 kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().Secrets ().Informer (),
59- kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().Secrets ().Informer (),
60- infrastuctureInformer .Informer (),
78+ infrastructureInformer .Informer (),
6179 ).WithSync (c .sync ).WithSyncDegradedOnError (c .operatorClient ).ResyncEvery (5 * time .Minute ).ToController ("NodeKubeconfigController" , eventRecorder .WithComponentSuffix ("node-kubeconfig-controller" ))
6280}
6381
@@ -99,27 +117,27 @@ func (c NodeKubeconfigController) sync(ctx context.Context, syncContext factory.
99117func ensureNodeKubeconfigs (ctx context.Context , client coreclientv1.CoreV1Interface , secretLister corev1listers.SecretLister , configmapLister corev1listers.ConfigMapLister , infrastructureLister configv1listers.InfrastructureLister , recorder events.Recorder ) error {
100118 requiredSecret := resourceread .ReadSecretV1OrDie (bindata .MustAsset ("assets/kube-apiserver/node-kubeconfigs.yaml" ))
101119
102- systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get ("node-system-admin-client" )
120+ systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get (nodeSystemAdminClient )
103121 if err != nil {
104122 return err
105123 }
106124
107125 systemAdminClientCert := systemAdminCredsSecret .Data [corev1 .TLSCertKey ]
108126 if len (systemAdminClientCert ) == 0 {
109- return fmt .Errorf ("system:admin client certificate missing from secret %s/node-system-admin-client " , operatorclient .OperatorNamespace )
127+ return fmt .Errorf ("system:admin client certificate missing from secret %s/%s " , operatorclient .OperatorNamespace , nodeSystemAdminClient )
110128 }
111129 systemAdminClientKey := systemAdminCredsSecret .Data [corev1 .TLSPrivateKeyKey ]
112130 if len (systemAdminClientKey ) == 0 {
113- return fmt .Errorf ("system:admin client private key missing from secret %s/node-system-admin-client " , operatorclient .OperatorNamespace )
131+ return fmt .Errorf ("system:admin client private key missing from secret %s/%s " , operatorclient .OperatorNamespace , nodeSystemAdminClient )
114132 }
115133
116- servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get ("kube-apiserver-server-ca" )
134+ servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get (kubeApiserverServerCA )
117135 if err != nil {
118136 return err
119137 }
120138 servingCABundleData := servingCABundleCM .Data ["ca-bundle.crt" ]
121139 if len (servingCABundleData ) == 0 {
122- return fmt .Errorf ("serving CA bundle missing from configmap %s/kube-apiserver-server-ca " , operatorclient .TargetNamespace )
140+ return fmt .Errorf ("serving CA bundle missing from configmap %s/%s " , operatorclient .TargetNamespace , kubeApiserverServerCA )
123141 }
124142
125143 infrastructure , err := infrastructureLister .Get ("cluster" )
@@ -161,7 +179,16 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
161179 requiredSecret .Annotations [certrotation .CertificateNotAfterAnnotation ] = systemAdminCredsSecret .Annotations [certrotation .CertificateNotAfterAnnotation ]
162180 }
163181
164- _ , _ , err = resourceapply .ApplySecret (ctx , client , recorder , requiredSecret )
182+ actualSecret , err := secretLister .Secrets (requiredSecret .Namespace ).Get (requiredSecret .Name )
183+ if ! apierrors .IsNotFound (err ) {
184+ if err != nil {
185+ return err
186+ }
187+ if reflect .DeepEqual (actualSecret .Data , requiredSecret .Data ) {
188+ return nil
189+ }
190+ }
191+
165192 if err != nil {
166193 return err
167194 }
0 commit comments