@@ -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,28 @@ func BeforeSuit(t *testing.T) func() {
1466
1469
}
1467
1470
}
1468
1471
1469
- assert .EventuallyWithT (t , func (t * assert.CollectT ) {
1472
+ var simpleTimeout bool
1473
+ go func () {
1474
+ time .Sleep (10 * time .Second )
1475
+ simpleTimeout = true
1476
+ }()
1477
+
1478
+ for {
1479
+ if simpleTimeout {
1480
+ logutil .Fatal (logger , nil , "Sync failed" )
1481
+ }
1470
1482
modelExist := serverRunner .Datastore .ModelGet ("my-model" )
1471
1483
synced := serverRunner .Datastore .PoolHasSynced () && modelExist != nil
1472
- assert .True (t , synced , "Timeout waiting for the pool and models to sync" )
1473
- }, 10 * time .Second , 10 * time .Millisecond )
1484
+ if synced {
1485
+ break
1486
+ }
1487
+ time .Sleep (10 * time .Millisecond )
1488
+ }
1474
1489
1475
1490
return func () {
1476
1491
_ = testEnv .Stop ()
1492
+ _ = k8sClient .DeleteAllOf (context .Background (), & v1alpha2.InferencePool {})
1493
+ _ = k8sClient .DeleteAllOf (context .Background (), & v1alpha2.InferenceModel {})
1477
1494
}
1478
1495
}
1479
1496
@@ -1601,3 +1618,41 @@ func registerMetricsHandler(mgr manager.Manager, port int) error {
1601
1618
}
1602
1619
return nil
1603
1620
}
1621
+
1622
+ // inject options that allow multiple test runs to run
1623
+ // https://github.com/kubernetes-sigs/controller-runtime/issues/2937
1624
+ func managerTestOptions (namespace , name string ) ctrl.Options {
1625
+ return ctrl.Options {
1626
+ Scheme : scheme ,
1627
+ Cache : cache.Options {
1628
+ ByObject : map [client.Object ]cache.ByObject {
1629
+ & corev1.Pod {}: {
1630
+ Namespaces : map [string ]cache.Config {
1631
+ namespace : {},
1632
+ },
1633
+ },
1634
+ & v1alpha2.InferencePool {}: {
1635
+ Namespaces : map [string ]cache.Config {
1636
+ namespace : {
1637
+ FieldSelector : fields .SelectorFromSet (fields.Set {
1638
+ "metadata.name" : name ,
1639
+ }),
1640
+ },
1641
+ },
1642
+ },
1643
+ & v1alpha2.InferenceModel {}: {
1644
+ Namespaces : map [string ]cache.Config {
1645
+ namespace : {},
1646
+ },
1647
+ },
1648
+ },
1649
+ },
1650
+ Controller : config.Controller {
1651
+ SkipNameValidation : boolPointer (true ),
1652
+ },
1653
+ }
1654
+ }
1655
+
1656
+ func boolPointer (b bool ) * bool {
1657
+ return & b
1658
+ }
0 commit comments