@@ -29,7 +29,6 @@ import (
29
29
"golang.org/x/time/rate"
30
30
"google.golang.org/api/option"
31
31
"gopkg.in/gcfg.v1"
32
- "k8s.io/client-go/tools/cache"
33
32
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
34
33
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute/tenancy"
35
34
@@ -38,6 +37,7 @@ import (
38
37
"golang.org/x/oauth2"
39
38
computebeta "google.golang.org/api/compute/v0.beta"
40
39
"google.golang.org/api/compute/v1"
40
+ computev1 "google.golang.org/api/compute/v1"
41
41
"google.golang.org/api/googleapi"
42
42
"k8s.io/apimachinery/pkg/util/wait"
43
43
"k8s.io/klog/v2"
@@ -156,6 +156,13 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
156
156
return nil , err
157
157
}
158
158
159
+ // token, err := tokenSource.Token()
160
+ // if err != nil {
161
+ // klog.Errorf("error getting initial token.: %v", err)
162
+ // } else {
163
+ // klog.Infof("test token success: %+v", token)
164
+ // }
165
+
159
166
svc , err := createCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
160
167
if err != nil {
161
168
return nil , err
@@ -184,65 +191,55 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
184
191
listInstancesConfig : listInstancesConfig ,
185
192
// GCP has a rate limit of 600 requests per minute, restricting
186
193
// here to 8 requests per second.
187
- tagsRateLimiter : common .NewLimiter (gcpTagsRequestRateLimit , gcpTagsRequestTokenBucketSize , true ),
194
+ tagsRateLimiter : common .NewLimiter (gcpTagsRequestRateLimit , gcpTagsRequestTokenBucketSize , true ),
195
+ tenantServiceMap : make (map [string ]* compute.Service ),
188
196
}
189
197
190
198
if multiTenancyEnabled {
191
199
klog .Info ("Setting up multitenancy" )
192
- // Setup informant for tenant CR to automatically create tenant specific clients with tenant identities
193
200
ti , err := tenancy .NewTenantsInformer (multiTenancyEnabled )
194
201
if err != nil {
195
202
return nil , fmt .Errorf ("failed initializing tenant informer: %w" , err )
196
203
}
197
204
cp .TenantInformer = ti
198
- cp .tenantServiceMap = map [string ]* compute.Service {}
199
- cp .TenantInformer .AddEventHandler (cache.ResourceEventHandlerFuncs {
200
- AddFunc : func (obj any ) {
201
- // Handle tenant creation
202
- klog .Infof ("Tenant %s created" , obj )
203
-
204
- tenantMeta , err := tenancy .GetMetadataFromTenantCR (obj )
205
- if err != nil {
206
- klog .Errorf ("error while extracting tenant metadata: %v" , err )
207
- }
208
-
209
- tenantServiceMutex .Lock ()
210
- defer tenantServiceMutex .Unlock ()
211
-
212
- if _ , ok := cp .tenantServiceMap [tenantMeta .ProjectNumber ]; ok {
213
- klog .Infof ("Tenant GCE client already exists, skipping GCE client instantiation for tenant(%s) with project number(%s)" , tenantMeta .TenantName , tenantMeta .ProjectNumber )
214
- return
215
- }
216
-
217
- region , err := common .GetRegionFromZones ([]string {zone })
218
- if err != nil {
219
- klog .Errorf ("error getting region from zone(%s): %v" , zone , err )
220
- return
221
- }
222
- tokenSource , err := NewTenantTokenSource (tenantMeta , region , configFile .Global .TokenURL , configFile .Global .TokenBody )
223
- if err != nil {
224
- klog .Errorf ("error during tenant token generation: %v" , err .Error ())
225
- }
226
-
227
- svc , err := createCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
228
- if err != nil {
229
- klog .Errorf ("error while creating compute service with tenant identity: %v" , err )
230
- return
231
- }
232
- cp .tenantServiceMap [tenantMeta .ProjectNumber ] = svc
233
- },
234
- UpdateFunc : func (oldObj , newObj any ) {},
235
- DeleteFunc : func (obj any ) {
236
- klog .Infof ("Tenant %s deleted" , obj )
237
- tenantMeta , err := tenancy .GetMetadataFromTenantCR (obj )
238
- if err != nil {
239
- klog .Errorf ("error while extracting teantn metadata: %v" , err )
240
- }
241
- tenantServiceMutex .Lock ()
242
- defer tenantServiceMutex .Unlock ()
243
- delete (cp .tenantServiceMap , tenantMeta .ProjectNumber )
244
- },
245
- })
205
+ addTenantCallback := func (tenantMeta * tenancy.Metadata , projectZone string ) (* computev1.Service , error ) {
206
+ klog .Infof ("Executing AddFunc callback for tenant: %s (Project: %s)" , tenantMeta .TenantName , tenantMeta .ProjectNumber )
207
+
208
+ region , err := common .GetRegionFromZones ([]string {zone })
209
+ if err != nil {
210
+ klog .Errorf ("Error getting region from zone(%s) for tenant %s: %v" , zone , tenantMeta .TenantName , err )
211
+ return nil , fmt .Errorf ("error getting region from zone(%s): %w" , zone , err )
212
+ }
213
+
214
+ tenantTokenSource , err := NewTenantTokenSource (tenantMeta , region , configFile .Global .TokenURL , configFile .Global .TokenBody )
215
+ if err != nil {
216
+ klog .Errorf ("Error during tenant token source generation for %s: %v" , tenantMeta .TenantName , err .Error ())
217
+ return nil , fmt .Errorf ("error during tenant token source generation: %w" , err )
218
+ }
219
+
220
+ tenantComputeService , err := createCloudService (ctx , vendorVersion , tenantTokenSource , computeEndpoint , computeEnvironment )
221
+ if err != nil {
222
+ klog .Errorf ("Error while creating compute service with tenant identity for %s: %v" , tenantMeta .TenantName , err )
223
+ return nil , fmt .Errorf ("error while creating compute service with tenant identity: %w" , err )
224
+ }
225
+ klog .Infof ("Successfully created compute service for tenant %s (Project: %s)" , tenantMeta .TenantName , tenantMeta .ProjectNumber )
226
+ return tenantComputeService , nil
227
+ }
228
+
229
+ lifecycleHandler := tenancy.TenantLifecycleHandler {
230
+ AddFunc : addTenantCallback ,
231
+ }
232
+
233
+ err = tenancy .RegisterTenantEventHandlers (
234
+ cp .TenantInformer ,
235
+ lifecycleHandler ,
236
+ zone ,
237
+ cp .tenantServiceMap ,
238
+ & tenantServiceMutex ,
239
+ )
240
+ if err != nil {
241
+ return nil , fmt .Errorf ("failed to register tenant event handlers: %w" , err )
242
+ }
246
243
}
247
244
248
245
return cp , nil
0 commit comments