Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.

Commit b163f11

Browse files
authored
Merge pull request #61 from zongzw/zong-ns-reconciler
Add namespace event reconciler for namespace.label updating.(#58, #60 embeded)
2 parents 191d88d + baf322d commit b163f11

File tree

11 files changed

+538
-125
lines changed

11 files changed

+538
-125
lines changed

deploy/0.prepare-certificates.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ spec:
99
selfSigned: {}
1010

1111
---
12+
1213
apiVersion: cert-manager.io/v1
1314
kind: Certificate
1415
metadata:
@@ -25,7 +26,9 @@ spec:
2526
name: selfsigned-issuer
2627
kind: ClusterIssuer
2728
group: cert-manager.io
29+
2830
---
31+
2932
apiVersion: cert-manager.io/v1
3033
kind: Issuer
3134
metadata:
@@ -36,6 +39,7 @@ spec:
3639
secretName: root-secret
3740

3841
---
42+
3943
apiVersion: cert-manager.io/v1
4044
kind: Certificate
4145
metadata:

internal/controllers/httproute_controller.go

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"time"
2323

2424
"github.com/f5devcentral/bigip-kubernetes-gateway/internal/pkg"
25-
"github.com/google/uuid"
2625
"github.com/f5devcentral/f5-bigip-rest-go/deployer"
2726
"github.com/f5devcentral/f5-bigip-rest-go/utils"
27+
"github.com/google/uuid"
2828
ctrl "sigs.k8s.io/controller-runtime"
2929
"sigs.k8s.io/controller-runtime/pkg/client"
3030

@@ -78,7 +78,7 @@ func (r *HttpRouteReconciler) GetResObject() client.Object {
7878

7979
func handleDeletingHTTPRoute(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
8080
hr := pkg.ActiveSIGs.GetHTTPRoute(req.NamespacedName.String())
81-
gws := pkg.ActiveSIGs.GatewayRefsOf(hr)
81+
gws := pkg.ActiveSIGs.GatewayRefsOfHR(hr)
8282
drs := map[string]*deployer.DeployRequest{}
8383
for _, gw := range gws {
8484
if _, f := drs[string(gw.Spec.GatewayClassName)]; !f {
@@ -150,7 +150,7 @@ func handleUpsertingHTTPRoute(ctx context.Context, obj *gatewayv1beta1.HTTPRoute
150150
slog.Debugf("upserting " + reqnsn)
151151

152152
hr := pkg.ActiveSIGs.GetHTTPRoute(reqnsn)
153-
gws := pkg.ActiveSIGs.GatewayRefsOf(hr)
153+
gws := pkg.ActiveSIGs.GatewayRefsOfHR(hr)
154154
drs := map[string]*deployer.DeployRequest{}
155155

156156
for _, gw := range gws {
@@ -182,7 +182,7 @@ func handleUpsertingHTTPRoute(ctx context.Context, obj *gatewayv1beta1.HTTPRoute
182182

183183
// We still need to consider gateways that were previously associated but are no longer associated,
184184
// Or the previously associated gateways may be recognized as resource deletions.
185-
gws = unifiedGateways(append(gws, pkg.ActiveSIGs.GatewayRefsOf(obj.DeepCopy())...))
185+
gws = pkg.UnifiedGateways(append(gws, pkg.ActiveSIGs.GatewayRefsOfHR(obj.DeepCopy())...))
186186

187187
for _, gw := range gws {
188188
if _, f := drs[string(gw.Spec.GatewayClassName)]; !f {
@@ -219,18 +219,3 @@ func handleUpsertingHTTPRoute(ctx context.Context, obj *gatewayv1beta1.HTTPRoute
219219

220220
return ctrl.Result{}, nil
221221
}
222-
223-
func unifiedGateways(objs []*gatewayv1beta1.Gateway) []*gatewayv1beta1.Gateway {
224-
225-
m := map[string]bool{}
226-
rlt := []*gatewayv1beta1.Gateway{}
227-
228-
for _, obj := range objs {
229-
name := utils.Keyname(obj.Namespace, obj.Name)
230-
if _, f := m[name]; !f {
231-
m[name] = true
232-
rlt = append(rlt, obj)
233-
}
234-
}
235-
return rlt
236-
}

internal/controllers/referencegrant_controller.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"time"
2223

2324
"github.com/f5devcentral/bigip-kubernetes-gateway/internal/pkg"
24-
"github.com/google/uuid"
2525
"github.com/f5devcentral/f5-bigip-rest-go/utils"
26+
"github.com/google/uuid"
2627
ctrl "sigs.k8s.io/controller-runtime"
2728
"sigs.k8s.io/controller-runtime/pkg/client"
2829
gatewayv1beta1 "sigs.k8s.io/gateway-api/apis/v1beta1"
@@ -44,23 +45,42 @@ func (r *ReferenceGrantReconciler) Reconcile(ctx context.Context, req ctrl.Reque
4445
return ctrl.Result{Requeue: true}, nil
4546
}
4647

48+
keyname := req.NamespacedName.String()
4749
lctx := context.WithValue(ctx, utils.CtxKey_Logger, utils.NewLog().WithRequestID(uuid.New().String()).WithLevel(r.LogLevel))
4850
slog := utils.LogFromContext(lctx)
4951

5052
var obj gatewayv1beta1.ReferenceGrant
5153
slog.Infof("referencegrant event: %s", req.NamespacedName)
52-
// TODO: update resources mappings since grant items are changed.
5354
if err := r.Client.Get(ctx, req.NamespacedName, &obj); err != nil {
5455
if client.IgnoreNotFound(err) == nil {
5556
// delete resources
56-
pkg.ActiveSIGs.UnsetReferenceGrant(req.NamespacedName.String())
57-
return ctrl.Result{}, nil
57+
rg := pkg.ActiveSIGs.GetReferenceGrant(keyname)
58+
classNames := pkg.ActiveSIGs.RGImpactedGatewayClasses(rg)
59+
if err := pkg.DeployForEvent(lctx, classNames, func() string {
60+
pkg.ActiveSIGs.UnsetReferenceGrant(keyname)
61+
return fmt.Sprintf("deleting referencegrant %s", keyname)
62+
}); err != nil {
63+
return ctrl.Result{}, err
64+
} else {
65+
return ctrl.Result{}, nil
66+
}
5867
} else {
5968
return ctrl.Result{}, err
6069
}
6170
} else {
6271
// upsert resources
63-
pkg.ActiveSIGs.SetReferenceGrant(obj.DeepCopy())
64-
return ctrl.Result{}, nil
72+
org := pkg.ActiveSIGs.GetReferenceGrant(keyname)
73+
nrg := obj.DeepCopy()
74+
ocls := pkg.ActiveSIGs.RGImpactedGatewayClasses(org)
75+
ncls := pkg.ActiveSIGs.RGImpactedGatewayClasses(nrg)
76+
clss := utils.Unified(append(ocls, ncls...))
77+
if err := pkg.DeployForEvent(lctx, clss, func() string {
78+
pkg.ActiveSIGs.SetReferenceGrant(nrg)
79+
return fmt.Sprintf("upserting referencegrant %s", keyname)
80+
}); err != nil {
81+
return ctrl.Result{}, nil
82+
} else {
83+
return ctrl.Result{}, err
84+
}
6585
}
6686
}

internal/controllers/secret_controller.go

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ package controllers
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"time"
2223

2324
"github.com/f5devcentral/bigip-kubernetes-gateway/internal/pkg"
24-
"github.com/google/uuid"
2525
"github.com/f5devcentral/f5-bigip-rest-go/utils"
26+
"github.com/google/uuid"
2627
v1 "k8s.io/api/core/v1"
2728
ctrl "sigs.k8s.io/controller-runtime"
2829
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -48,17 +49,51 @@ func (r *SecretReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
4849
slog := utils.LogFromContext(lctx)
4950

5051
var obj v1.Secret
51-
slog.Infof("serect event: %s", req.NamespacedName)
52+
slog.Infof("secret event: %s", req.NamespacedName)
5253

5354
if err := r.Client.Get(ctx, req.NamespacedName, &obj); err != nil {
54-
if client.IgnoreNotFound(err) != nil {
55+
if client.IgnoreNotFound(err) == nil {
56+
// delete
57+
scrt := pkg.ActiveSIGs.GetSecret(req.NamespacedName.String())
58+
gws, err := pkg.ActiveSIGs.GatewayRefsOfSecret(scrt)
59+
if err == nil {
60+
names := []string{}
61+
for _, gw := range gws {
62+
names = append(names, utils.Keyname(gw.Namespace, gw.Name))
63+
}
64+
if len(names) > 0 {
65+
slog.Warnf("there are still gateways referring to secret '%s': %s "+
66+
"-- they are not impacted, however, next deployments would fail "+
67+
"because of missing the secret", req.NamespacedName, names)
68+
}
69+
}
70+
71+
pkg.ActiveSIGs.UnsetSerect(req.NamespacedName.String())
72+
return ctrl.Result{}, err
73+
} else {
74+
return ctrl.Result{}, err
75+
}
76+
} else {
77+
// upsert
78+
scrt := obj.DeepCopy()
79+
gws, err := pkg.ActiveSIGs.GatewayRefsOfSecret(scrt)
80+
if err != nil {
81+
pkg.ActiveSIGs.SetSecret(obj.DeepCopy())
5582
return ctrl.Result{}, err
5683
}
57-
// Can not find Sercet, remove it from the local cache
58-
pkg.ActiveSIGs.UnsetSerect(req.NamespacedName.String())
84+
cls := []string{}
85+
for _, gw := range gws {
86+
cls = append(cls, string(gw.Spec.GatewayClassName))
87+
}
88+
89+
apply := func() string {
90+
pkg.ActiveSIGs.SetSecret(obj.DeepCopy())
91+
return fmt.Sprintf("upserting secret %s", req.NamespacedName.String())
92+
}
93+
if err := pkg.DeployForEvent(lctx, cls, apply); err != nil {
94+
return ctrl.Result{}, err
95+
}
96+
5997
return ctrl.Result{}, nil
6098
}
61-
// Find Secret, add it to the local cache.
62-
pkg.ActiveSIGs.SetSecret(obj.DeepCopy())
63-
return ctrl.Result{}, nil
6499
}

internal/controllers/v1_controller.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import (
2323

2424
"github.com/f5devcentral/bigip-kubernetes-gateway/internal/k8s"
2525
"github.com/f5devcentral/bigip-kubernetes-gateway/internal/pkg"
26-
"github.com/google/uuid"
2726
"github.com/f5devcentral/f5-bigip-rest-go/deployer"
2827
"github.com/f5devcentral/f5-bigip-rest-go/utils"
28+
"github.com/google/uuid"
2929
ctrl "sigs.k8s.io/controller-runtime"
3030
"sigs.k8s.io/controller-runtime/pkg/client"
3131

@@ -77,6 +77,18 @@ func (r *NamespaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
7777
return ctrl.Result{}, err
7878
}
7979
} else {
80+
ns := pkg.ActiveSIGs.GetNamespace(req.Name)
81+
if ns != nil && !utils.DeepEqual(ns.Labels, obj.Labels) {
82+
cls := pkg.ActiveSIGs.NSImpactedGatewayClasses(&obj)
83+
err := pkg.DeployForEvent(lctx, cls, func() string {
84+
pkg.ActiveSIGs.SetNamespace(obj.DeepCopy())
85+
return "updating namespace " + ns.Name
86+
})
87+
if err != nil {
88+
return ctrl.Result{}, err
89+
}
90+
}
91+
8092
pkg.ActiveSIGs.SetNamespace(obj.DeepCopy())
8193
return ctrl.Result{}, nil
8294
}
@@ -99,8 +111,9 @@ func (r *EndpointsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
99111
return ctrl.Result{}, err
100112
}
101113
} else {
102-
defer pkg.ActiveSIGs.SetEndpoints(&obj)
103-
return handleUpsertingEndpoints(lctx, &obj)
114+
eps := obj.DeepCopy()
115+
defer pkg.ActiveSIGs.SetEndpoints(eps)
116+
return handleUpsertingEndpoints(lctx, eps)
104117
}
105118
}
106119

@@ -121,8 +134,9 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
121134
return ctrl.Result{}, err
122135
}
123136
} else {
124-
defer pkg.ActiveSIGs.SetService(&obj)
125-
return handleUpsertingService(lctx, &obj)
137+
svc := obj.DeepCopy()
138+
defer pkg.ActiveSIGs.SetService(svc)
139+
return handleUpsertingService(lctx, svc)
126140
}
127141
}
128142

0 commit comments

Comments
 (0)