@@ -34,6 +34,7 @@ import (
34
34
"sigs.k8s.io/cluster-api/util/patch"
35
35
36
36
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
37
+ "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/utils"
37
38
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/vpc"
38
39
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
39
40
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
@@ -143,17 +144,41 @@ func (s *ClusterScope) DeleteVPC() error {
143
144
}
144
145
145
146
func (s * ClusterScope ) ensureVPCUnique (vpcName string ) (* vpcv1.VPC , error ) {
146
- listVpcsOptions := & vpcv1.ListVpcsOptions {}
147
- vpcs , _ , err := s .IBMVPCClient .ListVpcs (listVpcsOptions )
148
- if err != nil {
149
- return nil , err
150
- }
151
- for _ , vpc := range vpcs .Vpcs {
152
- if (* vpc .Name ) == vpcName {
153
- return & vpc , nil
147
+ var vpc * vpcv1.VPC
148
+ f := func (start string ) (bool , string , error ) {
149
+ // check for existing vpcs
150
+ listVpcsOptions := & vpcv1.ListVpcsOptions {}
151
+ if start != "" {
152
+ listVpcsOptions .Start = & start
153
+ }
154
+
155
+ vpcsList , _ , err := s .IBMVPCClient .ListVpcs (listVpcsOptions )
156
+ if err != nil {
157
+ return false , "" , err
158
+ }
159
+
160
+ if vpcsList == nil {
161
+ return false , "" , fmt .Errorf ("vpc list returned is nil" )
162
+ }
163
+
164
+ for i , v := range vpcsList .Vpcs {
165
+ if (* v .Name ) == vpcName {
166
+ vpc = & vpcsList .Vpcs [i ]
167
+ return true , "" , nil
168
+ }
154
169
}
170
+
171
+ if vpcsList .Next != nil && * vpcsList .Next .Href != "" {
172
+ return false , * vpcsList .Next .Href , nil
173
+ }
174
+ return true , "" , nil
175
+ }
176
+
177
+ if err := utils .PagingHelper (f ); err != nil {
178
+ return nil , err
155
179
}
156
- return nil , nil
180
+
181
+ return vpc , nil
157
182
}
158
183
159
184
func (s * ClusterScope ) updateDefaultSG (sgID string ) error {
@@ -201,17 +226,41 @@ func (s *ClusterScope) ReserveFIP() (*vpcv1.FloatingIP, error) {
201
226
}
202
227
203
228
func (s * ClusterScope ) ensureFIPUnique (fipName string ) (* vpcv1.FloatingIP , error ) {
204
- listFloatingIpsOptions := & vpcv1.ListFloatingIpsOptions {}
205
- floatingIPs , _ , err := s .IBMVPCClient .ListFloatingIps (listFloatingIpsOptions )
206
- if err != nil {
207
- return nil , err
208
- }
209
- for _ , fip := range floatingIPs .FloatingIps {
210
- if * fip .Name == fipName {
211
- return & fip , nil
229
+ var floatingIP * vpcv1.FloatingIP
230
+ f := func (start string ) (bool , string , error ) {
231
+ // check for existing floatingIPs
232
+ listFloatingIpsOptions := & vpcv1.ListFloatingIpsOptions {}
233
+ if start != "" {
234
+ listFloatingIpsOptions .Start = & start
212
235
}
236
+
237
+ floatingIPsList , _ , err := s .IBMVPCClient .ListFloatingIps (listFloatingIpsOptions )
238
+ if err != nil {
239
+ return false , "" , err
240
+ }
241
+
242
+ if floatingIPsList == nil {
243
+ return false , "" , fmt .Errorf ("floatingIP list returned is nil" )
244
+ }
245
+
246
+ for i , fp := range floatingIPsList .FloatingIps {
247
+ if (* fp .Name ) == fipName {
248
+ floatingIP = & floatingIPsList .FloatingIps [i ]
249
+ return true , "" , nil
250
+ }
251
+ }
252
+
253
+ if floatingIPsList .Next != nil && * floatingIPsList .Next .Href != "" {
254
+ return false , * floatingIPsList .Next .Href , nil
255
+ }
256
+ return true , "" , nil
213
257
}
214
- return nil , nil
258
+
259
+ if err := utils .PagingHelper (f ); err != nil {
260
+ return nil , err
261
+ }
262
+
263
+ return floatingIP , nil
215
264
}
216
265
217
266
// DeleteFloatingIP deletes a Floating IP associated with floating ip id.
@@ -277,58 +326,126 @@ func (s *ClusterScope) CreateSubnet() (*vpcv1.Subnet, error) {
277
326
}
278
327
279
328
func (s * ClusterScope ) getSubnetAddrPrefix (vpcID , zone string ) (string , error ) {
280
- options := & vpcv1.ListVPCAddressPrefixesOptions {
281
- VPCID : & vpcID ,
329
+ var addrPrefix * vpcv1.AddressPrefix
330
+ f := func (start string ) (bool , string , error ) {
331
+ // check for existing vpcAddressPrefixes
332
+ listVPCAddressPrefixesOptions := & vpcv1.ListVPCAddressPrefixesOptions {
333
+ VPCID : & vpcID ,
334
+ }
335
+ if start != "" {
336
+ listVPCAddressPrefixesOptions .Start = & start
337
+ }
338
+
339
+ vpcAddressPrefixesList , _ , err := s .IBMVPCClient .ListVPCAddressPrefixes (listVPCAddressPrefixesOptions )
340
+ if err != nil {
341
+ return false , "" , err
342
+ }
343
+
344
+ if vpcAddressPrefixesList == nil {
345
+ return false , "" , fmt .Errorf ("vpcAddressPrefix list returned is nil" )
346
+ }
347
+
348
+ for i , addressPrefix := range vpcAddressPrefixesList .AddressPrefixes {
349
+ if (* addressPrefix .Zone .Name ) == zone {
350
+ addrPrefix = & vpcAddressPrefixesList .AddressPrefixes [i ]
351
+ return true , "" , nil
352
+ }
353
+ }
354
+
355
+ if vpcAddressPrefixesList .Next != nil && * vpcAddressPrefixesList .Next .Href != "" {
356
+ return false , * vpcAddressPrefixesList .Next .Href , nil
357
+ }
358
+ return true , "" , nil
282
359
}
283
- addrCollection , _ , err := s .IBMVPCClient .ListVPCAddressPrefixes (options )
284
360
285
- if err != nil {
361
+ if err := utils . PagingHelper ( f ); err != nil {
286
362
return "" , err
287
363
}
288
- for _ , addrPrefix := range addrCollection .AddressPrefixes {
289
- if * addrPrefix .Zone .Name == zone {
290
- return * addrPrefix .CIDR , nil
291
- }
364
+
365
+ if addrPrefix != nil {
366
+ return * addrPrefix .CIDR , nil
292
367
}
293
368
return "" , fmt .Errorf ("not found a valid CIDR for VPC %s in zone %s" , vpcID , zone )
294
369
}
295
370
296
371
func (s * ClusterScope ) ensureSubnetUnique (subnetName string ) (* vpcv1.Subnet , error ) {
297
- options := & vpcv1.ListSubnetsOptions {}
298
- subnets , _ , err := s .IBMVPCClient .ListSubnets (options )
372
+ var subnet * vpcv1.Subnet
373
+ f := func (start string ) (bool , string , error ) {
374
+ // check for existing subnets
375
+ listSubnetsOptions := & vpcv1.ListSubnetsOptions {}
376
+ if start != "" {
377
+ listSubnetsOptions .Start = & start
378
+ }
299
379
300
- if err != nil {
301
- return nil , err
302
- }
303
- for _ , subnet := range subnets .Subnets {
304
- if * subnet .Name == subnetName {
305
- return & subnet , nil
380
+ subnetsList , _ , err := s .IBMVPCClient .ListSubnets (listSubnetsOptions )
381
+ if err != nil {
382
+ return false , "" , err
306
383
}
384
+
385
+ if subnetsList == nil {
386
+ return false , "" , fmt .Errorf ("subnet list returned is nil" )
387
+ }
388
+
389
+ for i , s := range subnetsList .Subnets {
390
+ if (* s .Name ) == subnetName {
391
+ subnet = & subnetsList .Subnets [i ]
392
+ return true , "" , nil
393
+ }
394
+ }
395
+
396
+ if subnetsList .Next != nil && * subnetsList .Next .Href != "" {
397
+ return false , * subnetsList .Next .Href , nil
398
+ }
399
+ return true , "" , nil
307
400
}
308
- return nil , nil
401
+
402
+ if err := utils .PagingHelper (f ); err != nil {
403
+ return nil , err
404
+ }
405
+
406
+ return subnet , nil
309
407
}
310
408
311
409
// DeleteSubnet deletes a subnet associated with subnet id.
312
410
func (s * ClusterScope ) DeleteSubnet () error {
313
411
subnetID := * s .IBMVPCCluster .Status .Subnet .ID
314
412
315
413
// Lists the subnet available and compare before deleting to avoid any failure(404) later
316
- if found , err := func () (bool , error ) {
317
- //TODO: Add paging mechanism and use that function everywhere
318
- subnets , _ , err := s .IBMVPCClient .ListSubnets (& vpcv1.ListSubnetsOptions {})
414
+ found := false
415
+ f := func (start string ) (bool , string , error ) {
416
+ // check for existing subnets
417
+ listSubnetsOptions := & vpcv1.ListSubnetsOptions {}
418
+ if start != "" {
419
+ listSubnetsOptions .Start = & start
420
+ }
421
+
422
+ subnetsList , _ , err := s .IBMVPCClient .ListSubnets (listSubnetsOptions )
319
423
if err != nil {
320
- return false , err
424
+ return false , "" , err
321
425
}
322
426
323
- for _ , subnet := range subnets .Subnets {
324
- if * subnet .ID == subnetID {
325
- return true , nil
427
+ if subnetsList == nil {
428
+ return false , "" , fmt .Errorf ("subnet list returned is nil" )
429
+ }
430
+
431
+ for _ , s := range subnetsList .Subnets {
432
+ if * s .ID == subnetID {
433
+ found = true
434
+ return true , "" , nil
326
435
}
327
436
}
328
- return false , nil
329
- }(); err != nil {
437
+
438
+ if subnetsList .Next != nil && * subnetsList .Next .Href != "" {
439
+ return false , * subnetsList .Next .Href , nil
440
+ }
441
+ return true , "" , nil
442
+ }
443
+
444
+ if err := utils .PagingHelper (f ); err != nil {
330
445
return err
331
- } else if ! found {
446
+ }
447
+
448
+ if ! found {
332
449
s .Logger .V (3 ).Info ("No subnets found with ID" , "Subnet ID" , subnetID )
333
450
return nil
334
451
}
@@ -467,42 +584,86 @@ func (s *ClusterScope) CreateLoadBalancer() (*vpcv1.LoadBalancer, error) {
467
584
}
468
585
469
586
func (s * ClusterScope ) ensureLoadBalancerUnique (loadBalancerName string ) (* vpcv1.LoadBalancer , error ) {
470
- listLoadBalancersOptions := & vpcv1.ListLoadBalancersOptions {}
471
- loadBalancers , _ , err := s .IBMVPCClient .ListLoadBalancers (listLoadBalancersOptions )
472
- if err != nil {
473
- return nil , err
474
- }
475
- for _ , loadBalancer := range loadBalancers .LoadBalancers {
476
- if (* loadBalancer .Name ) == loadBalancerName {
477
- return & loadBalancer , nil
587
+ var loadBalancer * vpcv1.LoadBalancer
588
+ f := func (start string ) (bool , string , error ) {
589
+ // check for existing loadBalancers
590
+ listLoadBalancersOptions := & vpcv1.ListLoadBalancersOptions {}
591
+ if start != "" {
592
+ listLoadBalancersOptions .Start = & start
593
+ }
594
+
595
+ loadBalancersList , _ , err := s .IBMVPCClient .ListLoadBalancers (listLoadBalancersOptions )
596
+ if err != nil {
597
+ return false , "" , err
598
+ }
599
+
600
+ if loadBalancersList == nil {
601
+ return false , "" , fmt .Errorf ("loadBalancer list returned is nil" )
602
+ }
603
+
604
+ for i , lb := range loadBalancersList .LoadBalancers {
605
+ if (* lb .Name ) == loadBalancerName {
606
+ loadBalancer = & loadBalancersList .LoadBalancers [i ]
607
+ return true , "" , nil
608
+ }
478
609
}
610
+
611
+ if loadBalancersList .Next != nil && * loadBalancersList .Next .Href != "" {
612
+ return false , * loadBalancersList .Next .Href , nil
613
+ }
614
+ return true , "" , nil
479
615
}
480
- return nil , nil
616
+
617
+ if err := utils .PagingHelper (f ); err != nil {
618
+ return nil , err
619
+ }
620
+
621
+ return loadBalancer , nil
481
622
}
482
623
483
624
// DeleteLoadBalancer deletes IBM VPC load balancer associated with a VPC id.
484
625
func (s * ClusterScope ) DeleteLoadBalancer () (bool , error ) {
485
626
deleted := false
486
627
if lbipID := s .GetLoadBalancerID (); lbipID != "" {
487
- listLoadBalancersOptions := & vpcv1.ListLoadBalancersOptions {}
488
- loadBalancers , _ , err := s .IBMVPCClient .ListLoadBalancers (listLoadBalancersOptions )
489
- if err != nil {
490
- return deleted , err
491
- }
492
-
493
- for _ , loadBalancer := range loadBalancers .LoadBalancers {
494
- if (* loadBalancer .ID ) == lbipID {
495
- deleted = true
496
- if * loadBalancer .ProvisioningStatus != string (infrav1beta2 .VPCLoadBalancerStateDeletePending ) {
497
- deleteLoadBalancerOption := & vpcv1.DeleteLoadBalancerOptions {}
498
- deleteLoadBalancerOption .SetID (lbipID )
499
- _ , err := s .IBMVPCClient .DeleteLoadBalancer (deleteLoadBalancerOption )
500
- if err != nil {
501
- record .Warnf (s .IBMVPCCluster , "FailedDeleteLoadBalancer" , "Failed loadBalancer deletion - %v" , err )
502
- return deleted , err
628
+ f := func (start string ) (bool , string , error ) {
629
+ // check for existing loadBalancers
630
+ listLoadBalancersOptions := & vpcv1.ListLoadBalancersOptions {}
631
+ if start != "" {
632
+ listLoadBalancersOptions .Start = & start
633
+ }
634
+
635
+ loadBalancersList , _ , err := s .IBMVPCClient .ListLoadBalancers (listLoadBalancersOptions )
636
+ if err != nil {
637
+ return false , "" , err
638
+ }
639
+
640
+ if loadBalancersList == nil {
641
+ return false , "" , fmt .Errorf ("loadBalancer list returned is nil" )
642
+ }
643
+
644
+ for _ , lb := range loadBalancersList .LoadBalancers {
645
+ if (* lb .ID ) == lbipID {
646
+ deleted = true
647
+ if * lb .ProvisioningStatus != string (infrav1beta2 .VPCLoadBalancerStateDeletePending ) {
648
+ deleteLoadBalancerOption := & vpcv1.DeleteLoadBalancerOptions {}
649
+ deleteLoadBalancerOption .SetID (lbipID )
650
+ _ , err := s .IBMVPCClient .DeleteLoadBalancer (deleteLoadBalancerOption )
651
+ if err != nil {
652
+ record .Warnf (s .IBMVPCCluster , "FailedDeleteLoadBalancer" , "Failed loadBalancer deletion - %v" , err )
653
+ return false , "" , err
654
+ }
503
655
}
504
656
}
505
657
}
658
+
659
+ if loadBalancersList .Next != nil && * loadBalancersList .Next .Href != "" {
660
+ return false , * loadBalancersList .Next .Href , nil
661
+ }
662
+ return true , "" , nil
663
+ }
664
+
665
+ if err := utils .PagingHelper (f ); err != nil {
666
+ return false , err
506
667
}
507
668
}
508
669
return deleted , nil
0 commit comments