@@ -41,12 +41,15 @@ import (
4141 "sigs.k8s.io/gateway-api-inference-extension/internal/runnable"
4242 "sigs.k8s.io/gateway-api-inference-extension/pkg/bbr/datastore"
4343 "sigs.k8s.io/gateway-api-inference-extension/pkg/bbr/metrics"
44+ bbr "sigs.k8s.io/gateway-api-inference-extension/pkg/bbr/plugins"
45+ routing "sigs.k8s.io/gateway-api-inference-extension/pkg/bbr/routing"
4446 runserver "sigs.k8s.io/gateway-api-inference-extension/pkg/bbr/server"
4547 "sigs.k8s.io/gateway-api-inference-extension/pkg/common/util/logging"
4648 "sigs.k8s.io/gateway-api-inference-extension/version"
4749)
4850
4951var (
52+ // Flags
5053 grpcPort = flag .Int ("grpc-port" , 9004 , "The gRPC port used for communicating with Envoy proxy" )
5154 grpcHealthPort = flag .Int ("grpc-health-port" , 9005 , "The port used for gRPC liveness and readiness probes" )
5255 metricsPort = flag .Int ("metrics-port" , 9090 , "The metrics port" )
5558 secureServing = flag .Bool ("secure-serving" , true , "Enables secure serving." )
5659 logVerbosity = flag .Int ("v" , logging .DEFAULT , "number for the log level verbosity" )
5760
61+ // Logging
5862 setupLog = ctrl .Log .WithName ("setup" )
63+
64+ // Contains the BBR plugins specs specified via repeated flags:
65+ // --plugin <type>:<name>[:<json>]
66+ pluginSpecs bbr.BBRPluginSpecs
5967)
6068
6169func NewRunner () * Runner {
@@ -67,6 +75,10 @@ func NewRunner() *Runner {
6775// Runner is used to run bbr with its plugins
6876type Runner struct {
6977 bbrExecutableName string
78+
79+ // The slice of BBR plugin instances executed by the request handler,
80+ // in the same order the plugin flags are provided.
81+ bbrPluginInstances []bbr.BBRPlugin
7082}
7183
7284// WithExecutableName sets the name of the executable containing the runner.
@@ -80,6 +92,8 @@ func (r *Runner) Run(ctx context.Context) error {
8092 setupLog .Info (r .bbrExecutableName + " build" , "commit-sha" , version .CommitSHA , "build-ref" , version .BuildRef )
8193 opts := zap.Options {Development : true }
8294 opts .BindFlags (flag .CommandLine )
95+
96+ flag .Var (& pluginSpecs , "plugin" , `Repeatable. --plugin <type>:<name>[:<json>]` )
8397 flag .Parse ()
8498 initLogging (& opts )
8599
@@ -140,12 +154,46 @@ func (r *Runner) Run(ctx context.Context) error {
140154 return err
141155 }
142156
157+ // Register factories for all known in-tree BBR plugins
158+ r .registerInTreePlugins ()
159+
160+ // Construct BBR plugin instances for the in tree plugins that are (1) registered and (2) requested via the --plugin flags
161+ if len (pluginSpecs ) == 0 {
162+ setupLog .Info ("No BBR plugins are specified. Running BBR with the default behavior." )
163+
164+ // Append a default BBRPlugin to the slice of the BBRPlugin instances using regular registered factory mechanism.
165+ factory := bbr .Registry [routing .DefaultPluginType ]
166+ defaultPlugin , err := factory ("" , nil )
167+ if err != nil {
168+ setupLog .Error (err , "Failed to create default plugin" )
169+ return err
170+ }
171+ r .withPlugin (defaultPlugin )
172+ } else {
173+ setupLog .Info ("BBR plugins are specified. Running BBR with the specified plugins." )
174+
175+ for _ , s := range pluginSpecs {
176+ factory , ok := bbr .Registry [s .Type ]
177+ if ! ok {
178+ fmt .Fprintf (os .Stderr , "unknown plugin type %q (no factory registered)\n " , s .Type )
179+ os .Exit (2 )
180+ }
181+ instance , err := factory (s .Name , s .JSON )
182+ if err != nil {
183+ fmt .Fprintf (os .Stderr , "invalid %s#%s: %v\n " , s .Type , s .Name , err )
184+ os .Exit (2 )
185+ }
186+ r .withPlugin (instance )
187+ }
188+ }
189+
143190 // Setup ExtProc Server Runner
144191 serverRunner := & runserver.ExtProcServerRunner {
145- GrpcPort : * grpcPort ,
146- Datastore : ds ,
147- SecureServing : * secureServing ,
148- Streaming : * streaming ,
192+ GrpcPort : * grpcPort ,
193+ Datastore : ds ,
194+ SecureServing : * secureServing ,
195+ Streaming : * streaming ,
196+ PluginInstances : r .bbrPluginInstances ,
149197 }
150198 if err := serverRunner .SetupWithManager (mgr ); err != nil {
151199 setupLog .Error (err , "Failed to setup BBR controllers" )
@@ -173,6 +221,15 @@ func (r *Runner) Run(ctx context.Context) error {
173221 return nil
174222}
175223
224+ // registerInTreePlugins registers the factory functions of all known BBR plugins
225+ func (r * Runner ) registerInTreePlugins () {
226+ bbr .Register (routing .DefaultPluginType , routing .DefaultPluginFactory )
227+ }
228+
229+ func (r * Runner ) withPlugin (p bbr.BBRPlugin ) {
230+ r .bbrPluginInstances = append (r .bbrPluginInstances , p )
231+ }
232+
176233// registerHealthServer adds the Health gRPC server as a Runnable to the given manager.
177234func registerHealthServer (mgr manager.Manager , port int ) error {
178235 srv := grpc .NewServer ()
0 commit comments