Skip to content

Commit 769a589

Browse files
jhorwit2prydie
authored andcommitted
fixed panic issue around deletes
1 parent 44d0e6a commit 769a589

File tree

4 files changed

+64
-18
lines changed

4 files changed

+64
-18
lines changed

pkg/oci/load_balancer.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,18 @@ func (cp *CloudProvider) updateLoadBalancer(lb *baremetal.LoadBalancer, spec LBS
254254
return fmt.Errorf("error updating BackendSet: %v", err)
255255
}
256256
case *ListenerAction:
257-
err := cp.updateListener(lbOCID, spec, a, lbSubnets, nodeSubnets, sslConfigMap, sourceCIDRs)
257+
backendSet := spec.GetBackendSets()[a.Listener.DefaultBackendSetName]
258+
if a.Type() == Delete {
259+
// If we need to delete the backendset then it'll no longer be present
260+
// in the spec since that's what is desired, so we need to fetch it
261+
// from the load balancer object.
262+
backendSet = lb.BackendSets[a.Listener.DefaultBackendSetName]
263+
}
264+
265+
backendPort := uint64(getBackendPort(backendSet.Backends))
266+
err := cp.updateListener(lbOCID, a, backendPort, lbSubnets, nodeSubnets, sslConfigMap, sourceCIDRs)
258267
if err != nil {
259-
return fmt.Errorf("error updating BackendSet: %v", err)
268+
return fmt.Errorf("error updating Listener: %v", err)
260269
}
261270
}
262271
}
@@ -271,7 +280,7 @@ func (cp *CloudProvider) updateBackendSet(lbOCID string, action *BackendSetActio
271280
var err error
272281

273282
be := action.BackendSet
274-
glog.V(2).Infof("Applying `%s` action on backend set `%s` for lb `%s`", action.Type, be.Name, lbOCID)
283+
glog.V(2).Infof("Applying %q action on backend set `%s` for lb `%s`", action.Type(), be.Name, lbOCID)
275284

276285
backendPort := uint64(getBackendPort(be.Backends))
277286

@@ -325,8 +334,8 @@ func (cp *CloudProvider) updateBackendSet(lbOCID string, action *BackendSetActio
325334
}
326335

327336
func (cp *CloudProvider) updateListener(lbOCID string,
328-
spec LBSpec,
329337
action *ListenerAction,
338+
backendPort uint64,
330339
lbSubnets []*baremetal.Subnet,
331340
nodeSubnets []*baremetal.Subnet,
332341
sslConfigMap map[int]*baremetal.SSLConfiguration,
@@ -337,10 +346,7 @@ func (cp *CloudProvider) updateListener(lbOCID string,
337346
l := action.Listener
338347
listenerPort := uint64(l.Port)
339348

340-
backends := spec.GetBackendSets()[l.DefaultBackendSetName].Backends
341-
backendPort := uint64(getBackendPort(backends))
342-
343-
glog.V(2).Infof("Applying `%s` action on listener `%s` for lb `%s`", action.Type, l.Name, lbOCID)
349+
glog.V(2).Infof("Applying %q action on listener `%s` for lb `%s`", action.Type(), l.Name, lbOCID)
344350

345351
switch action.Type() {
346352
case Create:

pkg/oci/load_balancer_security_lists.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,6 @@ func (s *securityListManagerImpl) updateSecurityListRules(securityListID string,
200200
return err
201201
}
202202

203-
func getBackendPort(backends []baremetal.Backend) uint64 {
204-
// TODO: what happens if this is 0? e.g. we scale the pods to 0 for a deployment
205-
return uint64(backends[0].Port)
206-
}
207-
208203
func getNodeIngressRules(securityList *baremetal.SecurityList, lbSubnets []*baremetal.Subnet, port uint64) []baremetal.IngressSecurityRule {
209204
desired := sets.NewString()
210205
for _, lbSubnet := range lbSubnets {

pkg/oci/load_balancer_util.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,8 @@ func sortAndCombineActions(backendSetActions []Action, listenerActions []Action)
310310
})
311311
return actions
312312
}
313+
314+
func getBackendPort(backends []baremetal.Backend) uint64 {
315+
// TODO: what happens if this is 0? e.g. we scale the pods to 0 for a deployment
316+
return uint64(backends[0].Port)
317+
}

test/integration/loadbalancer/loadbalancer_test.go

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ func testLoadBalancer(t *testing.T, internal bool) {
125125
nodes = append(nodes, node)
126126
}
127127

128+
glog.Info("Stating test on creating initial load balancer")
129+
128130
status, err := loadbalancers.EnsureLoadBalancer("foo", service, nodes)
129131
if err != nil {
130132
t.Fatalf("Unable to ensure the load balancer: %v", err)
@@ -137,6 +139,8 @@ func testLoadBalancer(t *testing.T, internal bool) {
137139
t.Fatalf("validation error: %v", err)
138140
}
139141

142+
glog.Info("Stating test on decreasing node count to 1")
143+
140144
// Decrease the number of backends to 1
141145
lessNodes := []*api.Node{nodes[0]}
142146
status, err = loadbalancers.EnsureLoadBalancer("foo", service, lessNodes)
@@ -149,6 +153,8 @@ func testLoadBalancer(t *testing.T, internal bool) {
149153
t.Fatalf("validation error: %v", err)
150154
}
151155

156+
glog.Info("Stating test on increasing node count back to 2")
157+
152158
// Go back to 2 nodes
153159
status, err = loadbalancers.EnsureLoadBalancer("foo", service, nodes)
154160
if err != nil {
@@ -159,6 +165,33 @@ func testLoadBalancer(t *testing.T, internal bool) {
159165
if err != nil {
160166
t.Fatalf("validation error: %v", err)
161167
}
168+
169+
glog.Info("Stating test on changing service port")
170+
171+
// Validate changing the service port.
172+
service.Spec.Ports[0].Port = 81
173+
status, err = loadbalancers.EnsureLoadBalancer("foo", service, nodes)
174+
if err != nil {
175+
t.Fatalf("Unable to ensure the load balancer: %v", err)
176+
}
177+
178+
err = validateLoadBalancer(fw.Client, service, nodes)
179+
if err != nil {
180+
t.Fatalf("validation error: %v", err)
181+
}
182+
183+
glog.Info("Stating test on changing node port")
184+
// Validate changing the node port.
185+
service.Spec.Ports[0].NodePort = 8081
186+
status, err = loadbalancers.EnsureLoadBalancer("foo", service, nodes)
187+
if err != nil {
188+
t.Fatalf("Unable to ensure the load balancer: %v", err)
189+
}
190+
191+
err = validateLoadBalancer(fw.Client, service, nodes)
192+
if err != nil {
193+
t.Fatalf("validation error: %v", err)
194+
}
162195
}
163196

164197
func validateLoadBalancer(client client.Interface, service *api.Service, nodes []*api.Node) error {
@@ -171,20 +204,27 @@ func validateLoadBalancer(client client.Interface, service *api.Service, nodes [
171204
}
172205

173206
if len(lb.Listeners) != 1 {
174-
return fmt.Errorf("Expected 1 Listener but got %d", len(lb.Listeners))
207+
return fmt.Errorf("expected 1 Listener but got %d", len(lb.Listeners))
175208
}
176209

177210
if len(lb.BackendSets) != 1 {
178-
return fmt.Errorf("Expected 1 BackendSet but got %d", len(lb.BackendSets))
211+
return fmt.Errorf("expected 1 BackendSet but got %d", len(lb.BackendSets))
179212
}
180213

181-
backendSet, ok := lb.BackendSets["TCP-80"]
214+
name := fmt.Sprintf("TCP-%d", service.Spec.Ports[0].Port)
215+
backendSet, ok := lb.BackendSets[name]
182216
if !ok {
183-
return fmt.Errorf("Expected BackendSet with name `TCP-80` to exist but it doesn't")
217+
return fmt.Errorf("expected BackendSet with name %q to exist but it doesn't", name)
184218
}
185219

186220
if len(backendSet.Backends) != len(nodes) {
187-
return fmt.Errorf("Expected %d backends but got %d", len(nodes), len(backendSet.Backends))
221+
return fmt.Errorf("expected %d backends but got %d", len(nodes), len(backendSet.Backends))
222+
}
223+
224+
expectedBackendPort := service.Spec.Ports[0].NodePort
225+
actualBackendPort := backendSet.Backends[0].Port
226+
if int(expectedBackendPort) != int(actualBackendPort) {
227+
return fmt.Errorf("expected backend port %d but got %d", expectedBackendPort, actualBackendPort)
188228
}
189229

190230
return nil

0 commit comments

Comments
 (0)