Skip to content

Commit c0b7153

Browse files
prydieayushverma14
authored andcommitted
Fix security list rules leak (oracle#151)
* Delete seclist rules based on actual lb state * Fix leak of security list rules on NodePort update * Fix health checker changed logic
1 parent 33af700 commit c0b7153

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

pkg/oci/load_balancer.go

+20-19
Original file line numberDiff line numberDiff line change
@@ -419,14 +419,14 @@ func (cp *CloudProvider) updateBackendSet(ctx context.Context, lbOCID string, ac
419419

420420
bs := action.BackendSet
421421

422-
glog.V(2).Infof("Applying %q action on backend set %q for lb %q", action.Type(), action.Name(), lbOCID)
423-
424422
if len(bs.Backends) < 1 {
425423
return errors.New("no backends provided")
426424
}
427425
backendPort := *bs.Backends[0].Port
428426
healthCheckPort := *bs.HealthChecker.Port
429427

428+
glog.V(2).Infof("Applying %q action on backend set %q for lb %q (listenerPort=%d backendPort=%d healthCheckPort=%d)", action.Type(), action.Name(), lbOCID, listenerPort, backendPort, healthCheckPort)
429+
430430
switch action.Type() {
431431
case Create:
432432
err = cp.securityListManager.Update(ctx, lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort, healthCheckPort)
@@ -436,11 +436,17 @@ func (cp *CloudProvider) updateBackendSet(ctx context.Context, lbOCID string, ac
436436

437437
workRequestID, err = cp.client.LoadBalancer().CreateBackendSet(ctx, lbOCID, action.Name(), bs)
438438
case Update:
439-
err = cp.securityListManager.Update(ctx, lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort, healthCheckPort)
440-
if err != nil {
439+
// FIXME(apryde): This is inelegant and inefficient. Update() should be refactored
440+
// to take the old backend port and handle removal of associated rules.
441+
if action.OldBackendSet != nil && *action.OldBackendSet.Backends[0].Port != backendPort {
442+
oldBackendPort := *action.OldBackendSet.Backends[0].Port
443+
if err = cp.securityListManager.Delete(ctx, lbSubnets, nodeSubnets, listenerPort, oldBackendPort, healthCheckPort); err != nil {
444+
return errors.Wrapf(err, "deleting security rule for old node port %d", oldBackendPort)
445+
}
446+
}
447+
if err = cp.securityListManager.Update(ctx, lbSubnets, nodeSubnets, sourceCIDRs, listenerPort, backendPort, healthCheckPort); err != nil {
441448
return err
442449
}
443-
444450
workRequestID, err = cp.client.LoadBalancer().UpdateBackendSet(ctx, lbOCID, action.Name(), bs)
445451
case Delete:
446452
err = cp.securityListManager.Delete(ctx, lbSubnets, nodeSubnets, listenerPort, backendPort, healthCheckPort)
@@ -567,35 +573,30 @@ func (cp *CloudProvider) EnsureLoadBalancerDeleted(clusterName string, service *
567573
if err != nil {
568574
return errors.Wrap(err, "fetching nodes by internal ips")
569575
}
570-
571-
spec, err := NewLBSpec(service, nodes, []string{cp.config.LoadBalancer.Subnet1, cp.config.LoadBalancer.Subnet2}, nil)
576+
nodeSubnets, err := getSubnetsForNodes(context.TODO(), nodes, cp.client)
572577
if err != nil {
573-
return errors.Wrap(err, "new lb spec")
578+
return errors.Wrap(err, "getting subnets for nodes")
574579
}
575580

576-
lbSubnets, err := getSubnets(context.TODO(), spec.Subnets, cp.client.Networking())
581+
lbSubnets, err := getSubnets(context.TODO(), lb.SubnetIds, cp.client.Networking())
577582
if err != nil {
578583
return errors.Wrap(err, "getting subnets for load balancers")
579584
}
580-
nodeSubnets, err := getSubnetsForNodes(context.TODO(), nodes, cp.client)
581-
if err != nil {
582-
return errors.Wrap(err, "getting subnets for nodes")
583-
}
584585

585-
for listenerName, listener := range spec.GetListeners() {
586+
for listenerName, listener := range lb.Listeners {
586587
glog.V(4).Infof("Deleting security rules for listener %q for load balancer %q", listenerName, id)
587588

588589
backendSetName := *listener.DefaultBackendSetName
589-
bs, ok := spec.GetBackendSets()[backendSetName]
590+
bs, ok := lb.BackendSets[backendSetName]
590591
if !ok {
591-
return errors.Errorf("no backend set %q in spec", backendSetName)
592+
return errors.Errorf("backend set %q missing (loadbalancer=%q)", backendSetName, id)
592593
}
593594
if len(bs.Backends) < 1 {
594-
return errors.Errorf("backend set %q has no backends", backendSetName)
595+
return errors.Errorf("backend set %q has no backends (loadbalancer=%q)", backendSetName, id)
595596
}
596597
backendPort := *bs.Backends[0].Port
597598
if bs.HealthChecker == nil {
598-
return errors.Errorf("backend set %q has no health checker", backendSetName)
599+
return errors.Errorf("backend set %q has no health checker (loadbalancer=%q)", backendSetName, id)
599600
}
600601
healthCheckPort := *bs.HealthChecker.Port
601602

@@ -613,8 +614,8 @@ func (cp *CloudProvider) EnsureLoadBalancerDeleted(clusterName string, service *
613614
if err != nil {
614615
return errors.Wrapf(err, "awaiting deletion of load balancer %q", name)
615616
}
616-
617617
glog.Infof("Deleted load balancer %q (OCID: %q)", name, id)
618+
618619
return nil
619620
}
620621

pkg/oci/load_balancer_util.go

+17-9
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ type BackendSetAction struct {
6161
actionType ActionType
6262
name string
6363

64-
BackendSet loadbalancer.BackendSetDetails
64+
BackendSet loadbalancer.BackendSetDetails
65+
OldBackendSet *loadbalancer.BackendSetDetails
6566
}
6667

6768
// Type of the Action.
@@ -125,34 +126,34 @@ func toInt(i *int) int {
125126

126127
func hasHealthCheckerChanged(actual *loadbalancer.HealthChecker, desired *loadbalancer.HealthCheckerDetails) bool {
127128
if actual == nil {
128-
return !(desired == nil)
129+
return desired != nil
129130
}
130131

131132
if toInt(actual.Port) != toInt(desired.Port) {
132-
return false
133+
return true
133134
}
134135

135136
if toString(actual.ResponseBodyRegex) != toString(desired.ResponseBodyRegex) {
136-
return false
137+
return true
137138
}
138139

139140
if toInt(actual.Retries) != toInt(desired.Retries) {
140-
return false
141+
return true
141142
}
142143

143144
if toInt(actual.ReturnCode) != toInt(desired.ReturnCode) {
144-
return false
145+
return true
145146
}
146147

147148
if toInt(actual.TimeoutInMillis) != toInt(desired.TimeoutInMillis) {
148-
return false
149+
return true
149150
}
150151

151152
if toString(actual.UrlPath) != toString(desired.UrlPath) {
152-
return false
153+
return true
153154
}
154155

155-
return true
156+
return false
156157
}
157158

158159
// TODO(horwitz): this doesn't check weight which we may want in the future to
@@ -257,6 +258,13 @@ func getBackendSetChanges(actual map[string]loadbalancer.BackendSet, desired map
257258
backendSetActions = append(backendSetActions, &BackendSetAction{
258259
name: name,
259260
BackendSet: desiredBackendSet,
261+
OldBackendSet: &loadbalancer.BackendSetDetails{
262+
HealthChecker: healthCheckerToDetails(actualBackendSet.HealthChecker),
263+
Policy: actualBackendSet.Policy,
264+
Backends: backendsToBackendDetails(actualBackendSet.Backends),
265+
SessionPersistenceConfiguration: actualBackendSet.SessionPersistenceConfiguration,
266+
SslConfiguration: sslConfigurationToDetails(actualBackendSet.SslConfiguration),
267+
},
260268
actionType: Update,
261269
})
262270
}

pkg/oci/load_balancer_util_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ func TestGetBackendSetChanges(t *testing.T) {
259259
{IpAddress: common.String("0.0.0.1"), Port: common.Int(80)},
260260
},
261261
},
262+
OldBackendSet: &loadbalancer.BackendSetDetails{
263+
Backends: []loadbalancer.BackendDetails{
264+
{IpAddress: common.String("0.0.0.0"), Port: common.Int(80)},
265+
},
266+
},
262267
},
263268
},
264269
},
@@ -289,6 +294,12 @@ func TestGetBackendSetChanges(t *testing.T) {
289294
{IpAddress: common.String("0.0.0.0"), Port: common.Int(80)},
290295
},
291296
},
297+
OldBackendSet: &loadbalancer.BackendSetDetails{
298+
Backends: []loadbalancer.BackendDetails{
299+
{IpAddress: common.String("0.0.0.0"), Port: common.Int(80)},
300+
{IpAddress: common.String("0.0.0.1"), Port: common.Int(80)},
301+
},
302+
},
292303
},
293304
},
294305
},

0 commit comments

Comments
 (0)