Skip to content

Commit e696e68

Browse files
authored
load plugins from file in conformance tests (#1152)
* configure conformance plugins through file, remove dep on conformance Signed-off-by: Nir Rozenbaum <[email protected]> * update config filename to conformance-plugins.yaml Signed-off-by: Nir Rozenbaum <[email protected]> --------- Signed-off-by: Nir Rozenbaum <[email protected]>
1 parent cdb0187 commit e696e68

File tree

9 files changed

+68
-185
lines changed

9 files changed

+68
-185
lines changed

Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ RUN go mod download
1919
# Sources
2020
COPY cmd/epp ./cmd/epp
2121
COPY pkg/epp ./pkg/epp
22-
COPY conformance/testing-epp ./conformance/testing-epp
2322
COPY internal ./internal
2423
COPY api ./api
2524
WORKDIR /src/cmd/epp

cmd/epp/runner/register.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/framework/plugins/picker"
2626
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/framework/plugins/profile"
2727
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/framework/plugins/scorer"
28+
testfilter "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/framework/plugins/test/filter"
2829
)
2930

3031
// RegisterAllPlugins registers the factory functions of all known plugins
@@ -40,6 +41,8 @@ func RegisterAllPlugins() {
4041
plugins.Register(profile.SingleProfileHandlerType, profile.SingleProfileHandlerFactory)
4142
plugins.Register(scorer.KvCacheScorerType, scorer.KvCacheScorerFactory)
4243
plugins.Register(scorer.QueueScorerType, scorer.QueueScorerFactory)
44+
// register filter for test purpose only (used in conformance tests)
45+
plugins.Register(testfilter.HeaderBasedTestingFilterType, testfilter.HeaderBasedTestingFilterFactory)
4346
}
4447

4548
// eppHandle is an implementation of the interface plugins.Handle

cmd/epp/runner/runner.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
3838
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
3939

40-
conformance_epp "sigs.k8s.io/gateway-api-inference-extension/conformance/testing-epp"
4140
"sigs.k8s.io/gateway-api-inference-extension/internal/runnable"
4241
backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics"
4342
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/common/config/loader"
@@ -48,7 +47,6 @@ import (
4847
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/saturationdetector"
4948
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling"
5049
runserver "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/server"
51-
envutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/env"
5250
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
5351
)
5452

@@ -141,9 +139,6 @@ var (
141139
modelServerMetricsPath = flag.String("modelServerMetricsPath", "/metrics", "Path to scrape metrics from pods")
142140

143141
setupLog = ctrl.Log.WithName("setup")
144-
145-
// Environment variables
146-
reqHeaderBasedSchedulerForTesting = envutil.GetEnvBool("ENABLE_REQ_HEADER_BASED_SCHEDULER_FOR_TESTING", false, setupLog)
147142
)
148143

149144
// NewRunner initializes a new EPP Runner and returns its pointer.
@@ -337,13 +332,7 @@ func (r *Runner) initializeScheduler() *scheduling.Scheduler {
337332
}
338333

339334
// otherwise, no one configured from outside scheduler config. use existing configuration
340-
scheduler := scheduling.NewScheduler()
341-
342-
if reqHeaderBasedSchedulerForTesting {
343-
scheduler = conformance_epp.NewReqHeaderBasedScheduler()
344-
}
345-
346-
return scheduler
335+
return scheduling.NewScheduler()
347336
}
348337

349338
func (r *Runner) parseConfiguration(ctx context.Context) error {

conformance/resources/manifests/manifests.yaml

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,11 @@ spec:
211211
- "9002"
212212
- -grpcHealthPort
213213
- "9003"
214+
- "-configFile"
215+
- "/config/conformance-plugins.yaml"
214216
env:
215217
- name: USE_STREAMING
216218
value: "true"
217-
- name: ENABLE_REQ_HEADER_BASED_SCHEDULER_FOR_TESTING # Used for conformance test.
218-
value: "true"
219219
ports:
220220
- containerPort: 9002
221221
- containerPort: 9003
@@ -233,6 +233,13 @@ spec:
233233
service: inference-extension
234234
initialDelaySeconds: 5
235235
periodSeconds: 10
236+
volumeMounts:
237+
- name: plugins-config-volume
238+
mountPath: "/config"
239+
volumes:
240+
- name: plugins-config-volume
241+
configMap:
242+
name: plugins-config
236243
---
237244
# --- Secondary InferencePool Definition ---
238245
apiVersion: inference.networking.x-k8s.io/v1alpha2
@@ -301,11 +308,11 @@ spec:
301308
- "9002"
302309
- -grpcHealthPort
303310
- "9003"
311+
- "-configFile"
312+
- "/config/conformance-plugins.yaml"
304313
env:
305314
- name: USE_STREAMING
306315
value: "true"
307-
- name: ENABLE_REQ_HEADER_BASED_SCHEDULER_FOR_TESTING # Used for conformance test.
308-
value: "true"
309316
ports:
310317
- containerPort: 9002
311318
- containerPort: 9003
@@ -323,6 +330,34 @@ spec:
323330
service: inference-extension
324331
initialDelaySeconds: 5
325332
periodSeconds: 10
333+
volumeMounts:
334+
- name: plugins-config-volume
335+
mountPath: "/config"
336+
volumes:
337+
- name: plugins-config-volume
338+
configMap:
339+
name: plugins-config
340+
---
341+
apiVersion: v1
342+
kind: ConfigMap
343+
metadata:
344+
name: plugins-config
345+
namespace: default
346+
data:
347+
conformance-plugins.yaml: |
348+
apiVersion: inference.networking.x-k8s.io/v1alpha1
349+
kind: EndpointPickerConfig
350+
plugins:
351+
- type: header-based-testing-filter
352+
- type: max-score-picker
353+
parameters:
354+
maxNumOfEndpoints: 1
355+
- type: single-profile-handler
356+
schedulingProfiles:
357+
- name: conformance-profile
358+
plugins:
359+
- pluginRef: header-based-testing-filter
360+
- pluginRef: max-score-picker
326361
---
327362
# --- Required Role and RoleBinding for Conformance Test for EPP ---
328363
apiVersion: rbac.authorization.k8s.io/v1

conformance/testing-epp/scheduler.go

Lines changed: 0 additions & 37 deletions
This file was deleted.

conformance/testing-epp/scheduler_test.go

Lines changed: 0 additions & 115 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This package contains plugins implementation for test purpose only.

conformance/testing-epp/plugins/filter/filter_test.go renamed to pkg/epp/scheduling/framework/plugins/test/filter/filter_test.go

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

2323
"github.com/google/go-cmp/cmp"
2424
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend"
25-
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/framework"
2625
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/types"
2726
)
2827

2928
func TestFilter(t *testing.T) {
3029
tests := []struct {
3130
name string
3231
req *types.LLMRequest
33-
filter framework.Filter
3432
input []types.Pod
3533
output []types.Pod
3634
}{
3735
{
38-
name: "TestHeaderBasedFilter, header endpoint unset in request",
39-
req: &types.LLMRequest{}, // Delieverately unset the header.
40-
filter: &HeaderBasedTestingFilter{},
36+
name: "TestHeaderBasedFilter, header endpoint unset in request",
37+
req: &types.LLMRequest{}, // Delieverately unset the header.
4138
input: []types.Pod{
4239
&types.PodMetrics{
4340
Pod: &backend.Pod{
@@ -48,9 +45,8 @@ func TestFilter(t *testing.T) {
4845
output: []types.Pod{},
4946
},
5047
{
51-
name: "TestHeaderBasedFilter, header endpoint set in request but no match",
52-
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint"}},
53-
filter: &HeaderBasedTestingFilter{},
48+
name: "TestHeaderBasedFilter, header endpoint set in request but no match",
49+
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint"}},
5450
input: []types.Pod{
5551
&types.PodMetrics{
5652
Pod: &backend.Pod{
@@ -61,9 +57,8 @@ func TestFilter(t *testing.T) {
6157
output: []types.Pod{},
6258
},
6359
{
64-
name: "TestHeaderBasedFilter, header endpoint set",
65-
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint"}},
66-
filter: &HeaderBasedTestingFilter{},
60+
name: "TestHeaderBasedFilter, header endpoint set",
61+
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint"}},
6762
input: []types.Pod{
6863
&types.PodMetrics{
6964
Pod: &backend.Pod{
@@ -80,9 +75,8 @@ func TestFilter(t *testing.T) {
8075
},
8176
},
8277
{
83-
name: "TestHeaderBasedFilter, multiple header endpoints set and multiple matches",
84-
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint3,test-endpoint2"}},
85-
filter: &HeaderBasedTestingFilter{},
78+
name: "TestHeaderBasedFilter, multiple header endpoints set and multiple matches",
79+
req: &types.LLMRequest{Headers: map[string]string{headerTestEppEndPointSelectionKey: "test-endpoint3,test-endpoint2"}},
8680
input: []types.Pod{
8781
&types.PodMetrics{
8882
Pod: &backend.Pod{
@@ -117,7 +111,7 @@ func TestFilter(t *testing.T) {
117111

118112
for _, test := range tests {
119113
t.Run(test.name, func(t *testing.T) {
120-
got := test.filter.Filter(context.Background(), types.NewCycleState(), test.req, test.input)
114+
got := NewHeaderBasedTestingFilter().Filter(context.Background(), types.NewCycleState(), test.req, test.input)
121115

122116
if diff := cmp.Diff(test.output, got); diff != "" {
123117
t.Errorf("Unexpected output (-want +got): %v", diff)

0 commit comments

Comments
 (0)