Skip to content

Commit 9653ed9

Browse files
committed
fix tg config deletion when gw is stuck in programmed = false
1 parent 2a5c053 commit 9653ed9

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

controllers/gateway/gateway_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,6 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
277277
r.logger.Error(err, "Failed to process gateway delete")
278278
return err
279279
}
280-
r.serviceReferenceCounter.UpdateRelations([]types.NamespacedName{}, k8s.NamespacedName(gw), true)
281280
return nil
282281
}
283282
r.serviceReferenceCounter.UpdateRelations(getServicesFromRoutes(allRoutes), k8s.NamespacedName(gw), false)
@@ -313,6 +312,7 @@ func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gatewa
313312
if err := r.backendSGProvider.Release(ctx, networking.ResourceTypeGateway, []types.NamespacedName{k8s.NamespacedName(gw)}); err != nil {
314313
return err
315314
}
315+
r.serviceReferenceCounter.UpdateRelations([]types.NamespacedName{}, k8s.NamespacedName(gw), true)
316316
// remove gateway finalizer
317317
if err := r.finalizerManager.RemoveFinalizers(ctx, gw, r.finalizer); err != nil {
318318
r.eventRecorder.Event(gw, corev1.EventTypeWarning, k8s.GatewayEventReasonFailedRemoveFinalizer, fmt.Sprintf("Failed remove gateway finalizer due to %v", err))

controllers/gateway/targetgroup_configuration_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/go-logr/logr"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78
"k8s.io/apimachinery/pkg/types"
89
"k8s.io/client-go/kubernetes"
910
"k8s.io/client-go/tools/record"
@@ -98,7 +99,14 @@ func (r *targetgroupConfigurationReconciler) handleDelete(tgConf *elbv2gw.Target
9899
}
99100

100101
for _, gw := range partial {
101-
allGateways = append(allGateways, k8s.NamespacedName(gw))
102+
103+
if gw.Status.Conditions != nil {
104+
for _, cond := range gw.Status.Conditions {
105+
if cond.Type == string(gwv1.GatewayReasonAccepted) && cond.Status == metav1.ConditionTrue {
106+
allGateways = append(allGateways, k8s.NamespacedName(gw))
107+
}
108+
}
109+
}
102110
}
103111
}
104112

pkg/gateway/referencecounter/service_reference_counter.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package referencecounter
22

33
import (
4+
"github.com/go-logr/logr"
45
"k8s.io/apimachinery/pkg/types"
56
"k8s.io/apimachinery/pkg/util/sets"
67
"sync"
@@ -13,7 +14,8 @@ type ServiceReferenceCounter interface {
1314
}
1415

1516
type serviceReferenceCounter struct {
16-
mutex sync.RWMutex
17+
logger logr.Logger
18+
mutex sync.RWMutex
1719
// key: gateway, value: set of svc
1820
relations map[types.NamespacedName]sets.Set[types.NamespacedName]
1921
refCount map[types.NamespacedName]int
@@ -65,17 +67,19 @@ func (t *serviceReferenceCounter) updateRefCount(svcs sets.Set[types.NamespacedN
6567
func (t *serviceReferenceCounter) IsEligibleForRemoval(svcName types.NamespacedName, expectedGateways []types.NamespacedName) bool {
6668
t.mutex.RLock()
6769
defer t.mutex.RUnlock()
68-
_, ok := t.refCount[svcName]
70+
v, ok := t.refCount[svcName]
6971
// If we have a ref count for this service, we can't remove it.
7072
// updateRefCount should always remove 0 entry services.
7173
if ok {
74+
t.logger.Info("Got a ref count!", "ref", v)
7275
return false
7376
}
7477

7578
// Next we check if the Gateway cache is correctly populated. This prevents premature removal of items
7679
// when the cache is not warm.
7780
for _, gw := range expectedGateways {
7881
if _, exists := t.relations[gw]; !exists {
82+
t.logger.Info("Missing relation", "gateway", gw)
7983
return false
8084
}
8185
}

0 commit comments

Comments
 (0)