@@ -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,79 @@ 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
+
165
+ klog .Infof ("Getting regional disks for project: %s" , cloud .project )
166
+ rDisks , err := listRegionalDisksForProject (cloud .service , cloud .project , region , fields , filter )
167
+ if err != nil {
168
+ return nil , "" , err
169
+ }
170
+ disks = append (disks , rDisks ... )
171
+ // listing out regional disks in the region for each tenant project
172
+ for p , s := range cloud .tenantServiceMap {
173
+ klog .Infof ("Getting regional disks for tenant project: %s" , p )
174
+ rDisks , err := listRegionalDisksForProject (s , p , region , fields , filter )
175
+ if err != nil {
176
+ return nil , "" , err
177
+ }
178
+ disks = append (disks , rDisks ... )
179
+ }
180
+
181
+ klog .Infof ("Getting zonal disks for project: %s" , cloud .project )
182
+ zDisks , err := listZonalDisksForProject (cloud .service , cloud .project , zones , fields , filter )
183
+ if err != nil {
184
+ return nil , "" , err
185
+ }
186
+ disks = append (disks , zDisks ... )
187
+ // listing out zonal disks in all zones of the region for each tenant project
188
+ for p , s := range cloud .tenantServiceMap {
189
+ klog .Infof ("Getting zonal disks for tenant project: %s" , p )
190
+ zDisks , err := listZonalDisksForProject (s , p , zones , fields , filter )
191
+ if err != nil {
192
+ return nil , "" , err
193
+ }
194
+ disks = append (disks , zDisks ... )
195
+ }
164
196
165
- // listing out regional disks in the region
166
- rlCall := cloud .service .RegionDisks .List (cloud .project , region )
197
+ return disks , "" , nil
198
+ }
199
+
200
+ func listRegionalDisksForProject (service * computev1.Service , project string , region string , fields []googleapi.Field , filter string ) ([]* computev1.Disk , error ) {
201
+ items := []* computev1.Disk {}
202
+ rlCall := service .RegionDisks .List (project , region )
167
203
rlCall .Fields (fields ... )
168
204
rlCall .Filter (filter )
169
205
nextPageToken := "pageToken"
170
206
for nextPageToken != "" {
171
207
rDiskList , err := rlCall .Do ()
172
208
if err != nil {
173
- return nil , "" , err
209
+ return nil , err
174
210
}
175
211
items = append (items , rDiskList .Items ... )
176
212
nextPageToken = rDiskList .NextPageToken
177
213
rlCall .PageToken (nextPageToken )
178
214
}
215
+ return items , nil
216
+ }
179
217
180
- // listing out zonal disks in all zones of the region
218
+ func listZonalDisksForProject (service * computev1.Service , project string , zones []string , fields []googleapi.Field , filter string ) ([]* computev1.Disk , error ) {
219
+ items := []* computev1.Disk {}
181
220
for _ , zone := range zones {
182
- lCall := cloud . service .Disks .List (cloud . project , zone )
221
+ lCall := service .Disks .List (project , zone )
183
222
lCall .Fields (fields ... )
184
223
lCall .Filter (filter )
185
224
nextPageToken := "pageToken"
186
225
for nextPageToken != "" {
187
226
diskList , err := lCall .Do ()
188
227
if err != nil {
189
- return nil , "" , err
228
+ return nil , err
190
229
}
191
230
items = append (items , diskList .Items ... )
192
231
nextPageToken = diskList .NextPageToken
193
232
lCall .PageToken (nextPageToken )
194
233
}
195
234
}
196
- return items , "" , nil
235
+ return items , nil
197
236
}
198
237
199
238
// ListInstances lists instances based on maxEntries and pageToken for the project and region
@@ -209,9 +248,28 @@ func (cloud *CloudProvider) ListInstances(ctx context.Context, fields []googleap
209
248
return nil , "" , err
210
249
}
211
250
items := []* computev1.Instance {}
251
+ instances , err := cloud .listInstancesForProject (cloud .service , cloud .project , zones , fields )
252
+ if err != nil {
253
+ return nil , "" , err
254
+ }
255
+ items = append (items , instances ... )
256
+
257
+ for p , s := range cloud .tenantServiceMap {
258
+ instances , err := cloud .listInstancesForProject (s , p , zones , fields )
259
+ if err != nil {
260
+ return nil , "" , err
261
+ }
262
+ items = append (items , instances ... )
263
+ }
264
+
265
+ return items , "" , nil
266
+ }
267
+
268
+ func (cloud * CloudProvider ) listInstancesForProject (service * computev1.Service , project string , zones []string , fields []googleapi.Field ) ([]* computev1.Instance , error ) {
269
+ items := []* computev1.Instance {}
212
270
213
271
for _ , zone := range zones {
214
- lCall := cloud . service .Instances .List (cloud . project , zone )
272
+ lCall := service .Instances .List (project , zone )
215
273
for _ , filter := range cloud .listInstancesConfig .Filters {
216
274
lCall = lCall .Filter (filter )
217
275
}
@@ -220,15 +278,14 @@ func (cloud *CloudProvider) ListInstances(ctx context.Context, fields []googleap
220
278
for nextPageToken != "" {
221
279
instancesList , err := lCall .Do ()
222
280
if err != nil {
223
- return nil , "" , err
281
+ return nil , err
224
282
}
225
283
items = append (items , instancesList .Items ... )
226
284
nextPageToken = instancesList .NextPageToken
227
285
lCall .PageToken (nextPageToken )
228
286
}
229
287
}
230
-
231
- return items , "" , nil
288
+ return items , nil
232
289
}
233
290
234
291
// RepairUnderspecifiedVolumeKey will query the cloud provider and check each zone for the disk specified
@@ -857,7 +914,11 @@ func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volK
857
914
ForceAttach : forceAttach ,
858
915
}
859
916
860
- op , err := cloud .service .Instances .AttachDisk (project , instanceZone , instanceName , attachedDiskV1 ).Context (ctx ).ForceAttach (forceAttach ).Do ()
917
+ service := cloud .service
918
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
919
+ service = cloud .tenantServiceMap [project ]
920
+ }
921
+ op , err := service .Instances .AttachDisk (project , instanceZone , instanceName , attachedDiskV1 ).Context (ctx ).ForceAttach (forceAttach ).Do ()
861
922
if err != nil {
862
923
return fmt .Errorf ("failed cloud service attach disk call: %w" , err )
863
924
}
@@ -872,7 +933,11 @@ func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volK
872
933
873
934
func (cloud * CloudProvider ) DetachDisk (ctx context.Context , project , deviceName , instanceZone , instanceName string ) error {
874
935
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 ()
936
+ service := cloud .service
937
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
938
+ service = cloud .tenantServiceMap [project ]
939
+ }
940
+ op , err := service .Instances .DetachDisk (project , instanceZone , instanceName , deviceName ).Context (ctx ).Do ()
876
941
if err != nil {
877
942
return err
878
943
}
@@ -1041,7 +1106,7 @@ func (cloud *CloudProvider) waitForAttachOnInstance(ctx context.Context, project
1041
1106
start := time .Now ()
1042
1107
return wait .ExponentialBackoff (AttachDiskBackoff , func () (bool , error ) {
1043
1108
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 )
1109
+ instance , err := cloud .GetInstanceOrError (ctx , project , instanceZone , instanceName )
1045
1110
if err != nil {
1046
1111
return false , fmt .Errorf ("GetInstance failed to get instance: %w" , err )
1047
1112
}
@@ -1145,10 +1210,13 @@ func opIsDone(op *computev1.Operation) (bool, error) {
1145
1210
return true , nil
1146
1211
}
1147
1212
1148
- func (cloud * CloudProvider ) GetInstanceOrError (ctx context.Context , instanceZone , instanceName string ) (* computev1.Instance , error ) {
1213
+ func (cloud * CloudProvider ) GetInstanceOrError (ctx context.Context , project , instanceZone , instanceName string ) (* computev1.Instance , error ) {
1149
1214
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 ()
1215
+ service := cloud .service
1216
+ if _ , ok := cloud .tenantServiceMap [project ]; ok {
1217
+ service = cloud .tenantServiceMap [project ]
1218
+ }
1219
+ instance , err := service .Instances .Get (project , instanceZone , instanceName ).Do ()
1152
1220
if err != nil {
1153
1221
return nil , err
1154
1222
}
0 commit comments