@@ -34,6 +34,7 @@ import (
3434 "sigs.k8s.io/cluster-api/util/patch"
3535
3636 infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
37+ "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/utils"
3738 "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/vpc"
3839 "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/endpoints"
3940 "sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/record"
@@ -143,17 +144,41 @@ func (s *ClusterScope) DeleteVPC() error {
143144}
144145
145146func (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+ }
154169 }
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
155179 }
156- return nil , nil
180+
181+ return vpc , nil
157182}
158183
159184func (s * ClusterScope ) updateDefaultSG (sgID string ) error {
@@ -201,17 +226,41 @@ func (s *ClusterScope) ReserveFIP() (*vpcv1.FloatingIP, error) {
201226}
202227
203228func (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
212235 }
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
213257 }
214- return nil , nil
258+
259+ if err := utils .PagingHelper (f ); err != nil {
260+ return nil , err
261+ }
262+
263+ return floatingIP , nil
215264}
216265
217266// DeleteFloatingIP deletes a Floating IP associated with floating ip id.
@@ -277,58 +326,126 @@ func (s *ClusterScope) CreateSubnet() (*vpcv1.Subnet, error) {
277326}
278327
279328func (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
282359 }
283- addrCollection , _ , err := s .IBMVPCClient .ListVPCAddressPrefixes (options )
284360
285- if err != nil {
361+ if err := utils . PagingHelper ( f ); err != nil {
286362 return "" , err
287363 }
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
292367 }
293368 return "" , fmt .Errorf ("not found a valid CIDR for VPC %s in zone %s" , vpcID , zone )
294369}
295370
296371func (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+ }
299379
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
306383 }
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
307400 }
308- return nil , nil
401+
402+ if err := utils .PagingHelper (f ); err != nil {
403+ return nil , err
404+ }
405+
406+ return subnet , nil
309407}
310408
311409// DeleteSubnet deletes a subnet associated with subnet id.
312410func (s * ClusterScope ) DeleteSubnet () error {
313411 subnetID := * s .IBMVPCCluster .Status .Subnet .ID
314412
315413 // 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 )
319423 if err != nil {
320- return false , err
424+ return false , "" , err
321425 }
322426
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
326435 }
327436 }
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 {
330445 return err
331- } else if ! found {
446+ }
447+
448+ if ! found {
332449 s .Logger .V (3 ).Info ("No subnets found with ID" , "Subnet ID" , subnetID )
333450 return nil
334451 }
@@ -467,42 +584,86 @@ func (s *ClusterScope) CreateLoadBalancer() (*vpcv1.LoadBalancer, error) {
467584}
468585
469586func (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+ }
478609 }
610+
611+ if loadBalancersList .Next != nil && * loadBalancersList .Next .Href != "" {
612+ return false , * loadBalancersList .Next .Href , nil
613+ }
614+ return true , "" , nil
479615 }
480- return nil , nil
616+
617+ if err := utils .PagingHelper (f ); err != nil {
618+ return nil , err
619+ }
620+
621+ return loadBalancer , nil
481622}
482623
483624// DeleteLoadBalancer deletes IBM VPC load balancer associated with a VPC id.
484625func (s * ClusterScope ) DeleteLoadBalancer () (bool , error ) {
485626 deleted := false
486627 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+ }
503655 }
504656 }
505657 }
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
506667 }
507668 }
508669 return deleted , nil
0 commit comments