Skip to content

Commit 7326419

Browse files
authored
Merge pull request #869 from hidekazuna/refactor_lb
Add some events related to load balancer
2 parents 4c2b4db + 7001d48 commit 7326419

File tree

1 file changed

+146
-87
lines changed

1 file changed

+146
-87
lines changed

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 146 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,10 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
4444
loadBalancerName := getLoadBalancerName(clusterName)
4545
s.logger.Info("Reconciling load balancer", "name", loadBalancerName)
4646

47-
// lb
48-
lb, err := s.checkIfLbExists(loadBalancerName)
47+
lb, err := s.getOrCreateLoadBalancer(openStackCluster, loadBalancerName, openStackCluster.Status.Network.Subnet.ID, clusterName)
4948
if err != nil {
5049
return err
5150
}
52-
if lb == nil {
53-
s.logger.Info(fmt.Sprintf("Creating load balancer in subnet: %q", openStackCluster.Status.Network.Subnet.ID), "name", loadBalancerName)
54-
lbCreateOpts := loadbalancers.CreateOpts{
55-
Name: loadBalancerName,
56-
VipSubnetID: openStackCluster.Status.Network.Subnet.ID,
57-
Description: names.GetDescription(clusterName),
58-
}
59-
60-
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
61-
lb, err = loadbalancers.Create(s.loadbalancerClient, lbCreateOpts).Extract()
62-
63-
if mc.ObserveRequest(err) != nil {
64-
record.Warnf(openStackCluster, "FailedCreateLoadBalancer", "Failed to create load balancer %s: %v", loadBalancerName, err)
65-
return err
66-
}
67-
record.Eventf(openStackCluster, "SuccessfulCreateLoadBalancer", "Created load balancer %s with id %s", loadBalancerName, lb.ID)
68-
}
69-
if err := s.waitForLoadBalancerActive(lb.ID); err != nil {
70-
return err
71-
}
7251

7352
floatingIPAddress := openStackCluster.Spec.ControlPlaneEndpoint.Host
7453
if openStackCluster.Spec.APIServerFloatingIP != "" {
@@ -82,83 +61,21 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
8261
return err
8362
}
8463

85-
// lb listener
8664
portList := []int{int(openStackCluster.Spec.ControlPlaneEndpoint.Port)}
8765
portList = append(portList, openStackCluster.Spec.APIServerLoadBalancerAdditionalPorts...)
8866
for _, port := range portList {
8967
lbPortObjectsName := fmt.Sprintf("%s-%d", loadBalancerName, port)
90-
91-
listener, err := s.checkIfListenerExists(lbPortObjectsName)
68+
listener, err := s.getOrCreateListener(openStackCluster, lbPortObjectsName, lb.ID, port)
9269
if err != nil {
9370
return err
9471
}
95-
if listener == nil {
96-
s.logger.Info("Creating load balancer listener", "name", lbPortObjectsName, "lb-id", lb.ID)
97-
listenerCreateOpts := listeners.CreateOpts{
98-
Name: lbPortObjectsName,
99-
Protocol: "TCP",
100-
ProtocolPort: port,
101-
LoadbalancerID: lb.ID,
102-
}
103-
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "create")
104-
listener, err = listeners.Create(s.loadbalancerClient, listenerCreateOpts).Extract()
105-
if mc.ObserveRequest(err) != nil {
106-
return fmt.Errorf("error creating listener: %s", err)
107-
}
108-
}
109-
if err := s.waitForLoadBalancerActive(lb.ID); err != nil {
110-
return err
111-
}
112-
113-
if err := s.waitForListener(listener.ID, "ACTIVE"); err != nil {
114-
return err
115-
}
11672

117-
// lb pool
118-
pool, err := s.checkIfPoolExists(lbPortObjectsName)
73+
pool, err := s.getOrCreatePool(openStackCluster, lbPortObjectsName, listener.ID, lb.ID)
11974
if err != nil {
12075
return err
12176
}
122-
if pool == nil {
123-
s.logger.Info(fmt.Sprintf("Creating load balancer pool for listener %q", listener.ID), "name", lbPortObjectsName, "lb-id", lb.ID)
124-
poolCreateOpts := pools.CreateOpts{
125-
Name: lbPortObjectsName,
126-
Protocol: "TCP",
127-
LBMethod: pools.LBMethodRoundRobin,
128-
ListenerID: listener.ID,
129-
}
130-
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "create")
131-
pool, err = pools.Create(s.loadbalancerClient, poolCreateOpts).Extract()
132-
if mc.ObserveRequest(err) != nil {
133-
return fmt.Errorf("error creating pool: %s", err)
134-
}
135-
}
136-
if err := s.waitForLoadBalancerActive(lb.ID); err != nil {
137-
return err
138-
}
13977

140-
// lb monitor
141-
monitor, err := s.checkIfMonitorExists(lbPortObjectsName)
142-
if err != nil {
143-
return err
144-
}
145-
if monitor == nil {
146-
s.logger.Info(fmt.Sprintf("Creating load balancer monitor for pool %q", pool.ID), "name", lbPortObjectsName, "lb-id", lb.ID)
147-
monitorCreateOpts := monitors.CreateOpts{
148-
Name: lbPortObjectsName,
149-
PoolID: pool.ID,
150-
Type: "TCP",
151-
Delay: 30,
152-
Timeout: 5,
153-
MaxRetries: 3,
154-
}
155-
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "create")
156-
_, err = monitors.Create(s.loadbalancerClient, monitorCreateOpts).Extract()
157-
if mc.ObserveRequest(err) != nil {
158-
return fmt.Errorf("error creating monitor: %s", err)
159-
}
160-
}
161-
if err = s.waitForLoadBalancerActive(lb.ID); err != nil {
78+
if err := s.getOrCreateMonitor(openStackCluster, lbPortObjectsName, pool.ID, lb.ID); err != nil {
16279
return err
16380
}
16481
}
@@ -172,6 +89,148 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
17289
return nil
17390
}
17491

92+
func (s *Service) getOrCreateLoadBalancer(openStackCluster *infrav1.OpenStackCluster, loadBalancerName, subnetID, clusterName string) (*loadbalancers.LoadBalancer, error) {
93+
lb, err := s.checkIfLbExists(loadBalancerName)
94+
if err != nil {
95+
return nil, err
96+
}
97+
98+
if lb != nil {
99+
return lb, nil
100+
}
101+
102+
s.logger.Info(fmt.Sprintf("Creating load balancer in subnet: %q", subnetID), "name", loadBalancerName)
103+
104+
lbCreateOpts := loadbalancers.CreateOpts{
105+
Name: loadBalancerName,
106+
VipSubnetID: subnetID,
107+
Description: names.GetDescription(clusterName),
108+
}
109+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
110+
lb, err = loadbalancers.Create(s.loadbalancerClient, lbCreateOpts).Extract()
111+
if mc.ObserveRequest(err) != nil {
112+
record.Warnf(openStackCluster, "FailedCreateLoadBalancer", "Failed to create load balancer %s: %v", loadBalancerName, err)
113+
return nil, err
114+
}
115+
116+
if err := s.waitForLoadBalancerActive(lb.ID); err != nil {
117+
record.Warnf(openStackCluster, "FailedCreateLoadBalancer", "Failed to create load balancer %s with id %s: wait for load balancer active: %v", loadBalancerName, lb.ID, err)
118+
return nil, err
119+
}
120+
121+
record.Eventf(openStackCluster, "SuccessfulCreateLoadBalancer", "Created load balancer %s with id %s", loadBalancerName, lb.ID)
122+
return lb, nil
123+
}
124+
125+
func (s *Service) getOrCreateListener(openStackCluster *infrav1.OpenStackCluster, listenerName, lbID string, port int) (*listeners.Listener, error) {
126+
listener, err := s.checkIfListenerExists(listenerName)
127+
if err != nil {
128+
return nil, err
129+
}
130+
131+
if listener != nil {
132+
return listener, nil
133+
}
134+
135+
s.logger.Info("Creating load balancer listener", "name", listenerName, "lb-id", lbID)
136+
137+
listenerCreateOpts := listeners.CreateOpts{
138+
Name: listenerName,
139+
Protocol: "TCP",
140+
ProtocolPort: port,
141+
LoadbalancerID: lbID,
142+
}
143+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "create")
144+
listener, err = listeners.Create(s.loadbalancerClient, listenerCreateOpts).Extract()
145+
if mc.ObserveRequest(err) != nil {
146+
record.Warnf(openStackCluster, "FailedCreateListener", "Failed to create listener %s: %v", listenerName, err)
147+
return nil, err
148+
}
149+
150+
if err := s.waitForLoadBalancerActive(lbID); err != nil {
151+
record.Warnf(openStackCluster, "FailedCreateListener", "Failed to create listener %s with id %s: wait for load balancer active %s: %v", listenerName, listener.ID, lbID, err)
152+
return nil, err
153+
}
154+
155+
if err := s.waitForListener(listener.ID, "ACTIVE"); err != nil {
156+
record.Warnf(openStackCluster, "FailedCreateListener", "Failed to create listener %s with id %s: wait for listener active: %v", listenerName, listener.ID, err)
157+
return nil, err
158+
}
159+
160+
record.Eventf(openStackCluster, "SuccessfulCreateListener", "Created listener %s with id %s", listenerName, listener.ID)
161+
return listener, nil
162+
}
163+
164+
func (s *Service) getOrCreatePool(openStackCluster *infrav1.OpenStackCluster, poolName, listenerID, lbID string) (*pools.Pool, error) {
165+
pool, err := s.checkIfPoolExists(poolName)
166+
if err != nil {
167+
return nil, err
168+
}
169+
170+
if pool != nil {
171+
return pool, nil
172+
}
173+
174+
s.logger.Info(fmt.Sprintf("Creating load balancer pool for listener %q", listenerID), "name", poolName, "lb-id", lbID)
175+
176+
poolCreateOpts := pools.CreateOpts{
177+
Name: poolName,
178+
Protocol: "TCP",
179+
LBMethod: pools.LBMethodRoundRobin,
180+
ListenerID: listenerID,
181+
}
182+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "create")
183+
pool, err = pools.Create(s.loadbalancerClient, poolCreateOpts).Extract()
184+
if mc.ObserveRequest(err) != nil {
185+
record.Warnf(openStackCluster, "FailedCreatePool", "Failed to create pool %s: %v", poolName, err)
186+
return nil, err
187+
}
188+
189+
if err := s.waitForLoadBalancerActive(lbID); err != nil {
190+
record.Warnf(openStackCluster, "FailedCreatePool", "Failed to create pool %s with id %s: wait for load balancer active %s: %v", poolName, pool.ID, lbID, err)
191+
return nil, err
192+
}
193+
194+
record.Eventf(openStackCluster, "SuccessfulCreatePool", "Created pool %s with id %s", poolName, pool.ID)
195+
return pool, nil
196+
}
197+
198+
func (s *Service) getOrCreateMonitor(openStackCluster *infrav1.OpenStackCluster, monitorName, poolID, lbID string) error {
199+
monitor, err := s.checkIfMonitorExists(monitorName)
200+
if err != nil {
201+
return err
202+
}
203+
204+
if monitor != nil {
205+
return nil
206+
}
207+
208+
s.logger.Info(fmt.Sprintf("Creating load balancer monitor for pool %q", poolID), "name", monitorName, "lb-id", lbID)
209+
210+
monitorCreateOpts := monitors.CreateOpts{
211+
Name: monitorName,
212+
PoolID: poolID,
213+
Type: "TCP",
214+
Delay: 30,
215+
Timeout: 5,
216+
MaxRetries: 3,
217+
}
218+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "create")
219+
monitor, err = monitors.Create(s.loadbalancerClient, monitorCreateOpts).Extract()
220+
if mc.ObserveRequest(err) != nil {
221+
record.Warnf(openStackCluster, "FailedCreateMonitor", "Failed to create monitor %s: %v", monitorName, err)
222+
return err
223+
}
224+
225+
if err = s.waitForLoadBalancerActive(lbID); err != nil {
226+
record.Warnf(openStackCluster, "FailedCreateMonitor", "Failed to create monitor %s with id %s: wait for load balancer active %s: %v", monitorName, monitor.ID, lbID, err)
227+
return err
228+
}
229+
230+
record.Eventf(openStackCluster, "SuccessfulCreateMonitor", "Created monitor %s with id %s", monitorName, monitor.ID)
231+
return nil
232+
}
233+
175234
func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStackCluster, machine *clusterv1.Machine, openStackMachine *infrav1.OpenStackMachine, clusterName, ip string) error {
176235
if !util.IsControlPlaneMachine(machine) {
177236
return nil

0 commit comments

Comments
 (0)