55mod ports;
66
77pub mod kserve_test {
8+ // [gluo NOTE] Tests may run in parallel, use this enum to keep track of
9+ // port used for different test cases
10+ enum TestPort {
11+ InferFailure = 8988 ,
12+ InferSuccess = 8989 ,
13+ StreamInferFailure = 8990 ,
14+ StreamInferSuccess = 8991 ,
15+ InferCancellation = 8992 ,
16+ StreamInferCancellation = 8993 ,
17+ ModelInfo = 8994 ,
18+ TensorModel = 8995 ,
19+ TensorModelTypes = 8996 ,
20+ TritonModelConfig = 8997 ,
21+ LiveReady = 8998 ,
22+ }
23+
824 // For using gRPC client for test
925 pub mod inference {
1026 tonic:: include_proto!( "inference" ) ;
@@ -16,6 +32,7 @@ pub mod kserve_test {
1632 use inference:: grpc_inference_service_client:: GrpcInferenceServiceClient ;
1733 use inference:: {
1834 DataType , ModelConfigRequest , ModelInferRequest , ModelInferResponse , ModelMetadataRequest ,
35+ ModelReadyRequest , ServerLiveRequest , ServerReadyRequest ,
1936 } ;
2037
2138 use anyhow:: Error ;
@@ -354,21 +371,6 @@ pub mod kserve_test {
354371 }
355372 }
356373
357- // Tests may run in parallel, use this enum to keep track of port used for different
358- // test cases
359- enum TestPort {
360- InferFailure = 8988 ,
361- InferSuccess = 8989 ,
362- StreamInferFailure = 8990 ,
363- StreamInferSuccess = 8991 ,
364- InferCancellation = 8992 ,
365- StreamInferCancellation = 8993 ,
366- ModelInfo = 8994 ,
367- TensorModel = 8995 ,
368- TensorModelTypes = 8996 ,
369- TritonModelConfig = 8997 ,
370- }
371-
372374 #[ rstest]
373375 #[ tokio:: test]
374376 async fn test_infer_failure (
@@ -1971,4 +1973,86 @@ pub mod kserve_test {
19711973 cancel_token. cancel ( ) ;
19721974 let _ = tokio:: join!( grpc_task, http_task) ;
19731975 }
1976+
1977+ #[ rstest]
1978+ #[ tokio:: test]
1979+ async fn test_live_ready ( ) {
1980+ let grpc_port = TestPort :: LiveReady as u16 ;
1981+ let service = KserveService :: builder ( ) . port ( grpc_port) . build ( ) . unwrap ( ) ;
1982+
1983+ // start server
1984+ let _running = RunningService :: spawn ( service. clone ( ) ) ;
1985+
1986+ let mut client = get_ready_client ( grpc_port, 5 ) . await ;
1987+
1988+ // Check server liveness
1989+ let server_live_request = tonic:: Request :: new ( ServerLiveRequest { } ) ;
1990+ let server_live_response = client. server_live ( server_live_request) . await . unwrap ( ) ;
1991+ let server_live = server_live_response. get_ref ( ) . live ;
1992+ assert ! ( server_live, "Server should be live" ) ;
1993+
1994+ // Check server readiness
1995+ let server_ready_request = tonic:: Request :: new ( ServerReadyRequest { } ) ;
1996+ let server_ready_response = client. server_ready ( server_ready_request) . await . unwrap ( ) ;
1997+ let server_ready = server_ready_response. get_ref ( ) . ready ;
1998+ assert ! (
1999+ !server_ready,
2000+ "Server should not be ready without model registered"
2001+ ) ;
2002+
2003+ // Check model readiness for unregistered model
2004+ let model_ready_request = tonic:: Request :: new ( ModelReadyRequest {
2005+ name : "tensor" . into ( ) ,
2006+ version : "" . into ( ) ,
2007+ } ) ;
2008+ let model_ready_response = client. model_ready ( model_ready_request) . await . unwrap ( ) ;
2009+ let model_ready = model_ready_response. get_ref ( ) . ready ;
2010+ assert ! ( !model_ready, "Unregistered model should not be ready" ) ;
2011+
2012+ // Register a tensor model
2013+ let mut card = ModelDeploymentCard :: with_name_only ( "tensor" ) ;
2014+ card. model_type = ModelType :: TensorBased ;
2015+ card. model_input = ModelInput :: Tensor ;
2016+ card. runtime_config = ModelRuntimeConfig {
2017+ tensor_model_config : Some ( tensor:: TensorModelConfig {
2018+ name : "tensor" . to_string ( ) ,
2019+ inputs : vec ! [ tensor:: TensorMetadata {
2020+ name: "input" . to_string( ) ,
2021+ data_type: tensor:: DataType :: Int32 ,
2022+ shape: vec![ 1 ] ,
2023+ parameters: Default :: default ( ) ,
2024+ } ] ,
2025+ outputs : vec ! [ tensor:: TensorMetadata {
2026+ name: "output" . to_string( ) ,
2027+ data_type: tensor:: DataType :: Bool ,
2028+ shape: vec![ -1 ] ,
2029+ parameters: Default :: default ( ) ,
2030+ } ] ,
2031+ triton_model_config : None ,
2032+ } ) ,
2033+ ..Default :: default ( )
2034+ } ;
2035+ let tensor = Arc :: new ( TensorEngine { } ) ;
2036+ service
2037+ . model_manager ( )
2038+ . add_tensor_model ( "tensor" , card. mdcsum ( ) , tensor. clone ( ) )
2039+ . unwrap ( ) ;
2040+ let _ = service. model_manager ( ) . save_model_card ( "key" , card) ;
2041+
2042+ // Re-check readiness
2043+ // Check server readiness
2044+ let server_ready_request = tonic:: Request :: new ( ServerReadyRequest { } ) ;
2045+ let server_ready_response = client. server_ready ( server_ready_request) . await . unwrap ( ) ;
2046+ let server_ready = server_ready_response. get_ref ( ) . ready ;
2047+ assert ! ( server_ready, "Server should be ready with model registered" ) ;
2048+
2049+ // Check model readiness for unregistered model
2050+ let model_ready_request = tonic:: Request :: new ( ModelReadyRequest {
2051+ name : "tensor" . into ( ) ,
2052+ version : "" . into ( ) ,
2053+ } ) ;
2054+ let model_ready_response = client. model_ready ( model_ready_request) . await . unwrap ( ) ;
2055+ let model_ready = model_ready_response. get_ref ( ) . ready ;
2056+ assert ! ( model_ready, "Registered model should be ready" ) ;
2057+ }
19742058}
0 commit comments