Skip to content

Commit c88394b

Browse files
Implement paging mechanism (#1053)
Signed-off-by: Prajyot-Parab <[email protected]>
1 parent 0852333 commit c88394b

File tree

3 files changed

+403
-97
lines changed

3 files changed

+403
-97
lines changed

cloud/scope/cluster.go

Lines changed: 231 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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

145146
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+
}
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

159184
func (s *ClusterScope) updateDefaultSG(sgID string) error {
@@ -201,17 +226,41 @@ func (s *ClusterScope) ReserveFIP() (*vpcv1.FloatingIP, error) {
201226
}
202227

203228
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
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

279328
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
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

296371
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+
}
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.
312410
func (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

469586
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+
}
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.
484625
func (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

Comments
 (0)