@@ -4,12 +4,14 @@ import (
4
4
"context"
5
5
"fmt"
6
6
7
+ "istio.io/istio/pkg/kube/krt"
7
8
"istio.io/istio/pkg/kube/kubetypes"
8
9
"k8s.io/apimachinery/pkg/api/meta"
9
10
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
11
"k8s.io/apimachinery/pkg/fields"
11
12
"k8s.io/apimachinery/pkg/runtime"
12
13
"k8s.io/apimachinery/pkg/runtime/schema"
14
+ "k8s.io/apimachinery/pkg/types"
13
15
ctrl "sigs.k8s.io/controller-runtime"
14
16
"sigs.k8s.io/controller-runtime/pkg/builder"
15
17
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -19,12 +21,15 @@ import (
19
21
"sigs.k8s.io/controller-runtime/pkg/manager"
20
22
"sigs.k8s.io/controller-runtime/pkg/predicate"
21
23
"sigs.k8s.io/controller-runtime/pkg/reconcile"
24
+ "sigs.k8s.io/controller-runtime/pkg/source"
22
25
infextv1a2 "sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2"
23
26
apiv1 "sigs.k8s.io/gateway-api/apis/v1"
24
27
25
28
"github.com/kgateway-dev/kgateway/v2/api/v1alpha1"
26
29
"github.com/kgateway-dev/kgateway/v2/internal/kgateway/deployer"
30
+ "github.com/kgateway-dev/kgateway/v2/internal/kgateway/ir"
27
31
"github.com/kgateway-dev/kgateway/v2/internal/kgateway/wellknown"
32
+ common "github.com/kgateway-dev/kgateway/v2/pkg/pluginsdk/collections"
28
33
)
29
34
30
35
const (
@@ -68,6 +73,8 @@ type GatewayConfig struct {
68
73
ClassInfo map [string ]* ClassInfo
69
74
// DiscoveryNamespaceFilter filters namespaced objects based on the discovery namespace filter.
70
75
DiscoveryNamespaceFilter kubetypes.DynamicObjectFilter
76
+ // CommonCollections used to fetch ir.Gateways for the deployer to generate the ports for the proxy service
77
+ CommonCollections * common.CommonCollections
71
78
}
72
79
73
80
func NewBaseGatewayController (ctx context.Context , cfg GatewayConfig ) error {
@@ -77,8 +84,9 @@ func NewBaseGatewayController(ctx context.Context, cfg GatewayConfig) error {
77
84
controllerBuilder := & controllerBuilder {
78
85
cfg : cfg ,
79
86
reconciler : & controllerReconciler {
80
- cli : cfg .Mgr .GetClient (),
81
- scheme : cfg .Mgr .GetScheme (),
87
+ cli : cfg .Mgr .GetClient (),
88
+ scheme : cfg .Mgr .GetScheme (),
89
+ customEvents : make (chan event.TypedGenericEvent [ir.Gateway ], 1024 ),
82
90
},
83
91
}
84
92
@@ -105,8 +113,9 @@ func NewBaseInferencePoolController(ctx context.Context, poolCfg *InferencePoolC
105
113
cfg : * gwCfg ,
106
114
poolCfg : poolCfg ,
107
115
reconciler : & controllerReconciler {
108
- cli : poolCfg .Mgr .GetClient (),
109
- scheme : poolCfg .Mgr .GetScheme (),
116
+ cli : poolCfg .Mgr .GetClient (),
117
+ scheme : poolCfg .Mgr .GetScheme (),
118
+ customEvents : make (chan event.TypedGenericEvent [ir.Gateway ], 1024 ),
110
119
},
111
120
}
112
121
@@ -173,6 +182,7 @@ func (c *controllerBuilder) watchGw(ctx context.Context) error {
173
182
IstioAutoMtlsEnabled : c .cfg .IstioAutoMtlsEnabled ,
174
183
ControlPlane : c .cfg .ControlPlane ,
175
184
ImageInfo : c .cfg .ImageInfo ,
185
+ CommonCollections : c .cfg .CommonCollections ,
176
186
})
177
187
if err != nil {
178
188
return err
@@ -224,6 +234,7 @@ func (c *controllerBuilder) watchGw(ctx context.Context) error {
224
234
}),
225
235
builder .WithPredicates (discoveryNamespaceFilterPredicate ),
226
236
)
237
+
227
238
// watch for gatewayclasses managed by our controller and enqueue related gateways
228
239
buildr .Watches (
229
240
& apiv1.GatewayClass {},
@@ -260,6 +271,28 @@ func (c *controllerBuilder) watchGw(ctx context.Context) error {
260
271
),
261
272
)
262
273
274
+ // Trigger an event when the gateway changes. This can even be a change in listener sets attached to the gateway
275
+ c .cfg .CommonCollections .GatewayIndex .Gateways .Register (func (o krt.Event [ir.Gateway ]) {
276
+ gw := o .Latest ()
277
+ c .reconciler .customEvents <- event.TypedGenericEvent [ir.Gateway ]{
278
+ Object : gw ,
279
+ }
280
+ })
281
+ buildr .WatchesRawSource (
282
+ // Add channel source for custom events
283
+ source .Channel (
284
+ c .reconciler .customEvents ,
285
+ handler .TypedEnqueueRequestsFromMapFunc (func (ctx context.Context , obj ir.Gateway ) []reconcile.Request {
286
+ // Convert the generic event to a reconcile request
287
+ return []reconcile.Request {
288
+ {
289
+ NamespacedName : types.NamespacedName {Namespace : obj .Namespace , Name : obj .Name },
290
+ },
291
+ }
292
+ }),
293
+ ),
294
+ )
295
+
263
296
for _ , gvk := range gvks {
264
297
obj , err := c .cfg .Mgr .GetScheme ().New (gvk )
265
298
if err != nil {
@@ -379,6 +412,7 @@ func (c *controllerBuilder) watchInferencePool(ctx context.Context) error {
379
412
ControllerName : c .cfg .ControllerName ,
380
413
ImageInfo : c .cfg .ImageInfo ,
381
414
InferenceExtension : c .poolCfg .InferenceExt ,
415
+ CommonCollections : c .cfg .CommonCollections ,
382
416
})
383
417
if err != nil {
384
418
return err
@@ -440,8 +474,9 @@ func (c *controllerBuilder) watchGwClass(_ context.Context) error {
440
474
}
441
475
442
476
type controllerReconciler struct {
443
- cli client.Client
444
- scheme * runtime.Scheme
477
+ cli client.Client
478
+ scheme * runtime.Scheme
479
+ customEvents chan event.TypedGenericEvent [ir.Gateway ]
445
480
}
446
481
447
482
func (r * controllerReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
0 commit comments