@@ -29,7 +29,6 @@ import (
2929 "golang.org/x/time/rate"
3030 "google.golang.org/api/option"
3131 "gopkg.in/gcfg.v1"
32- "k8s.io/client-go/tools/cache"
3332 "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
3433 "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute/tenancy"
3534
@@ -38,6 +37,7 @@ import (
3837 "golang.org/x/oauth2"
3938 computebeta "google.golang.org/api/compute/v0.beta"
4039 "google.golang.org/api/compute/v1"
40+ computev1 "google.golang.org/api/compute/v1"
4141 "google.golang.org/api/googleapi"
4242 "k8s.io/apimachinery/pkg/util/wait"
4343 "k8s.io/klog/v2"
@@ -156,6 +156,13 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
156156 return nil , err
157157 }
158158
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+
159166 svc , err := createCloudService (ctx , vendorVersion , tokenSource , computeEndpoint , computeEnvironment )
160167 if err != nil {
161168 return nil , err
@@ -184,65 +191,55 @@ func CreateCloudProvider(ctx context.Context, vendorVersion string, configPath s
184191 listInstancesConfig : listInstancesConfig ,
185192 // GCP has a rate limit of 600 requests per minute, restricting
186193 // 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 ),
188196 }
189197
190198 if multiTenancyEnabled {
191199 klog .Info ("Setting up multitenancy" )
192- // Setup informant for tenant CR to automatically create tenant specific clients with tenant identities
193200 ti , err := tenancy .NewTenantsInformer (multiTenancyEnabled )
194201 if err != nil {
195202 return nil , fmt .Errorf ("failed initializing tenant informer: %w" , err )
196203 }
197204 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+ }
246243 }
247244
248245 return cp , nil
0 commit comments