4
4
"context"
5
5
"encoding/base64"
6
6
"fmt"
7
+ "reflect"
7
8
"strings"
8
9
"time"
9
10
@@ -20,12 +21,17 @@ import (
20
21
"github.com/openshift/library-go/pkg/operator/resource/resourceread"
21
22
"github.com/openshift/library-go/pkg/operator/v1helpers"
22
23
corev1 "k8s.io/api/core/v1"
24
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
23
25
"k8s.io/client-go/kubernetes"
24
26
coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
25
27
corev1listers "k8s.io/client-go/listers/core/v1"
26
28
)
27
29
28
- const workQueueKey = "key"
30
+ const (
31
+ workQueueKey = "key"
32
+ kubeApiserverServerCA = "kube-apiserver-server-ca"
33
+ nodeSystemAdminClient = "node-system-admin-client"
34
+ )
29
35
30
36
type NodeKubeconfigController struct {
31
37
operatorClient v1helpers.StaticPodOperatorClient
@@ -40,24 +46,37 @@ func NewNodeKubeconfigController(
40
46
operatorClient v1helpers.StaticPodOperatorClient ,
41
47
kubeInformersForNamespaces v1helpers.KubeInformersForNamespaces ,
42
48
kubeClient kubernetes.Interface ,
43
- infrastuctureInformer configv1informers.InfrastructureInformer ,
49
+ infrastructureInformer configv1informers.InfrastructureInformer ,
44
50
eventRecorder events.Recorder ,
45
51
) factory.Controller {
46
52
c := & NodeKubeconfigController {
47
53
operatorClient : operatorClient ,
48
54
kubeClient : kubeClient ,
49
55
configMapLister : kubeInformersForNamespaces .ConfigMapLister (),
50
56
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 .TargetNamespace && 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
+ },
55
76
operatorClient .Informer (),
56
- kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
57
77
kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().ConfigMaps ().Informer (),
58
78
kubeInformersForNamespaces .InformersFor (operatorclient .OperatorNamespace ).Core ().V1 ().Secrets ().Informer (),
59
- kubeInformersForNamespaces .InformersFor (operatorclient .TargetNamespace ).Core ().V1 ().Secrets ().Informer (),
60
- infrastuctureInformer .Informer (),
79
+ infrastructureInformer .Informer (),
61
80
).WithSync (c .sync ).WithSyncDegradedOnError (c .operatorClient ).ResyncEvery (5 * time .Minute ).ToController ("NodeKubeconfigController" , eventRecorder .WithComponentSuffix ("node-kubeconfig-controller" ))
62
81
}
63
82
@@ -99,27 +118,27 @@ func (c NodeKubeconfigController) sync(ctx context.Context, syncContext factory.
99
118
func ensureNodeKubeconfigs (ctx context.Context , client coreclientv1.CoreV1Interface , secretLister corev1listers.SecretLister , configmapLister corev1listers.ConfigMapLister , infrastructureLister configv1listers.InfrastructureLister , recorder events.Recorder ) error {
100
119
requiredSecret := resourceread .ReadSecretV1OrDie (bindata .MustAsset ("assets/kube-apiserver/node-kubeconfigs.yaml" ))
101
120
102
- systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get ("node-system-admin-client" )
121
+ systemAdminCredsSecret , err := secretLister .Secrets (operatorclient .OperatorNamespace ).Get (nodeSystemAdminClient )
103
122
if err != nil {
104
123
return err
105
124
}
106
125
107
126
systemAdminClientCert := systemAdminCredsSecret .Data [corev1 .TLSCertKey ]
108
127
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 )
110
129
}
111
130
systemAdminClientKey := systemAdminCredsSecret .Data [corev1 .TLSPrivateKeyKey ]
112
131
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 )
114
133
}
115
134
116
- servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get ("kube-apiserver-server-ca" )
135
+ servingCABundleCM , err := configmapLister .ConfigMaps (operatorclient .TargetNamespace ).Get (kubeApiserverServerCA )
117
136
if err != nil {
118
137
return err
119
138
}
120
139
servingCABundleData := servingCABundleCM .Data ["ca-bundle.crt" ]
121
140
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 )
123
142
}
124
143
125
144
infrastructure , err := infrastructureLister .Get ("cluster" )
@@ -161,10 +180,15 @@ func ensureNodeKubeconfigs(ctx context.Context, client coreclientv1.CoreV1Interf
161
180
requiredSecret .Annotations [certrotation .CertificateNotAfterAnnotation ] = systemAdminCredsSecret .Annotations [certrotation .CertificateNotAfterAnnotation ]
162
181
}
163
182
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 ) && reflect .DeepEqual (actualSecret .Annotations , requiredSecret .Annotations ) {
189
+ return nil
190
+ }
167
191
}
168
-
169
- return nil
192
+ _ , _ , err = resourceapply . ApplySecret ( ctx , client , recorder , requiredSecret )
193
+ return err
170
194
}
0 commit comments