@@ -43,6 +43,8 @@ import (
43
43
"google.golang.org/grpc/credentials/insecure"
44
44
"google.golang.org/protobuf/testing/protocmp"
45
45
"google.golang.org/protobuf/types/known/structpb"
46
+ corev1 "k8s.io/api/core/v1"
47
+ "k8s.io/apimachinery/pkg/fields"
46
48
"k8s.io/apimachinery/pkg/runtime"
47
49
"k8s.io/apimachinery/pkg/types"
48
50
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -51,7 +53,10 @@ import (
51
53
"k8s.io/component-base/metrics/legacyregistry"
52
54
metricsutils "k8s.io/component-base/metrics/testutil"
53
55
ctrl "sigs.k8s.io/controller-runtime"
56
+ "sigs.k8s.io/controller-runtime/pkg/cache"
57
+ "sigs.k8s.io/controller-runtime/pkg/client"
54
58
k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
59
+ "sigs.k8s.io/controller-runtime/pkg/config"
55
60
"sigs.k8s.io/controller-runtime/pkg/envtest"
56
61
"sigs.k8s.io/controller-runtime/pkg/manager"
57
62
"sigs.k8s.io/gateway-api-inference-extension/api/v1alpha2"
78
83
logger = logutil .NewTestLogger ().V (logutil .VERBOSE )
79
84
)
80
85
86
+ func TestMain (m * testing.M ) {
87
+ cleanup := BeforeSuite ()
88
+ code := m .Run ()
89
+ cleanup ()
90
+ os .Exit (code )
91
+ }
92
+
81
93
func TestKubeInferenceModelRequest (t * testing.T ) {
82
94
tests := []struct {
83
95
name string
@@ -337,11 +349,6 @@ func TestKubeInferenceModelRequest(t *testing.T) {
337
349
wantErr : false ,
338
350
},
339
351
}
340
-
341
- // Set up global k8sclient and extproc server runner with test environment config
342
- cleanup := BeforeSuit (t )
343
- defer cleanup ()
344
-
345
352
for _ , test := range tests {
346
353
t .Run (test .name , func (t * testing.T ) {
347
354
client , cleanup := setUpHermeticServer (t , test .pods , false )
@@ -1266,10 +1273,6 @@ func TestFullDuplexStreamed_KubeInferenceModelRequest(t *testing.T) {
1266
1273
},
1267
1274
}
1268
1275
1269
- // Set up global k8sclient and extproc server runner with test environment config
1270
- cleanup := BeforeSuit (t )
1271
- defer cleanup ()
1272
-
1273
1276
for _ , test := range tests {
1274
1277
t .Run (test .name , func (t * testing.T ) {
1275
1278
client , cleanup := setUpHermeticServer (t , test .pods , true )
@@ -1380,7 +1383,7 @@ func fakePod(index int) backendmetrics.Pod {
1380
1383
}
1381
1384
1382
1385
// Sets up a test environment and returns the runner struct
1383
- func BeforeSuit ( t * testing. T ) func () {
1386
+ func BeforeSuite ( ) func () {
1384
1387
// Set up mock k8s API Client
1385
1388
testEnv = & envtest.Environment {
1386
1389
CRDDirectoryPaths : []string {filepath .Join (".." , ".." , ".." , "config" , "crd" , "bases" )},
@@ -1404,7 +1407,7 @@ func BeforeSuit(t *testing.T) func() {
1404
1407
// Init runtime.
1405
1408
ctrl .SetLogger (logger )
1406
1409
1407
- mgr , err := server .NewDefaultManager ( "default" , "vllm-llama2-7b-pool" , cfg )
1410
+ mgr , err := server .NewManagerWithOptions ( cfg , managerTestOptions ( "default" , "vllm-llama2-7b-pool" ) )
1408
1411
if err != nil {
1409
1412
logutil .Fatal (logger , err , "Failed to create controller manager" )
1410
1413
}
@@ -1425,7 +1428,7 @@ func BeforeSuit(t *testing.T) func() {
1425
1428
logutil .Fatal (logger , err , "Failed to setup server runner" )
1426
1429
}
1427
1430
1428
- // Start the controller manager in go routine, not blocking
1431
+ // Start the controller manager in a go routine, not blocking
1429
1432
go func () {
1430
1433
if err := mgr .Start (ctrl .SetupSignalHandler ()); err != nil {
1431
1434
logutil .Fatal (logger , err , "Failed to start manager" )
@@ -1466,14 +1469,16 @@ func BeforeSuit(t *testing.T) func() {
1466
1469
}
1467
1470
}
1468
1471
1469
- assert .EventuallyWithT ( t , func (t * assert. CollectT ) {
1472
+ assert .Eventually ( nil , func () bool {
1470
1473
modelExist := serverRunner .Datastore .ModelGet ("my-model" )
1471
1474
synced := serverRunner .Datastore .PoolHasSynced () && modelExist != nil
1472
- assert . True ( t , synced , "Timeout waiting for the pool and models to sync" )
1475
+ return synced
1473
1476
}, 10 * time .Second , 10 * time .Millisecond )
1474
1477
1475
1478
return func () {
1476
1479
_ = testEnv .Stop ()
1480
+ _ = k8sClient .DeleteAllOf (context .Background (), & v1alpha2.InferencePool {})
1481
+ _ = k8sClient .DeleteAllOf (context .Background (), & v1alpha2.InferenceModel {})
1477
1482
}
1478
1483
}
1479
1484
@@ -1601,3 +1606,41 @@ func registerMetricsHandler(mgr manager.Manager, port int) error {
1601
1606
}
1602
1607
return nil
1603
1608
}
1609
+
1610
+ // inject options that allow multiple test runs to run
1611
+ // https://github.com/kubernetes-sigs/controller-runtime/issues/2937
1612
+ func managerTestOptions (namespace , name string ) ctrl.Options {
1613
+ return ctrl.Options {
1614
+ Scheme : scheme ,
1615
+ Cache : cache.Options {
1616
+ ByObject : map [client.Object ]cache.ByObject {
1617
+ & corev1.Pod {}: {
1618
+ Namespaces : map [string ]cache.Config {
1619
+ namespace : {},
1620
+ },
1621
+ },
1622
+ & v1alpha2.InferencePool {}: {
1623
+ Namespaces : map [string ]cache.Config {
1624
+ namespace : {
1625
+ FieldSelector : fields .SelectorFromSet (fields.Set {
1626
+ "metadata.name" : name ,
1627
+ }),
1628
+ },
1629
+ },
1630
+ },
1631
+ & v1alpha2.InferenceModel {}: {
1632
+ Namespaces : map [string ]cache.Config {
1633
+ namespace : {},
1634
+ },
1635
+ },
1636
+ },
1637
+ },
1638
+ Controller : config.Controller {
1639
+ SkipNameValidation : boolPointer (true ),
1640
+ },
1641
+ }
1642
+ }
1643
+
1644
+ func boolPointer (b bool ) * bool {
1645
+ return & b
1646
+ }
0 commit comments