Skip to content

Add event filter to the reconciler builder #406

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions pkg/epp/controller/inferencemodel_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2"
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
Expand All @@ -41,10 +42,6 @@ type InferenceModelReconciler struct {
}

func (c *InferenceModelReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
if req.Namespace != c.PoolNamespacedName.Namespace {
return ctrl.Result{}, nil
}

logger := log.FromContext(ctx)
loggerDefault := logger.V(logutil.DEFAULT)
loggerDefault.Info("Reconciling InferenceModel", "name", req.NamespacedName)
Expand Down Expand Up @@ -83,7 +80,11 @@ func (c *InferenceModelReconciler) updateDatastore(logger logr.Logger, infModel
}

func (c *InferenceModelReconciler) SetupWithManager(mgr ctrl.Manager) error {
// Filter inference model within same namespace as the pool
p := predicate.NewPredicateFuncs(func(object client.Object) bool {
return object.GetNamespace() == c.PoolNamespacedName.Namespace
})
return ctrl.NewControllerManagedBy(mgr).
For(&v1alpha2.InferenceModel{}).
For(&v1alpha2.InferenceModel{}).WithEventFilter(p).
Complete(c)
}
11 changes: 6 additions & 5 deletions pkg/epp/controller/inferencepool_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2"
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
Expand All @@ -44,10 +45,6 @@ type InferencePoolReconciler struct {
}

func (c *InferencePoolReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
if req.NamespacedName.Name != c.PoolNamespacedName.Name || req.NamespacedName.Namespace != c.PoolNamespacedName.Namespace {
return ctrl.Result{}, nil
}

logger := log.FromContext(ctx)
loggerDefault := logger.V(logutil.DEFAULT)
loggerDefault.Info("Reconciling InferencePool", "name", req.NamespacedName)
Expand Down Expand Up @@ -90,7 +87,11 @@ func (c *InferencePoolReconciler) updateDatastore(ctx context.Context, newPool *
}

func (c *InferencePoolReconciler) SetupWithManager(mgr ctrl.Manager) error {
// Filter specific inference pool
p := predicate.NewPredicateFuncs(func(object client.Object) bool {
return object.GetNamespace() == c.PoolNamespacedName.Namespace && object.GetName() == c.PoolNamespacedName.Name
})
return ctrl.NewControllerManagedBy(mgr).
For(&v1alpha2.InferencePool{}).
For(&v1alpha2.InferencePool{}).WithEventFilter(p).
Complete(c)
}
14 changes: 3 additions & 11 deletions pkg/epp/controller/inferencepool_reconciler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,7 @@ func TestReconcile_InferencePoolReconciler(t *testing.T) {
t.Errorf("Unexpected diff (+got/-want): %s", diff)
}

// Step 2: A reconcile on pool2 should not change anything.
if _, err := inferencePoolReconciler.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{Name: pool2.Name, Namespace: pool2.Namespace}}); err != nil {
t.Errorf("Unexpected InferencePool reconcile error: %v", err)
}
if diff := diffPool(datastore, pool1, []string{"pod1", "pod2"}); diff != "" {
t.Errorf("Unexpected diff (+got/-want): %s", diff)
}

// Step 3: update the pool selector to include more pods
// Step 2: update the pool selector to include more pods
newPool1 := &v1alpha2.InferencePool{}
if err := fakeClient.Get(ctx, req.NamespacedName, newPool1); err != nil {
t.Errorf("Unexpected pool get error: %v", err)
Expand All @@ -127,7 +119,7 @@ func TestReconcile_InferencePoolReconciler(t *testing.T) {
t.Errorf("Unexpected diff (+got/-want): %s", diff)
}

// Step 4: update the pool port
// Step 3: update the pool port
if err := fakeClient.Get(ctx, req.NamespacedName, newPool1); err != nil {
t.Errorf("Unexpected pool get error: %v", err)
}
Expand All @@ -142,7 +134,7 @@ func TestReconcile_InferencePoolReconciler(t *testing.T) {
t.Errorf("Unexpected diff (+got/-want): %s", diff)
}

// Step 5: delete the pool to trigger a datastore clear
// Step 4: delete the pool to trigger a datastore clear
if err := fakeClient.Get(ctx, req.NamespacedName, newPool1); err != nil {
t.Errorf("Unexpected pool get error: %v", err)
}
Expand Down
14 changes: 10 additions & 4 deletions pkg/epp/controller/pod_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
)

type PodReconciler struct {
// namespace of the InferencePool
// we donot support cross namespace pod selection
Namespace string
client.Client
Datastore datastore.Datastore
Scheme *runtime.Scheme
Expand All @@ -41,13 +45,11 @@ type PodReconciler struct {

func (c *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
inferencePool, err := c.Datastore.PoolGet()
_, err := c.Datastore.PoolGet()
if err != nil {
logger.V(logutil.TRACE).Info("Skipping reconciling Pod because the InferencePool is not available yet", "error", err)
// When the inferencePool is initialized it lists the appropriate pods and populates the datastore, so no need to requeue.
return ctrl.Result{}, nil
} else if inferencePool.Namespace != req.Namespace {
return ctrl.Result{}, nil
}

logger.V(logutil.VERBOSE).Info("Pod being reconciled", "name", req.NamespacedName)
Expand All @@ -67,8 +69,12 @@ func (c *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
}

func (c *PodReconciler) SetupWithManager(mgr ctrl.Manager) error {
// Filter specific inference pool
p := predicate.NewPredicateFuncs(func(object client.Object) bool {
return object.GetNamespace() == c.Namespace
})
return ctrl.NewControllerManagedBy(mgr).
For(&corev1.Pod{}).
For(&corev1.Pod{}).WithEventFilter(p).
Complete(c)
}

Expand Down
1 change: 1 addition & 0 deletions pkg/epp/server/runserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ func (r *ExtProcServerRunner) SetupWithManager(mgr ctrl.Manager) error {
}

if err := (&controller.PodReconciler{
Namespace: r.PoolNamespace,
Datastore: r.Datastore,
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(),
Expand Down
7 changes: 5 additions & 2 deletions pkg/epp/test/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,11 @@ func FakePodMetrics(index int, metrics datastore.Metrics) *datastore.PodMetrics
address := fmt.Sprintf("address-%v", index)
pod := datastore.PodMetrics{
Pod: datastore.Pod{
NamespacedName: types.NamespacedName{Name: fmt.Sprintf("pod-%v", index)},
Address: address,
NamespacedName: types.NamespacedName{
Name: fmt.Sprintf("pod-%v", index),
Namespace: "default",
},
Address: address,
},
Metrics: metrics,
}
Expand Down
1 change: 1 addition & 0 deletions test/testdata/client.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ metadata:
labels:
app: curl
name: curl
namespace: default
spec:
containers:
- command:
Expand Down
3 changes: 3 additions & 0 deletions test/testdata/envoy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: envoy
namespace: default
labels:
app: envoy
data:
Expand Down Expand Up @@ -203,6 +204,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: envoy
namespace: default
labels:
app: envoy
spec:
Expand Down Expand Up @@ -283,6 +285,7 @@ metadata:
labels:
app: envoy
name: envoy
namespace: default
spec:
ports:
- name: http-8081
Expand Down
1 change: 1 addition & 0 deletions test/testdata/model-secret.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: v1
kind: Secret
metadata:
name: hf-token
namespace: default
labels:
app: vllm
stringData:
Expand Down