Skip to content

Commit 21fd491

Browse files
committed
Remove clean up logic and fix the lbcfg in use logic
1 parent 097feb1 commit 21fd491

File tree

5 files changed

+34
-61
lines changed

5 files changed

+34
-61
lines changed

controllers/gateway/eventhandlers/gateway_class_events.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package eventhandlers
33
import (
44
"context"
55
"github.com/go-logr/logr"
6-
"k8s.io/apimachinery/pkg/util/sets"
76
"k8s.io/client-go/tools/record"
87
"k8s.io/client-go/util/workqueue"
98
"sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/gatewayutils"
@@ -53,13 +52,6 @@ func (h *enqueueRequestsForGatewayClassEvent) Update(ctx context.Context, e even
5352

5453
// Delete is not implemented for this handler as GatewayClass deletion should be finalized and is prevented while referenced by Gateways
5554
func (h *enqueueRequestsForGatewayClassEvent) Delete(ctx context.Context, e event.TypedDeleteEvent[*gatewayv1.GatewayClass], queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {
56-
gwClass := e.Object
57-
h.logger.V(1).Info("enqueue gatewayclass delete event", "gatewayclass", gwClass.Name)
58-
// remove the load balancer configuration finalizer if there are any referred by this gwclass
59-
if err := gatewayutils.RemoveLoadBalancerConfigurationFinalizers(ctx, nil, gwClass, h.k8sClient, h.finalizerManager, sets.New(h.gwController)); err != nil {
60-
h.logger.V(1).Info("failed to remove finalizers on load balancer configuration for ", "gateway class", gwClass.Name)
61-
return
62-
}
6355
}
6456

6557
func (h *enqueueRequestsForGatewayClassEvent) Generic(ctx context.Context, e event.TypedGenericEvent[*gatewayv1.GatewayClass], queue workqueue.TypedRateLimitingInterface[reconcile.Request]) {

controllers/gateway/eventhandlers/gatewayclass/load_balancer_configuration_events.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (h *enqueueRequestsForLoadBalancerConfigurationEvent) Update(ctx context.Co
5252
lbconfigNew := e.ObjectNew
5353
h.logger.V(1).Info("enqueue loadbalancerconfiguration update event", "loadbalancerconfiguration", k8s.NamespacedName(lbconfigNew))
5454
// to remove finalizers on this residual unused lb config so that the deletion can be done on these
55-
if !lbconfigNew.DeletionTimestamp.IsZero() && k8s.HasFinalizer(lbconfigNew, shared_constants.LoadBalancerConfigurationFinalizer) && !gatewayutils.IsLBConfigInUse(ctx, lbconfigNew, nil, nil, h.k8sClient, h.gwControllers) {
55+
if !lbconfigNew.DeletionTimestamp.IsZero() && k8s.HasFinalizer(lbconfigNew, shared_constants.LoadBalancerConfigurationFinalizer) && !gatewayutils.IsLBConfigInUse(ctx, lbconfigNew, nil, nil, h.k8sClient) {
5656
if err := h.finalizerManager.RemoveFinalizers(ctx, lbconfigNew, shared_constants.LoadBalancerConfigurationFinalizer); err != nil {
5757
h.logger.V(1).Info("failed to remove finalizers on load balancer configuration as its currently in use", "load balancer configuration", lbconfigNew.Name)
5858
return

controllers/gateway/gateway_controller.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,7 @@ type gatewayReconciler struct {
165165
func (r *gatewayReconciler) Reconcile(ctx context.Context, req reconcile.Request) (ctrl.Result, error) {
166166
r.reconcileTracker(req.NamespacedName)
167167
err := r.reconcileHelper(ctx, req)
168-
res, reconcileErr := runtime.HandleReconcileError(err, r.logger)
169-
if reconcileErr != nil {
170-
return res, reconcileErr
171-
}
172-
//if reconcile was successful, then clean up residual finalizers on unused resources
173-
r.cleanUpResidualFinalizers()
174-
return res, nil
168+
return runtime.HandleReconcileError(err, r.logger)
175169
}
176170

177171
func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.Request) error {
@@ -258,7 +252,7 @@ func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gatewa
258252
return err
259253
}
260254
// remove load balancer configuration finalizer
261-
if err := gatewayutils.RemoveLoadBalancerConfigurationFinalizers(ctx, gw, gwClass, r.k8sClient, r.finalizerManager, sets.New(r.controllerName)); err != nil {
255+
if err := gatewayutils.RemoveLoadBalancerConfigurationFinalizers(ctx, gw, gwClass, r.k8sClient, r.finalizerManager); err != nil {
262256
r.eventRecorder.Event(gw, corev1.EventTypeWarning, k8s.LoadBalancerConfigurationEventReasonFailedRemoveFinalizer, fmt.Sprintf("Failed remove load balancer configuration finalizer due to %v", err))
263257
return err
264258
}
@@ -545,23 +539,3 @@ func isGatewayProgrammed(lbStatus elbv2model.LoadBalancerStatus) bool {
545539
return lbStatus.ProvisioningState.Code == elbv2types.LoadBalancerStateEnumActive || lbStatus.ProvisioningState.Code == elbv2types.LoadBalancerStateEnumActiveImpaired
546540

547541
}
548-
549-
// We remove the finalizers on any lb config which is not being used anymore by any gateways so that these lb configs can be deleted safely
550-
// This is a low priority task and hence we dont want to block reconciler by throwing any errors if the removal of finalizers fails for some reason. It may be retried later.
551-
func (r *gatewayReconciler) cleanUpResidualFinalizers() {
552-
lbConfigList := &elbv2gw.LoadBalancerConfigurationList{}
553-
// TODO: Implement cache
554-
if err := r.k8sClient.List(context.Background(), lbConfigList); err != nil {
555-
r.logger.Error(err, "failed to fetch load balancer configurations for clean up residual finalizersß")
556-
return
557-
}
558-
for i, _ := range lbConfigList.Items {
559-
lbConfig := &lbConfigList.Items[i]
560-
if k8s.HasFinalizer(lbConfig, shared_constants.LoadBalancerConfigurationFinalizer) && !gatewayutils.IsLBConfigInUse(context.Background(), lbConfig, nil, nil, r.k8sClient, sets.New(r.controllerName)) {
561-
if err := r.finalizerManager.RemoveFinalizers(context.Background(), lbConfig, shared_constants.LoadBalancerConfigurationFinalizer); err != nil {
562-
r.logger.V(1).Info("failed to remove finalizers on load balancer configuration", "load balancer configuration", k8s.NamespacedName(lbConfig))
563-
}
564-
return
565-
}
566-
}
567-
}

pkg/gateway/gatewayutils/lb_config_utils.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import (
66
"k8s.io/apimachinery/pkg/types"
77
"k8s.io/apimachinery/pkg/util/sets"
88
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
9+
"sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/constants"
910
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
1011
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_constants"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
1213
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
1314
)
1415

15-
func RemoveLoadBalancerConfigurationFinalizers(ctx context.Context, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, k8sClient client.Client, manager k8s.FinalizerManager, controllerNames sets.Set[string]) error {
16+
func RemoveLoadBalancerConfigurationFinalizers(ctx context.Context, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, k8sClient client.Client, manager k8s.FinalizerManager) error {
1617
// remove finalizer from lbConfig - gatewayClass
1718
if gwClass != nil {
1819
gatewayClassLBConfig, err := ResolveLoadBalancerConfig(ctx, k8sClient, gwClass.Spec.ParametersRef)
@@ -22,7 +23,7 @@ func RemoveLoadBalancerConfigurationFinalizers(ctx context.Context, gw *gwv1.Gat
2223
// remove finalizer if it exists and it not in use
2324
if gatewayClassLBConfig != nil &&
2425
k8s.HasFinalizer(gatewayClassLBConfig, shared_constants.LoadBalancerConfigurationFinalizer) &&
25-
!IsLBConfigInUse(ctx, gatewayClassLBConfig, gw, gwClass, k8sClient, controllerNames) {
26+
!IsLBConfigInUse(ctx, gatewayClassLBConfig, gw, gwClass, k8sClient) {
2627
if err := manager.RemoveFinalizers(ctx, gatewayClassLBConfig, shared_constants.LoadBalancerConfigurationFinalizer); err != nil {
2728
return err
2829
}
@@ -38,7 +39,7 @@ func RemoveLoadBalancerConfigurationFinalizers(ctx context.Context, gw *gwv1.Gat
3839
// remove finalizer if it exists and it is not in use
3940
if gatewayLBConfig != nil &&
4041
k8s.HasFinalizer(gatewayLBConfig, shared_constants.LoadBalancerConfigurationFinalizer) &&
41-
!IsLBConfigInUse(ctx, gatewayLBConfig, gw, gwClass, k8sClient, controllerNames) {
42+
!IsLBConfigInUse(ctx, gatewayLBConfig, gw, gwClass, k8sClient) {
4243
if err := manager.RemoveFinalizers(ctx, gatewayLBConfig, shared_constants.LoadBalancerConfigurationFinalizer); err != nil {
4344
return err
4445
}
@@ -68,10 +69,14 @@ func ResolveLoadBalancerConfig(ctx context.Context, k8sClient client.Client, ref
6869
return lbConf, err
6970
}
7071

71-
func IsLBConfigInUse(ctx context.Context, lbConfig *elbv2gw.LoadBalancerConfiguration, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, k8sClient client.Client, controllerNames sets.Set[string]) bool {
72+
func IsLBConfigInUse(ctx context.Context, lbConfig *elbv2gw.LoadBalancerConfiguration, gw *gwv1.Gateway, gwClass *gwv1.GatewayClass, k8sClient client.Client) bool {
73+
//we want to make sure that we check the lb config is being used either by L4 or L7 gateways
74+
controllerNames := sets.New(constants.ALBGatewayController, constants.NLBGatewayController)
7275
return IsLBConfigInUseByGatewayClass(ctx, lbConfig, gw, gwClass, k8sClient, controllerNames) ||
7376
IsLBConfigInUseByGateway(ctx, lbConfig, gw, k8sClient, controllerNames)
7477
}
78+
79+
// checks if the lbconfig is indirectly being used by any gateways of the gwclass
7580
func IsLBConfigInUseByGatewayClass(ctx context.Context, lbConfig *elbv2gw.LoadBalancerConfiguration, currGw *gwv1.Gateway, gwClass *gwv1.GatewayClass, k8sClient client.Client, controllerNames sets.Set[string]) bool {
7681
// fetch all the gateway classes referenced by lb config
7782
gwClassesUsingLBConfig := GetImpactedGatewayClassesFromLbConfig(ctx, k8sClient, lbConfig, controllerNames)
@@ -94,24 +99,27 @@ func IsLBConfigInUseByGatewayClass(ctx context.Context, lbConfig *elbv2gw.LoadBa
9499
// iterate through each GatewayClass identified as referencing the LoadBalancerConfiguration
95100
// the lbconfig is deemed to be in active use if any of these GatewayClasses
96101
// are found to be managing one or more active Gateway resources.
102+
gwsUsingLBConfig := make([]*gwv1.Gateway, 0)
97103
for _, controllerName := range controllerNames.UnsortedList() {
98104
for _, gwClassUsingLBConfig := range gwClassesUsingLBConfig {
99105
gwList := GetGatewaysManagedByGatewayClass(ctx, k8sClient, gwClassUsingLBConfig, controllerName)
100-
if currGw == nil {
101-
return len(gwList) > 0
102-
}
103-
//skip the current gw from the list if it is not nil
104-
for _, gw := range gwList {
105-
if k8s.NamespacedName(currGw) != k8s.NamespacedName(gw) {
106-
return true
107-
}
108-
}
106+
gwsUsingLBConfig = append(gwsUsingLBConfig, gwList...)
107+
}
108+
}
109+
if currGw == nil {
110+
return len(gwsUsingLBConfig) > 0
111+
}
112+
//skip the current gw from the list if it is not nil
113+
for _, gw := range gwsUsingLBConfig {
114+
if k8s.NamespacedName(currGw) != k8s.NamespacedName(gw) {
115+
return true
109116
}
110117
}
111118

112119
return false
113120
}
114121

122+
// checks if lbconfig is directly being used by any gateways
115123
func IsLBConfigInUseByGateway(ctx context.Context, lbConfig *elbv2gw.LoadBalancerConfiguration, gw *gwv1.Gateway, k8sClient client.Client, controllerNames sets.Set[string]) bool {
116124
var gwsUsingLBConfig []*gwv1.Gateway
117125
for _, controllerName := range controllerNames.UnsortedList() {

pkg/gateway/gatewayutils/lb_config_utils_test.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/stretchr/testify/assert"
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1010
"k8s.io/apimachinery/pkg/types"
11-
"k8s.io/apimachinery/pkg/util/sets"
1211
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
1312
mock_client "sigs.k8s.io/aws-load-balancer-controller/mocks/controller-runtime/client"
1413
"sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/constants"
@@ -85,7 +84,6 @@ func Test_RemoveLoadBalancerConfigurationFinalizers(t *testing.T) {
8584
k8sClient := mock_client.NewMockClient(ctrl)
8685
k8sFinalizerManager := k8s.NewMockFinalizerManager(ctrl)
8786
ctx := context.Background()
88-
controllerName := "test-controller"
8987
testGwName := "test-gw"
9088
testNamespace := "test-ns"
9189
testLbConfigName := "test-lb-config"
@@ -124,14 +122,15 @@ func Test_RemoveLoadBalancerConfigurationFinalizers(t *testing.T) {
124122
obj.Finalizers = []string{shared_constants.LoadBalancerConfigurationFinalizer}
125123
return nil
126124
})
127-
125+
k8sClient.EXPECT().
126+
List(ctx, &gwv1.GatewayClassList{}, gomock.Any()).
127+
Return(nil)
128128
k8sClient.EXPECT().
129129
List(ctx, &gwv1.GatewayList{}, gomock.Any()).
130130
Return(nil)
131131
k8sClient.EXPECT().
132-
List(ctx, &gwv1.GatewayClassList{}, gomock.Any()).
132+
List(ctx, &gwv1.GatewayList{}, gomock.Any()).
133133
Return(nil)
134-
135134
k8sFinalizerManager.EXPECT().
136135
RemoveFinalizers(ctx, gomock.Any(), shared_constants.LoadBalancerConfigurationFinalizer).
137136
Return(nil)
@@ -162,14 +161,15 @@ func Test_RemoveLoadBalancerConfigurationFinalizers(t *testing.T) {
162161
obj.Finalizers = []string{shared_constants.LoadBalancerConfigurationFinalizer}
163162
return nil
164163
})
165-
164+
k8sClient.EXPECT().
165+
List(ctx, &gwv1.GatewayClassList{}, gomock.Any()).
166+
Return(nil)
166167
k8sClient.EXPECT().
167168
List(ctx, &gwv1.GatewayList{}, gomock.Any()).
168169
Return(nil)
169170
k8sClient.EXPECT().
170-
List(ctx, &gwv1.GatewayClassList{}, gomock.Any()).
171+
List(ctx, &gwv1.GatewayList{}, gomock.Any()).
171172
Return(nil)
172-
173173
k8sFinalizerManager.EXPECT().
174174
RemoveFinalizers(ctx, gomock.Any(), shared_constants.LoadBalancerConfigurationFinalizer).
175175
Return(fmt.Errorf("failed to remove finalizer"))
@@ -181,7 +181,7 @@ func Test_RemoveLoadBalancerConfigurationFinalizers(t *testing.T) {
181181
for _, tt := range tests {
182182
t.Run(tt.name, func(t *testing.T) {
183183
tt.setupMocks()
184-
err := RemoveLoadBalancerConfigurationFinalizers(ctx, tt.gateway, tt.gatewayClass, k8sClient, k8sFinalizerManager, sets.New(controllerName))
184+
err := RemoveLoadBalancerConfigurationFinalizers(ctx, tt.gateway, tt.gatewayClass, k8sClient, k8sFinalizerManager)
185185
if tt.wantErr {
186186
assert.Error(t, err)
187187
} else {
@@ -198,7 +198,6 @@ func Test_isLBConfigInUse(t *testing.T) {
198198

199199
k8sClient := mock_client.NewMockClient(ctrl)
200200
ctx := context.Background()
201-
controllerName := "test-controller"
202201
testNamespace := "test-ns"
203202

204203
tests := []struct {
@@ -267,7 +266,7 @@ func Test_isLBConfigInUse(t *testing.T) {
267266
for _, tt := range tests {
268267
t.Run(tt.name, func(t *testing.T) {
269268
tt.setupMocks()
270-
got := IsLBConfigInUse(ctx, tt.lbConfig, tt.gateway, tt.gatewayClass, k8sClient, sets.New(controllerName))
269+
got := IsLBConfigInUse(ctx, tt.lbConfig, tt.gateway, tt.gatewayClass, k8sClient)
271270
assert.Equal(t, tt.want, got)
272271
})
273272
}

0 commit comments

Comments
 (0)