@@ -44,31 +44,10 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
44
44
loadBalancerName := getLoadBalancerName (clusterName )
45
45
s .logger .Info ("Reconciling load balancer" , "name" , loadBalancerName )
46
46
47
- // lb
48
- lb , err := s .checkIfLbExists (loadBalancerName )
47
+ lb , err := s .getOrCreateLoadBalancer (openStackCluster , loadBalancerName , openStackCluster .Status .Network .Subnet .ID , clusterName )
49
48
if err != nil {
50
49
return err
51
50
}
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
- }
72
51
73
52
floatingIPAddress := openStackCluster .Spec .ControlPlaneEndpoint .Host
74
53
if openStackCluster .Spec .APIServerFloatingIP != "" {
@@ -82,83 +61,21 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
82
61
return err
83
62
}
84
63
85
- // lb listener
86
64
portList := []int {int (openStackCluster .Spec .ControlPlaneEndpoint .Port )}
87
65
portList = append (portList , openStackCluster .Spec .APIServerLoadBalancerAdditionalPorts ... )
88
66
for _ , port := range portList {
89
67
lbPortObjectsName := fmt .Sprintf ("%s-%d" , loadBalancerName , port )
90
-
91
- listener , err := s .checkIfListenerExists (lbPortObjectsName )
68
+ listener , err := s .getOrCreateListener (openStackCluster , lbPortObjectsName , lb .ID , port )
92
69
if err != nil {
93
70
return err
94
71
}
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
- }
116
72
117
- // lb pool
118
- pool , err := s .checkIfPoolExists (lbPortObjectsName )
73
+ pool , err := s .getOrCreatePool (openStackCluster , lbPortObjectsName , listener .ID , lb .ID )
119
74
if err != nil {
120
75
return err
121
76
}
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
- }
139
77
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 {
162
79
return err
163
80
}
164
81
}
@@ -172,6 +89,148 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
172
89
return nil
173
90
}
174
91
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
+
175
234
func (s * Service ) ReconcileLoadBalancerMember (openStackCluster * infrav1.OpenStackCluster , machine * clusterv1.Machine , openStackMachine * infrav1.OpenStackMachine , clusterName , ip string ) error {
176
235
if ! util .IsControlPlaneMachine (machine ) {
177
236
return nil
0 commit comments