@@ -19,10 +19,10 @@ import (
19
19
utilerrors "k8s.io/apimachinery/pkg/util/errors"
20
20
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
21
21
"k8s.io/client-go/informers"
22
+ k8sscheme "k8s.io/client-go/kubernetes/scheme"
22
23
"k8s.io/client-go/tools/cache"
23
24
"k8s.io/client-go/tools/record"
24
25
"k8s.io/client-go/util/workqueue"
25
- k8sscheme "k8s.io/client-go/kubernetes/scheme"
26
26
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
27
27
kagg "k8s.io/kube-aggregator/pkg/client/informers/externalversions"
28
28
@@ -55,25 +55,27 @@ var timeNow = func() metav1.Time { return metav1.NewTime(time.Now().UTC()) }
55
55
type Operator struct {
56
56
queueinformer.Operator
57
57
58
- clock utilclock.Clock
59
- logger * logrus.Logger
60
- opClient operatorclient.ClientInterface
61
- client versioned.Interface
62
- lister operatorlister.OperatorLister
63
- ogQueueSet * queueinformer.ResourceQueueSet
64
- csvQueueSet * queueinformer.ResourceQueueSet
65
- csvCopyQueueSet * queueinformer.ResourceQueueSet
66
- csvGCQueueSet * queueinformer.ResourceQueueSet
67
- apiServiceQueue workqueue.RateLimitingInterface
68
- csvIndexers map [string ]cache.Indexer
69
- recorder record.EventRecorder
70
- resolver install.StrategyResolverInterface
71
- apiReconciler resolver.APIIntersectionReconciler
72
- apiLabeler labeler.Labeler
73
- csvSetGenerator csvutility.SetGenerator
74
- csvReplaceFinder csvutility.ReplaceFinder
75
- csvNotification csvutility.WatchNotification
76
- serviceAccountSyncer * scoped.UserDefinedServiceAccountSyncer
58
+ clock utilclock.Clock
59
+ logger * logrus.Logger
60
+ opClient operatorclient.ClientInterface
61
+ client versioned.Interface
62
+ lister operatorlister.OperatorLister
63
+ ogQueueSet * queueinformer.ResourceQueueSet
64
+ csvQueueSet * queueinformer.ResourceQueueSet
65
+ csvCopyQueueSet * queueinformer.ResourceQueueSet
66
+ csvGCQueueSet * queueinformer.ResourceQueueSet
67
+ apiServiceQueue workqueue.RateLimitingInterface
68
+ csvIndexers map [string ]cache.Indexer
69
+ recorder record.EventRecorder
70
+ resolver install.StrategyResolverInterface
71
+ apiReconciler resolver.APIIntersectionReconciler
72
+ apiLabeler labeler.Labeler
73
+ csvSetGenerator csvutility.SetGenerator
74
+ csvReplaceFinder csvutility.ReplaceFinder
75
+ csvNotification csvutility.WatchNotification
76
+ serviceAccountSyncer * scoped.UserDefinedServiceAccountSyncer
77
+ clientAttenuator * scoped.ClientAttenuator
78
+ serviceAccountQuerier * scoped.UserDefinedServiceAccountQuerier
77
79
}
78
80
79
81
func NewOperator (ctx context.Context , options ... OperatorOption ) (* Operator , error ) {
@@ -106,25 +108,27 @@ func newOperatorWithConfig(ctx context.Context, config *operatorConfig) (*Operat
106
108
}
107
109
108
110
op := & Operator {
109
- Operator : queueOperator ,
110
- clock : config .clock ,
111
- logger : config .logger ,
112
- opClient : config .operatorClient ,
113
- client : config .externalClient ,
114
- ogQueueSet : queueinformer .NewEmptyResourceQueueSet (),
115
- csvQueueSet : queueinformer .NewEmptyResourceQueueSet (),
116
- csvCopyQueueSet : queueinformer .NewEmptyResourceQueueSet (),
117
- csvGCQueueSet : queueinformer .NewEmptyResourceQueueSet (),
118
- apiServiceQueue : workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "apiservice" ),
119
- resolver : config .strategyResolver ,
120
- apiReconciler : config .apiReconciler ,
121
- lister : lister ,
122
- recorder : eventRecorder ,
123
- apiLabeler : config .apiLabeler ,
124
- csvIndexers : map [string ]cache.Indexer {},
125
- csvSetGenerator : csvutility .NewSetGenerator (config .logger , lister ),
126
- csvReplaceFinder : csvutility .NewReplaceFinder (config .logger , config .externalClient ),
127
- serviceAccountSyncer : scoped .NewUserDefinedServiceAccountSyncer (config .logger , scheme , config .operatorClient , config .externalClient ),
111
+ Operator : queueOperator ,
112
+ clock : config .clock ,
113
+ logger : config .logger ,
114
+ opClient : config .operatorClient ,
115
+ client : config .externalClient ,
116
+ ogQueueSet : queueinformer .NewEmptyResourceQueueSet (),
117
+ csvQueueSet : queueinformer .NewEmptyResourceQueueSet (),
118
+ csvCopyQueueSet : queueinformer .NewEmptyResourceQueueSet (),
119
+ csvGCQueueSet : queueinformer .NewEmptyResourceQueueSet (),
120
+ apiServiceQueue : workqueue .NewNamedRateLimitingQueue (workqueue .DefaultControllerRateLimiter (), "apiservice" ),
121
+ resolver : config .strategyResolver ,
122
+ apiReconciler : config .apiReconciler ,
123
+ lister : lister ,
124
+ recorder : eventRecorder ,
125
+ apiLabeler : config .apiLabeler ,
126
+ csvIndexers : map [string ]cache.Indexer {},
127
+ csvSetGenerator : csvutility .NewSetGenerator (config .logger , lister ),
128
+ csvReplaceFinder : csvutility .NewReplaceFinder (config .logger , config .externalClient ),
129
+ serviceAccountSyncer : scoped .NewUserDefinedServiceAccountSyncer (config .logger , scheme , config .operatorClient , config .externalClient ),
130
+ clientAttenuator : scoped .NewClientAttenuator (config .logger , config .restConfig , config .operatorClient , config .externalClient ),
131
+ serviceAccountQuerier : scoped .NewUserDefinedServiceAccountQuerier (config .logger , config .externalClient ),
128
132
}
129
133
130
134
// Set up syncing for namespace-scoped resources
@@ -1326,8 +1330,18 @@ func (a *Operator) parseStrategiesAndUpdateStatus(csv *v1alpha1.ClusterServiceVe
1326
1330
}
1327
1331
}
1328
1332
1333
+ // If an admin has specified a service account to the operator group
1334
+ // associated with the namespace then we should use a scoped client that is
1335
+ // bound to the service account.
1336
+ querierFunc := a .serviceAccountQuerier .NamespaceQuerier (csv .GetNamespace ())
1337
+ kubeclient , err := a .clientAttenuator .AttenuateOperatorClient (querierFunc )
1338
+ if err != nil {
1339
+ a .logger .Errorf ("failed to get a client for operator deployment- %v" , err )
1340
+ return nil , nil
1341
+ }
1342
+
1329
1343
strName := strategy .GetStrategyName ()
1330
- installer := a .resolver .InstallerForStrategy (strName , a . opClient , a .lister , csv , csv .Annotations , previousStrategy )
1344
+ installer := a .resolver .InstallerForStrategy (strName , kubeclient , a .lister , csv , csv .Annotations , previousStrategy )
1331
1345
return installer , strategy
1332
1346
}
1333
1347
0 commit comments