@@ -16,7 +16,7 @@ use std::net::IpAddr;
1616use std:: path:: { Path , PathBuf } ;
1717use std:: sync:: { Arc , Mutex , MutexGuard } ;
1818use supervisor_client:: SupervisorClient ;
19- use teepod_rpc:: { self as pb, GpuInfo , VmConfiguration } ;
19+ use teepod_rpc:: { self as pb, GpuInfo , StatusRequest , StatusResponse , VmConfiguration } ;
2020use tracing:: { error, info} ;
2121
2222pub use image:: { Image , ImageInfo } ;
@@ -306,7 +306,7 @@ impl App {
306306 Ok ( ( ) )
307307 }
308308
309- pub async fn list_vms ( & self ) -> Result < Vec < pb :: VmInfo > > {
309+ pub async fn list_vms ( & self , request : StatusRequest ) -> Result < StatusResponse > {
310310 let vms = self
311311 . supervisor
312312 . list ( )
@@ -319,6 +319,19 @@ impl App {
319319 let mut infos = self
320320 . lock ( )
321321 . iter_vms ( )
322+ . filter ( |vm| {
323+ if !request. ids . is_empty ( ) && !request. ids . contains ( & vm. config . manifest . id ) {
324+ return false ;
325+ }
326+ if request. keyword . is_empty ( ) {
327+ true
328+ } else {
329+ vm. config . manifest . name . contains ( & request. keyword )
330+ || vm. config . manifest . id . contains ( & request. keyword )
331+ || vm. config . manifest . app_id . contains ( & request. keyword )
332+ || vm. config . manifest . image . contains ( & request. keyword )
333+ }
334+ } )
322335 . map ( |vm| {
323336 vm. merged_info (
324337 vms. get ( & vm. config . manifest . id ) ,
@@ -328,10 +341,17 @@ impl App {
328341 . collect :: < Vec < _ > > ( ) ;
329342
330343 infos. sort_by ( |a, b| a. manifest . created_at_ms . cmp ( & b. manifest . created_at_ms ) ) ;
331- let gw = & self . config . gateway ;
332344
333- let lst = infos. into_iter ( ) . map ( |info| info. to_pb ( gw) ) . collect ( ) ;
334- Ok ( lst)
345+ let total = infos. len ( ) as u32 ;
346+
347+ infos = paginate ( infos, request. page , request. page_size ) ;
348+
349+ let gw = & self . config . gateway ;
350+ Ok ( StatusResponse {
351+ vms : infos. into_iter ( ) . map ( |info| info. to_pb ( gw) ) . collect ( ) ,
352+ port_mapping_enabled : self . config . cvm . port_mapping . enabled ,
353+ total,
354+ } )
335355 }
336356
337357 pub fn list_images ( & self ) -> Result < Vec < ( String , ImageInfo ) > > {
@@ -583,6 +603,20 @@ impl App {
583603 }
584604}
585605
606+ fn paginate < T > ( items : Vec < T > , page : u32 , page_size : u32 ) -> Vec < T > {
607+ if page == 0 || page_size == 0 {
608+ return items;
609+ }
610+ let page = page - 1 ;
611+ let start = page * page_size;
612+ let end = start + page_size;
613+ items
614+ . into_iter ( )
615+ . skip ( start as usize )
616+ . take ( end as usize )
617+ . collect ( )
618+ }
619+
586620#[ derive( Clone ) ]
587621pub struct VmState {
588622 pub ( crate ) config : Arc < VmConfig > ,
0 commit comments