@@ -117,7 +117,7 @@ type GCECompute interface {
117
117
// Regional Disk Methods
118
118
GetReplicaZoneURI (project string , zone string ) string
119
119
// Instance Methods
120
- GetInstanceOrError (ctx context.Context , instanceZone , instanceName string ) (* computev1.Instance , error )
120
+ GetInstanceOrError (ctx context.Context , project , instanceZone , instanceName string ) (* computev1.Instance , error )
121
121
// Zone Methods
122
122
ListZones (ctx context.Context , region string ) ([]string , error )
123
123
ListSnapshots (ctx context.Context , filter string ) ([]* computev1.Snapshot , string , error )
@@ -160,40 +160,67 @@ func (cloud *CloudProvider) listDisksInternal(ctx context.Context, fields []goog
160
160
if err != nil {
161
161
return nil , "" , err
162
162
}
163
- items := []* computev1.Disk {}
163
+ disks := []* computev1.Disk {}
164
164
165
- // listing out regional disks in the region
166
- rlCall := cloud .service .RegionDisks .List (cloud .project , region )
165
+ // listing out regional disks in the region for each project
166
+ for p , s := range cloud .tenantServiceMap {
167
+ klog .Infof ("Getting regional disks for project: %s" , p )
168
+ rDisks , err := listRegionalDisksForProject (s , p , region , fields , filter )
169
+ if err != nil {
170
+ return nil , "" , err
171
+ }
172
+ disks = append (disks , rDisks ... )
173
+ }
174
+
175
+ // listing out zonal disks in all zones of the region for each project
176
+ for p , s := range cloud .tenantServiceMap {
177
+ klog .Infof ("Getting zonal disks for project: %s" , p )
178
+ zDisks , err := listZonalDisksForProject (s , p , zones , fields , filter )
179
+ if err != nil {
180
+ return nil , "" , err
181
+ }
182
+ disks = append (disks , zDisks ... )
183
+ }
184
+
185
+ return disks , "" , nil
186
+ }
187
+
188
+ func listRegionalDisksForProject (service * computev1.Service , project string , region string , fields []googleapi.Field , filter string ) ([]* computev1.Disk , error ) {
189
+ items := []* computev1.Disk {}
190
+ rlCall := service .RegionDisks .List (project , region )
167
191
rlCall .Fields (fields ... )
168
192
rlCall .Filter (filter )
169
193
nextPageToken := "pageToken"
170
194
for nextPageToken != "" {
171
195
rDiskList , err := rlCall .Do ()
172
196
if err != nil {
173
- return nil , "" , err
197
+ return nil , err
174
198
}
175
199
items = append (items , rDiskList .Items ... )
176
200
nextPageToken = rDiskList .NextPageToken
177
201
rlCall .PageToken (nextPageToken )
178
202
}
203
+ return items , nil
204
+ }
179
205
180
- // listing out zonal disks in all zones of the region
206
+ func listZonalDisksForProject (service * computev1.Service , project string , zones []string , fields []googleapi.Field , filter string ) ([]* computev1.Disk , error ) {
207
+ items := []* computev1.Disk {}
181
208
for _ , zone := range zones {
182
- lCall := cloud . service .Disks .List (cloud . project , zone )
209
+ lCall := service .Disks .List (project , zone )
183
210
lCall .Fields (fields ... )
184
211
lCall .Filter (filter )
185
212
nextPageToken := "pageToken"
186
213
for nextPageToken != "" {
187
214
diskList , err := lCall .Do ()
188
215
if err != nil {
189
- return nil , "" , err
216
+ return nil , err
190
217
}
191
218
items = append (items , diskList .Items ... )
192
219
nextPageToken = diskList .NextPageToken
193
220
lCall .PageToken (nextPageToken )
194
221
}
195
222
}
196
- return items , "" , nil
223
+ return items , nil
197
224
}
198
225
199
226
// ListInstances lists instances based on maxEntries and pageToken for the project and region
@@ -210,8 +237,22 @@ func (cloud *CloudProvider) ListInstances(ctx context.Context, fields []googleap
210
237
}
211
238
items := []* computev1.Instance {}
212
239
240
+ for p , s := range cloud .tenantServiceMap {
241
+ instances , err := cloud .listInstancesForProject (s , p , zones , fields )
242
+ if err != nil {
243
+ return nil , "" , err
244
+ }
245
+ items = append (items , instances ... )
246
+ }
247
+
248
+ return items , "" , nil
249
+ }
250
+
251
+ func (cloud * CloudProvider ) listInstancesForProject (service * computev1.Service , project string , zones []string , fields []googleapi.Field ) ([]* computev1.Instance , error ) {
252
+ items := []* computev1.Instance {}
253
+
213
254
for _ , zone := range zones {
214
- lCall := cloud . service .Instances .List (cloud . project , zone )
255
+ lCall := service .Instances .List (project , zone )
215
256
for _ , filter := range cloud .listInstancesConfig .Filters {
216
257
lCall = lCall .Filter (filter )
217
258
}
@@ -220,15 +261,14 @@ func (cloud *CloudProvider) ListInstances(ctx context.Context, fields []googleap
220
261
for nextPageToken != "" {
221
262
instancesList , err := lCall .Do ()
222
263
if err != nil {
223
- return nil , "" , err
264
+ return nil , err
224
265
}
225
266
items = append (items , instancesList .Items ... )
226
267
nextPageToken = instancesList .NextPageToken
227
268
lCall .PageToken (nextPageToken )
228
269
}
229
270
}
230
-
231
- return items , "" , nil
271
+ return items , nil
232
272
}
233
273
234
274
// RepairUnderspecifiedVolumeKey will query the cloud provider and check each zone for the disk specified
@@ -857,7 +897,11 @@ func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volK
857
897
ForceAttach : forceAttach ,
858
898
}
859
899
860
- op , err := cloud .service .Instances .AttachDisk (project , instanceZone , instanceName , attachedDiskV1 ).Context (ctx ).ForceAttach (forceAttach ).Do ()
900
+ service := cloud .service
901
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
902
+ service = cloud .tenantServiceMap [project ]
903
+ }
904
+ op , err := service .Instances .AttachDisk (project , instanceZone , instanceName , attachedDiskV1 ).Context (ctx ).ForceAttach (forceAttach ).Do ()
861
905
if err != nil {
862
906
return fmt .Errorf ("failed cloud service attach disk call: %w" , err )
863
907
}
@@ -872,7 +916,11 @@ func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volK
872
916
873
917
func (cloud * CloudProvider ) DetachDisk (ctx context.Context , project , deviceName , instanceZone , instanceName string ) error {
874
918
klog .V (5 ).Infof ("Detaching disk %v from %v" , deviceName , instanceName )
875
- op , err := cloud .service .Instances .DetachDisk (project , instanceZone , instanceName , deviceName ).Context (ctx ).Do ()
919
+ service := cloud .service
920
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
921
+ service = cloud .tenantServiceMap [project ]
922
+ }
923
+ op , err := service .Instances .DetachDisk (project , instanceZone , instanceName , deviceName ).Context (ctx ).Do ()
876
924
if err != nil {
877
925
return err
878
926
}
@@ -1041,7 +1089,7 @@ func (cloud *CloudProvider) waitForAttachOnInstance(ctx context.Context, project
1041
1089
start := time .Now ()
1042
1090
return wait .ExponentialBackoff (AttachDiskBackoff , func () (bool , error ) {
1043
1091
klog .V (6 ).Infof ("Polling instances.get for attach of disk %v to instance %v to complete for %v" , volKey .Name , instanceName , time .Since (start ))
1044
- instance , err := cloud .GetInstanceOrError (ctx , instanceZone , instanceName )
1092
+ instance , err := cloud .GetInstanceOrError (ctx , project , instanceZone , instanceName )
1045
1093
if err != nil {
1046
1094
return false , fmt .Errorf ("GetInstance failed to get instance: %w" , err )
1047
1095
}
@@ -1145,10 +1193,13 @@ func opIsDone(op *computev1.Operation) (bool, error) {
1145
1193
return true , nil
1146
1194
}
1147
1195
1148
- func (cloud * CloudProvider ) GetInstanceOrError (ctx context.Context , instanceZone , instanceName string ) (* computev1.Instance , error ) {
1196
+ func (cloud * CloudProvider ) GetInstanceOrError (ctx context.Context , project , instanceZone , instanceName string ) (* computev1.Instance , error ) {
1149
1197
klog .V (5 ).Infof ("Getting instance %v from zone %v" , instanceName , instanceZone )
1150
- project := cloud .project
1151
- instance , err := cloud .service .Instances .Get (project , instanceZone , instanceName ).Do ()
1198
+ service := cloud .service
1199
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
1200
+ service = cloud .tenantServiceMap [project ]
1201
+ }
1202
+ instance , err := service .Instances .Get (project , instanceZone , instanceName ).Do ()
1152
1203
if err != nil {
1153
1204
return nil , err
1154
1205
}
0 commit comments