Skip to content

Commit 4707ab2

Browse files
danehansrlakhtakia
authored andcommitted
EPP: Update GetRandomPod() to return nil if no pods exist (kubernetes-sigs#731)
Signed-off-by: Daneyon Hansen <[email protected]>
1 parent c262a1d commit 4707ab2

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

pkg/epp/handlers/request.go

+3
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ func (s *StreamingServer) HandleRequestHeaders(ctx context.Context, reqCtx *Requ
138138
// The above PR will address endpoint admission, but currently any request without a body will be
139139
// routed to a random upstream pod.
140140
pod := GetRandomPod(s.datastore)
141+
if pod == nil {
142+
return errutil.Error{Code: errutil.Internal, Msg: "no pods available in datastore"}
143+
}
141144
pool, err := s.datastore.PoolGet()
142145
if err != nil {
143146
return err

pkg/epp/handlers/server.go

+3
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ func RandomWeightedDraw(logger logr.Logger, model *v1alpha2.InferenceModel, seed
449449

450450
func GetRandomPod(ds datastore.Datastore) *backendmetrics.Pod {
451451
pods := ds.PodGetAll()
452+
if len(pods) == 0 {
453+
return nil
454+
}
452455
number := rand.Intn(len(pods))
453456
pod := pods[number]
454457
return pod.GetPod()

pkg/epp/handlers/streamingserver_test.go

+55
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,14 @@ package handlers
1818

1919
import (
2020
"testing"
21+
"time"
22+
23+
corev1 "k8s.io/api/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2125

2226
"sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2"
27+
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics"
28+
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
2329
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
2430
)
2531

@@ -126,6 +132,55 @@ func TestRandomWeightedDraw(t *testing.T) {
126132
}
127133
}
128134

135+
func TestGetRandomPod(t *testing.T) {
136+
tests := []struct {
137+
name string
138+
storePods []*corev1.Pod
139+
expectNil bool
140+
}{
141+
{
142+
name: "No pods available",
143+
storePods: []*corev1.Pod{},
144+
expectNil: true,
145+
},
146+
{
147+
name: "Single pod available",
148+
storePods: []*corev1.Pod{
149+
{ObjectMeta: metav1.ObjectMeta{Name: "pod1"}},
150+
},
151+
expectNil: false,
152+
},
153+
{
154+
name: "Multiple pods available",
155+
storePods: []*corev1.Pod{
156+
{ObjectMeta: metav1.ObjectMeta{Name: "pod1"}},
157+
{ObjectMeta: metav1.ObjectMeta{Name: "pod2"}},
158+
{ObjectMeta: metav1.ObjectMeta{Name: "pod3"}},
159+
},
160+
expectNil: false,
161+
},
162+
}
163+
164+
for _, test := range tests {
165+
t.Run(test.name, func(t *testing.T) {
166+
pmf := metrics.NewPodMetricsFactory(&metrics.FakePodMetricsClient{}, time.Millisecond)
167+
ds := datastore.NewDatastore(t.Context(), pmf)
168+
for _, pod := range test.storePods {
169+
ds.PodUpdateOrAddIfNotExist(pod)
170+
}
171+
172+
gotPod := GetRandomPod(ds)
173+
174+
if test.expectNil && gotPod != nil {
175+
t.Errorf("expected nil pod, got: %v", gotPod)
176+
}
177+
if !test.expectNil && gotPod == nil {
178+
t.Errorf("expected non-nil pod, got nil")
179+
}
180+
})
181+
}
182+
}
183+
129184
func pointer(v int32) *int32 {
130185
return &v
131186
}

0 commit comments

Comments
 (0)