@@ -35,6 +35,7 @@ import (
3535 v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1"
3636 "sigs.k8s.io/gateway-api-inference-extension/apix/v1alpha2"
3737 backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics"
38+ "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datalayer"
3839 testutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/testing"
3940)
4041
@@ -248,6 +249,11 @@ var (
248249 TargetPorts : []v1.Port {{Number : v1 .PortNumber (int32 (8000 ))}},
249250 },
250251 }
252+ inferencePoolMultiTarget = & v1.InferencePool {
253+ Spec : v1.InferencePoolSpec {
254+ TargetPorts : []v1.Port {{Number : v1 .PortNumber (int32 (8000 ))}, {Number : v1 .PortNumber (int32 (8001 ))}},
255+ },
256+ }
251257)
252258
253259func TestMetrics (t * testing.T ) {
@@ -402,3 +408,184 @@ func TestPods(t *testing.T) {
402408 })
403409 }
404410}
411+
412+ func TestPodInfo (t * testing.T ) {
413+ tests := []struct {
414+ name string
415+ op func (ctx context.Context , ds Datastore )
416+ pool * v1.InferencePool
417+ existingPods []* corev1.Pod
418+ wantPodInfos []* datalayer.PodInfo
419+ }{
420+ {
421+ name : "Add new pod, no existing pods, should add" ,
422+ existingPods : []* corev1.Pod {},
423+ wantPodInfos : []* datalayer.PodInfo {
424+ {
425+ NamespacedName : types.NamespacedName {
426+ Name : pod1 .Name + "-rank-0" ,
427+ Namespace : pod1 .Namespace ,
428+ },
429+
430+ PodName : pod1 .Name ,
431+ Address : pod1 .Status .PodIP ,
432+ Port : int32 (inferencePool .Spec .TargetPorts [0 ].Number ),
433+ MetricsPort : int32 (inferencePool .Spec .TargetPorts [0 ].Number ),
434+ Labels : map [string ]string {},
435+ },
436+ },
437+ op : func (ctx context.Context , ds Datastore ) {
438+ ds .PodUpdateOrAddIfNotExist (pod1 )
439+ },
440+ pool : inferencePool ,
441+ },
442+ {
443+ name : "Add new pod, no existing pods, should add, multiple target ports" ,
444+ existingPods : []* corev1.Pod {},
445+ wantPodInfos : []* datalayer.PodInfo {
446+ {
447+ NamespacedName : types.NamespacedName {
448+ Name : pod1 .Name + "-rank-0" ,
449+ Namespace : pod1 .Namespace ,
450+ },
451+
452+ PodName : pod1 .Name ,
453+ Address : pod1 .Status .PodIP ,
454+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
455+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
456+ Labels : map [string ]string {},
457+ },
458+ {
459+ NamespacedName : types.NamespacedName {
460+ Name : pod1 .Name + "-rank-1" ,
461+ Namespace : pod1 .Namespace ,
462+ },
463+
464+ PodName : pod1 .Name ,
465+ Address : pod1 .Status .PodIP ,
466+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
467+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
468+ Labels : map [string ]string {},
469+ },
470+ },
471+ op : func (ctx context.Context , ds Datastore ) {
472+ ds .PodUpdateOrAddIfNotExist (pod1 )
473+ },
474+ pool : inferencePoolMultiTarget ,
475+ },
476+ {
477+ name : "Add new pod, with existing pods, should add, multiple target ports" ,
478+ existingPods : []* corev1.Pod {pod1 },
479+ wantPodInfos : []* datalayer.PodInfo {
480+ {
481+ NamespacedName : types.NamespacedName {
482+ Name : pod1 .Name + "-rank-0" ,
483+ Namespace : pod1 .Namespace ,
484+ },
485+
486+ PodName : pod1 .Name ,
487+ Address : pod1 .Status .PodIP ,
488+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
489+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
490+ Labels : map [string ]string {},
491+ },
492+ {
493+ NamespacedName : types.NamespacedName {
494+ Name : pod1 .Name + "-rank-1" ,
495+ Namespace : pod1 .Namespace ,
496+ },
497+
498+ PodName : pod1 .Name ,
499+ Address : pod1 .Status .PodIP ,
500+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
501+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
502+ Labels : map [string ]string {},
503+ },
504+ {
505+ NamespacedName : types.NamespacedName {
506+ Name : pod2 .Name + "-rank-0" ,
507+ Namespace : pod2 .Namespace ,
508+ },
509+
510+ PodName : pod2 .Name ,
511+ Address : pod2 .Status .PodIP ,
512+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
513+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
514+ Labels : map [string ]string {},
515+ },
516+ {
517+ NamespacedName : types.NamespacedName {
518+ Name : pod2 .Name + "-rank-1" ,
519+ Namespace : pod2 .Namespace ,
520+ },
521+
522+ PodName : pod2 .Name ,
523+ Address : pod2 .Status .PodIP ,
524+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
525+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
526+ Labels : map [string ]string {},
527+ },
528+ },
529+ op : func (ctx context.Context , ds Datastore ) {
530+ ds .PodUpdateOrAddIfNotExist (pod2 )
531+ },
532+ pool : inferencePoolMultiTarget ,
533+ },
534+ {
535+ name : "Delete the pod, multiple target ports" ,
536+ existingPods : []* corev1.Pod {pod1 , pod2 },
537+ wantPodInfos : []* datalayer.PodInfo {
538+ {
539+ NamespacedName : types.NamespacedName {
540+ Name : pod1 .Name + "-rank-0" ,
541+ Namespace : pod1 .Namespace ,
542+ },
543+
544+ PodName : pod1 .Name ,
545+ Address : pod1 .Status .PodIP ,
546+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
547+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [0 ].Number ),
548+ Labels : map [string ]string {},
549+ },
550+ {
551+ NamespacedName : types.NamespacedName {
552+ Name : pod1 .Name + "-rank-1" ,
553+ Namespace : pod1 .Namespace ,
554+ },
555+
556+ PodName : pod1 .Name ,
557+ Address : pod1 .Status .PodIP ,
558+ Port : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
559+ MetricsPort : int32 (inferencePoolMultiTarget .Spec .TargetPorts [1 ].Number ),
560+ Labels : map [string ]string {},
561+ },
562+ },
563+ op : func (ctx context.Context , ds Datastore ) {
564+ ds .PodRemove (pod2 .Name )
565+ },
566+ pool : inferencePoolMultiTarget ,
567+ },
568+ }
569+
570+ for _ , test := range tests {
571+ t .Run (test .name , func (t * testing.T ) {
572+ ctx := context .Background ()
573+ pmf := backendmetrics .NewPodMetricsFactory (& backendmetrics.FakePodMetricsClient {}, time .Second )
574+ ds := NewDatastore (t .Context (), pmf , 0 )
575+ fakeClient := fake .NewFakeClient ()
576+ ds .PoolSet (ctx , fakeClient , test .pool )
577+ for _ , pod := range test .existingPods {
578+ ds .PodUpdateOrAddIfNotExist (pod )
579+ }
580+
581+ test .op (ctx , ds )
582+ var gotPodInfos []* datalayer.PodInfo
583+ for _ , pm := range ds .PodList (backendmetrics .AllPodsPredicate ) {
584+ gotPodInfos = append (gotPodInfos , pm .GetPod ())
585+ }
586+ if diff := cmp .Diff (test .wantPodInfos , gotPodInfos , cmpopts .SortSlices (func (a , b * datalayer.PodInfo ) bool { return a .NamespacedName .Name < b .NamespacedName .Name })); diff != "" {
587+ t .Errorf ("ConvertTo() mismatch (-want +got):\n %s" , diff )
588+ }
589+ })
590+ }
591+ }
0 commit comments