Skip to content

Commit 91eda51

Browse files
authored
Merge pull request #710 from hidekazuna/refactor_fp
🏃 Refactor loadbalancer package
2 parents a542228 + 4d3d98c commit 91eda51

File tree

3 files changed

+42
-75
lines changed

3 files changed

+42
-75
lines changed

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 4 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
3030
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
3131
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
32-
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
3332
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
3433
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
3534
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha3"
@@ -72,19 +71,11 @@ func (s *Service) ReconcileLoadBalancer(clusterName string, openStackCluster *in
7271
}
7372
}
7473

75-
fp, err := getOrCreateFloatingIP(s.networkingClient, openStackCluster, openStackCluster.Spec.ControlPlaneEndpoint.Host)
74+
fp, err := s.networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster.Spec.ControlPlaneEndpoint.Host)
7675
if err != nil {
7776
return err
7877
}
79-
s.logger.Info("Associating floating IP", "IP", fp.FloatingIP)
80-
fpUpdateOpts := &floatingips.UpdateOpts{
81-
PortID: &lb.VipPortID,
82-
}
83-
fp, err = floatingips.Update(s.networkingClient, fp.ID, fpUpdateOpts).Extract()
84-
if err != nil {
85-
return fmt.Errorf("error associating floating IP: %s", err)
86-
}
87-
err = waitForFloatingIP(s.logger, s.networkingClient, fp.ID, "ACTIVE")
78+
err = s.networkingService.AssociateFloatingIP(fp, lb.VipPortID)
8879
if err != nil {
8980
return err
9081
}
@@ -182,7 +173,7 @@ func (s *Service) assignNeutronLbaasAPISecGroup(clusterName string, lb *loadbala
182173
listOpts := groups.ListOpts{
183174
Name: neutronLbaasSecGroupName,
184175
}
185-
allPages, err := groups.List(s.networkingClient, listOpts).AllPages()
176+
allPages, err := groups.List(s.loadbalancerClient, listOpts).AllPages()
186177
if err != nil {
187178
return err
188179
}
@@ -200,7 +191,7 @@ func (s *Service) assignNeutronLbaasAPISecGroup(clusterName string, lb *loadbala
200191
SecurityGroups: &[]string{neutronLbaasGroups[0].ID},
201192
}
202193

203-
_, err = ports.Update(s.networkingClient, lb.VipPortID, updateOpts).Extract()
194+
_, err = ports.Update(s.loadbalancerClient, lb.VipPortID, updateOpts).Extract()
204195
if err != nil {
205196
return err
206197
}
@@ -317,10 +308,6 @@ func (s *Service) DeleteLoadBalancer(loadBalancerName string, openStackCluster *
317308
return fmt.Errorf("error deleting loadbalancer: %s", err)
318309
}
319310

320-
// floating ip
321-
// TODO: need delete floating IP if it's created when doing the cluster provisioning
322-
// but keep the floating ips if it's original exist (probably should store it in the
323-
// Cluster status if the floating ip has been created by us)
324311
return nil
325312
}
326313

@@ -484,47 +471,6 @@ func checkIfLbExists(client *gophercloud.ServiceClient, name string) (*loadbalan
484471
return &lbList[0], nil
485472
}
486473

487-
func getOrCreateFloatingIP(client *gophercloud.ServiceClient, openStackCluster *infrav1.OpenStackCluster, ip string) (*floatingips.FloatingIP, error) {
488-
var fp *floatingips.FloatingIP
489-
var err error
490-
if ip != "" {
491-
fp, err = checkIfFloatingIPExists(client, ip)
492-
if err != nil {
493-
return nil, err
494-
}
495-
}
496-
if fp == nil {
497-
fpCreateOpts := &floatingips.CreateOpts{
498-
FloatingNetworkID: openStackCluster.Status.ExternalNetwork.ID,
499-
}
500-
if ip != "" {
501-
fpCreateOpts.FloatingIP = ip
502-
}
503-
fp, err = floatingips.Create(client, fpCreateOpts).Extract()
504-
if err != nil {
505-
return nil, fmt.Errorf("error creating floating IP: %s", err)
506-
}
507-
record.Eventf(openStackCluster, "SuccessfulCreateFloatingIP", "Created floating IP %s with id %s", fp.FloatingIP, fp.ID)
508-
509-
}
510-
return fp, nil
511-
}
512-
513-
func checkIfFloatingIPExists(client *gophercloud.ServiceClient, ip string) (*floatingips.FloatingIP, error) {
514-
allPages, err := floatingips.List(client, floatingips.ListOpts{FloatingIP: ip}).AllPages()
515-
if err != nil {
516-
return nil, err
517-
}
518-
fpList, err := floatingips.ExtractFloatingIPs(allPages)
519-
if err != nil {
520-
return nil, err
521-
}
522-
if len(fpList) == 0 {
523-
return nil, nil
524-
}
525-
return &fpList[0], nil
526-
}
527-
528474
func checkIfListenerExists(client *gophercloud.ServiceClient, name string) (*listeners.Listener, error) {
529475
allPages, err := listeners.List(client, listeners.ListOpts{Name: name}).AllPages()
530476
if err != nil {
@@ -604,17 +550,6 @@ func waitForLoadBalancerActive(logger logr.Logger, client *gophercloud.ServiceCl
604550
})
605551
}
606552

607-
func waitForFloatingIP(logger logr.Logger, client *gophercloud.ServiceClient, id, target string) error {
608-
logger.Info("Waiting for floatingIP", "id", id, "targetStatus", target)
609-
return wait.ExponentialBackoff(backoff, func() (bool, error) {
610-
fp, err := floatingips.Get(client, id).Extract()
611-
if err != nil {
612-
return false, err
613-
}
614-
return fp.Status == target, nil
615-
})
616-
}
617-
618553
func waitForListener(logger logr.Logger, client *gophercloud.ServiceClient, id, target string) error {
619554
logger.Info("Waiting for listener", "id", id, "targetStatus", target)
620555
return wait.ExponentialBackoff(backoff, func() (bool, error) {

pkg/cloud/services/loadbalancer/service.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/gophercloud/gophercloud/openstack"
2525
"github.com/gophercloud/utils/openstack/clientconfig"
26+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"
2627

2728
"github.com/gophercloud/gophercloud"
2829
)
@@ -35,7 +36,7 @@ const (
3536
// Service interfaces with the OpenStack Neutron LBaaS v2 API.
3637
type Service struct {
3738
loadbalancerClient *gophercloud.ServiceClient
38-
networkingClient *gophercloud.ServiceClient
39+
networkingService *networking.Service
3940
logger logr.Logger
4041
}
4142

@@ -55,16 +56,15 @@ func NewService(client *gophercloud.ProviderClient, clientOpts *clientconfig.Cli
5556
if err != nil {
5657
return nil, fmt.Errorf("failed to create loadbalancer service client: %v", err)
5758
}
58-
networkingClient, err := openstack.NewNetworkV2(client, gophercloud.EndpointOpts{
59-
Region: clientOpts.RegionName,
60-
})
59+
60+
networkingService, err := networking.NewService(client, clientOpts, logger)
6161
if err != nil {
62-
return nil, fmt.Errorf("failed to create networking service client: %v", err)
62+
return nil, fmt.Errorf("failed to create networking service: %v", err)
6363
}
6464

6565
return &Service{
6666
loadbalancerClient: loadbalancerClient,
67-
networkingClient: networkingClient,
67+
networkingService: networkingService,
6868
logger: logger,
6969
}, nil
7070
}

pkg/cloud/services/networking/floatingip.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ package networking
1818

1919
import (
2020
"fmt"
21+
"time"
22+
23+
"k8s.io/apimachinery/pkg/util/wait"
2124

2225
"github.com/gophercloud/gophercloud"
2326
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
@@ -77,3 +80,32 @@ func (s *Service) DeleteFloatingIP(ip string) error {
7780
}
7881
return nil
7982
}
83+
84+
var backoff = wait.Backoff{
85+
Steps: 10,
86+
Duration: 30 * time.Second,
87+
Factor: 1.0,
88+
Jitter: 0.1,
89+
}
90+
91+
func (s *Service) AssociateFloatingIP(fp *floatingips.FloatingIP, portID string) error {
92+
93+
s.logger.Info("Associating floating IP", "IP", fp.FloatingIP)
94+
fpUpdateOpts := &floatingips.UpdateOpts{
95+
PortID: &portID,
96+
}
97+
fp, err := floatingips.Update(s.client, fp.ID, fpUpdateOpts).Extract()
98+
if err != nil {
99+
return fmt.Errorf("error associating floating IP: %s", err)
100+
}
101+
102+
s.logger.Info("Waiting for floatingIP", "id", fp.ID, "targetStatus", "ACTIVE")
103+
104+
return wait.ExponentialBackoff(backoff, func() (bool, error) {
105+
fp, err := floatingips.Get(s.client, fp.ID).Extract()
106+
if err != nil {
107+
return false, err
108+
}
109+
return fp.Status == "ACTIVE", nil
110+
})
111+
}

0 commit comments

Comments
 (0)