Skip to content

Commit 6110ba8

Browse files
committed
Sort actions to ensure proper call order
1 parent 734a28c commit 6110ba8

File tree

3 files changed

+377
-160
lines changed

3 files changed

+377
-160
lines changed

pkg/oci/load_balancer.go

+115-110
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,9 @@ func (cp *CloudProvider) EnsureLoadBalancer(clusterName string, service *api.Ser
201201
return nil, err
202202
}
203203

204-
err = cp.updateBackendSets(lb, spec)
204+
err = cp.updateLoadBalancer(lb, spec, sslConfigMap, sourceCIDRs)
205205
if err != nil {
206-
return nil, fmt.Errorf("update backendsets: %v", err)
207-
}
208-
209-
err = cp.updateListeners(lb, spec, sslConfigMap, sourceCIDRs)
210-
if err != nil {
211-
return nil, fmt.Errorf("udpate listeners: %v", err)
206+
return nil, err
212207
}
213208

214209
status, err := loadBalancerToStatus(lb)
@@ -220,14 +215,20 @@ func (cp *CloudProvider) EnsureLoadBalancer(clusterName string, service *api.Ser
220215
return status, nil
221216
}
222217

223-
func (cp *CloudProvider) updateBackendSets(lb *baremetal.LoadBalancer, spec LBSpec) error {
218+
func (cp *CloudProvider) updateLoadBalancer(lb *baremetal.LoadBalancer, spec LBSpec, sslConfigMap map[int]*baremetal.SSLConfiguration, sourceCIDRs []string) error {
224219
lbOCID := lb.ID
225220

226-
actual := lb.BackendSets
227-
desired := spec.GetBackendSets()
221+
actualBackendSets := lb.BackendSets
222+
desiredBackendSets := spec.GetBackendSets()
228223

229-
actions := getBackendSetChanges(actual, desired)
230-
if len(actions) == 0 {
224+
backendSetActions := getBackendSetChanges(actualBackendSets, desiredBackendSets)
225+
226+
actualListeners := lb.Listeners
227+
desiredListeners := spec.GetListeners(sslConfigMap)
228+
listenerActions := getListenerChanges(actualListeners, desiredListeners)
229+
230+
if len(backendSetActions) == 0 && len(listenerActions) == 0 {
231+
// Nothing to do
231232
return nil
232233
}
233234

@@ -241,143 +242,147 @@ func (cp *CloudProvider) updateBackendSets(lb *baremetal.LoadBalancer, spec LBSp
241242
return fmt.Errorf("get subnets for nodes: %v", err)
242243
}
243244

244-
sourceCIDRs := []string{}
245-
listenerPort := uint64(0)
246-
245+
actions := sortAndCombineActions(backendSetActions, listenerActions)
247246
for _, action := range actions {
248-
var workRequestID string
249-
var err error
250-
251-
be := action.BackendSet
252-
glog.V(2).Infof("Applying `%s` action on backend set `%s` for lb `%s`", action.Type, be.Name, lbOCID)
253-
254-
backendPort := uint64(getBackendPort(be.Backends))
255-
256-
switch action.Type {
257-
case Create:
258-
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
247+
switch a := action.(type) {
248+
case *BackendSetAction:
249+
err := cp.updateBackendSet(lbOCID, a, lbSubnets, nodeSubnets)
259250
if err != nil {
260-
return err
251+
return fmt.Errorf("error updating BackendSet: %v", err)
261252
}
262-
263-
workRequestID, err = cp.client.CreateBackendSet(
264-
lbOCID,
265-
be.Name,
266-
be.Policy,
267-
be.Backends,
268-
be.HealthChecker,
269-
nil, // ssl config
270-
nil, // session persistence
271-
nil, // create opts
272-
)
273-
case Update:
274-
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
253+
case *ListenerAction:
254+
err := cp.updateListener(lbOCID, spec, a, lbSubnets, nodeSubnets, sslConfigMap, sourceCIDRs)
275255
if err != nil {
276-
return err
256+
return fmt.Errorf("error updating BackendSet: %v", err)
277257
}
258+
}
259+
}
260+
return nil
261+
}
278262

279-
workRequestID, err = cp.client.UpdateBackendSet(lbOCID, be.Name, &baremetal.UpdateLoadBalancerBackendSetOptions{
280-
Policy: be.Policy,
281-
HealthChecker: be.HealthChecker,
282-
Backends: be.Backends,
283-
})
284-
case Delete:
285-
err = cp.securityListManager.Delete(lbSubnets, nodeSubnets, listenerPort, backendPort)
286-
if err != nil {
287-
return err
288-
}
263+
func (cp *CloudProvider) updateBackendSet(lbOCID string, action *BackendSetAction, lbSubnets, nodeSubnets []*baremetal.Subnet) error {
264+
sourceCIDRs := []string{}
265+
listenerPort := uint64(0)
289266

290-
workRequestID, err = cp.client.DeleteBackendSet(lbOCID, be.Name, nil)
291-
}
267+
var workRequestID string
268+
var err error
269+
270+
be := action.BackendSet
271+
glog.V(2).Infof("Applying `%s` action on backend set `%s` for lb `%s`", action.Type, be.Name, lbOCID)
272+
273+
backendPort := uint64(getBackendPort(be.Backends))
292274

275+
switch action.Type() {
276+
case Create:
277+
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
293278
if err != nil {
294279
return err
295280
}
296281

297-
_, err = cp.client.AwaitWorkRequest(workRequestID)
282+
workRequestID, err = cp.client.CreateBackendSet(
283+
lbOCID,
284+
be.Name,
285+
be.Policy,
286+
be.Backends,
287+
be.HealthChecker,
288+
nil, // ssl config
289+
nil, // session persistence
290+
nil, // create opts
291+
)
292+
case Update:
293+
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
298294
if err != nil {
299295
return err
300296
}
301-
}
302-
303-
return nil
304-
}
305297

306-
func (cp *CloudProvider) updateListeners(lb *baremetal.LoadBalancer, spec LBSpec, sslConfigMap map[int]*baremetal.SSLConfiguration, sourceCIDRs []string) error {
307-
lbOCID := lb.ID
298+
workRequestID, err = cp.client.UpdateBackendSet(lbOCID, be.Name, &baremetal.UpdateLoadBalancerBackendSetOptions{
299+
Policy: be.Policy,
300+
HealthChecker: be.HealthChecker,
301+
Backends: be.Backends,
302+
})
303+
case Delete:
304+
err = cp.securityListManager.Delete(lbSubnets, nodeSubnets, listenerPort, backendPort)
305+
if err != nil {
306+
return err
307+
}
308308

309-
desired := spec.GetListeners(sslConfigMap)
310-
actions := getListenerChanges(lb.Listeners, desired)
311-
if len(actions) == 0 {
312-
return nil
309+
workRequestID, err = cp.client.DeleteBackendSet(lbOCID, be.Name, nil)
313310
}
314311

315-
lbSubnets, err := cp.client.GetSubnets(spec.Subnets)
316312
if err != nil {
317-
return fmt.Errorf("get subnets for lbs: %v", err)
313+
return err
318314
}
319315

320-
nodeSubnets, err := cp.client.GetSubnetsForNodes(spec.Nodes)
316+
_, err = cp.client.AwaitWorkRequest(workRequestID)
321317
if err != nil {
322-
return fmt.Errorf("get subnets for nodes: %v", err)
318+
return err
323319
}
324320

325-
for _, action := range actions {
326-
var workRequestID string
327-
var err error
328-
l := action.Listener
329-
listenerPort := uint64(l.Port)
330-
331-
backends := spec.GetBackendSets()[l.DefaultBackendSetName].Backends
332-
backendPort := uint64(getBackendPort(backends))
321+
return nil
322+
}
333323

334-
glog.V(2).Infof("Applying `%s` action on listener `%s` for lb `%s`", action.Type, l.Name, lbOCID)
324+
func (cp *CloudProvider) updateListener(lbOCID string,
325+
spec LBSpec,
326+
action *ListenerAction,
327+
lbSubnets []*baremetal.Subnet,
328+
nodeSubnets []*baremetal.Subnet,
329+
sslConfigMap map[int]*baremetal.SSLConfiguration,
330+
sourceCIDRs []string) error {
335331

336-
switch action.Type {
337-
case Create:
338-
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
339-
if err != nil {
340-
return err
341-
}
332+
var workRequestID string
333+
var err error
334+
l := action.Listener
335+
listenerPort := uint64(l.Port)
342336

343-
workRequestID, err = cp.client.CreateListener(
344-
lbOCID,
345-
l.Name,
346-
l.DefaultBackendSetName,
347-
l.Protocol,
348-
l.Port,
349-
l.SSLConfig,
350-
nil, // create opts
351-
)
352-
case Update:
353-
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
354-
if err != nil {
355-
return err
356-
}
337+
backends := spec.GetBackendSets()[l.DefaultBackendSetName].Backends
338+
backendPort := uint64(getBackendPort(backends))
357339

358-
workRequestID, err = cp.client.UpdateListener(lbOCID, l.Name, &baremetal.UpdateLoadBalancerListenerOptions{
359-
DefaultBackendSetName: l.DefaultBackendSetName,
360-
Port: l.Port,
361-
Protocol: l.Protocol,
362-
SSLConfig: l.SSLConfig,
363-
})
364-
case Delete:
365-
err = cp.securityListManager.Delete(lbSubnets, nodeSubnets, listenerPort, backendPort)
366-
if err != nil {
367-
return err
368-
}
340+
glog.V(2).Infof("Applying `%s` action on listener `%s` for lb `%s`", action.Type, l.Name, lbOCID)
369341

370-
workRequestID, err = cp.client.DeleteListener(lbOCID, l.Name, nil)
342+
switch action.Type() {
343+
case Create:
344+
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
345+
if err != nil {
346+
return err
371347
}
372348

349+
workRequestID, err = cp.client.CreateListener(
350+
lbOCID,
351+
l.Name,
352+
l.DefaultBackendSetName,
353+
l.Protocol,
354+
l.Port,
355+
l.SSLConfig,
356+
nil, // create opts
357+
)
358+
case Update:
359+
err = cp.securityListManager.Update(lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort)
373360
if err != nil {
374361
return err
375362
}
376363

377-
_, err = cp.client.AwaitWorkRequest(workRequestID)
364+
workRequestID, err = cp.client.UpdateListener(lbOCID, l.Name, &baremetal.UpdateLoadBalancerListenerOptions{
365+
DefaultBackendSetName: l.DefaultBackendSetName,
366+
Port: l.Port,
367+
Protocol: l.Protocol,
368+
SSLConfig: l.SSLConfig,
369+
})
370+
case Delete:
371+
err = cp.securityListManager.Delete(lbSubnets, nodeSubnets, listenerPort, backendPort)
378372
if err != nil {
379373
return err
380374
}
375+
376+
workRequestID, err = cp.client.DeleteListener(lbOCID, l.Name, nil)
377+
}
378+
379+
if err != nil {
380+
return err
381+
}
382+
383+
_, err = cp.client.AwaitWorkRequest(workRequestID)
384+
if err != nil {
385+
return err
381386
}
382387

383388
return nil

0 commit comments

Comments
 (0)