@@ -12,9 +12,10 @@ use feos_proto::{
1212 ListImagesRequest , PullImageRequest , WatchImageStatusRequest ,
1313 } ,
1414 vm_service:: {
15- vm_service_client:: VmServiceClient , CpuConfig , CreateVmRequest , DeleteVmRequest ,
16- GetVmRequest , MemoryConfig , PauseVmRequest , PingVmRequest , ResumeVmRequest ,
17- ShutdownVmRequest , StartVmRequest , StreamVmEventsRequest , VmConfig , VmEvent , VmState ,
15+ stream_vm_console_request as console_input, vm_service_client:: VmServiceClient ,
16+ AttachConsoleMessage , CpuConfig , CreateVmRequest , DeleteVmRequest , GetVmRequest ,
17+ MemoryConfig , PauseVmRequest , PingVmRequest , ResumeVmRequest , ShutdownVmRequest ,
18+ StartVmRequest , StreamVmConsoleRequest , StreamVmEventsRequest , VmConfig , VmEvent , VmState ,
1819 VmStateChangedEvent ,
1920 } ,
2021} ;
@@ -293,6 +294,53 @@ async fn test_create_and_start_vm() -> Result<()> {
293294 let result = vm_client. resume_vm ( resume_req. clone ( ) ) . await ;
294295 assert ! ( result. is_err( ) , "ResumeVm should fail when VM is Stopped" ) ;
295296
297+ info ! (
298+ "Calling StreamVmConsole in Stopped state for vm_id: {}, expecting error" ,
299+ & vm_id
300+ ) ;
301+ let ( console_tx, console_rx) = tokio:: sync:: mpsc:: channel ( 1 ) ;
302+ let console_stream = tokio_stream:: wrappers:: ReceiverStream :: new ( console_rx) ;
303+
304+ let attach_payload = console_input:: Payload :: Attach ( AttachConsoleMessage {
305+ vm_id : vm_id. clone ( ) ,
306+ } ) ;
307+ let attach_input = StreamVmConsoleRequest {
308+ payload : Some ( attach_payload) ,
309+ } ;
310+
311+ console_tx
312+ . send ( attach_input)
313+ . await
314+ . expect ( "Failed to send attach message" ) ;
315+
316+ let response = vm_client. stream_vm_console ( console_stream) . await ;
317+ assert ! (
318+ response. is_ok( ) ,
319+ "StreamVmConsole should establish stream successfully"
320+ ) ;
321+
322+ let mut output_stream = response. unwrap ( ) . into_inner ( ) ;
323+
324+ let stream_result = output_stream. next ( ) . await ;
325+ match stream_result {
326+ Some ( Err ( status) ) => {
327+ info ! (
328+ "Received expected error from console stream: {}" ,
329+ status. message( )
330+ ) ;
331+ assert ! (
332+ status. message( ) . contains( "Invalid VM state" )
333+ || status. message( ) . contains( "Stopped" ) ,
334+ "Error should be about invalid VM state, got: {}" ,
335+ status. message( )
336+ ) ;
337+ }
338+ Some ( Ok ( _) ) => {
339+ panic ! ( "StreamVmConsole should fail when VM is Stopped, but got success response" )
340+ }
341+ None => panic ! ( "StreamVmConsole stream ended unexpectedly without error" ) ,
342+ }
343+
296344 info ! ( "Sending StartVm request again for vm_id: {}" , & vm_id) ;
297345 vm_client. start_vm ( start_req) . await ?;
298346
0 commit comments