@@ -20,7 +20,7 @@ use reqwest::Url;
2020
2121use crate :: {
2222 config:: { ComputePlatform , Config } ,
23- cscs:: api_client:: types:: { FileStat , Job , JobDetail , JobId , PathEntry , S3Upload , System , UserInfo } ,
23+ cscs:: api_client:: types:: { FileStat , Job , JobDetail , JobId , JobStatus , PathEntry , S3Upload , System , UserInfo } ,
2424 trace_dbg,
2525 util:: types:: DockerImageUrl ,
2626} ;
@@ -110,14 +110,23 @@ impl CscsApi {
110110 . wrap_err ( "couldn't list CSCS systems" ) ?;
111111 Ok ( result. systems . into_iter ( ) . map ( |s| s. into ( ) ) . collect ( ) )
112112 }
113- pub async fn list_jobs ( & self , system_name : & str , all_users : Option < bool > ) -> Result < Vec < Job > > {
113+ pub async fn list_jobs (
114+ & self ,
115+ status : Option < Vec < JobStatus > > ,
116+ system_name : & str ,
117+ all_users : Option < bool > ,
118+ ) -> Result < Vec < Job > > {
114119 let result = get_compute_system_jobs ( & self . client , system_name, all_users)
115120 . await
116121 . wrap_err ( "couldn't fetch cscs jobs" ) ?;
117- Ok ( result
122+ let mut result : Vec < Job > = result
118123 . jobs
119124 . map ( |jobs| jobs. into_iter ( ) . map ( |j| j. into ( ) ) . collect ( ) )
120- . unwrap_or ( vec ! [ ] ) )
125+ . unwrap_or ( vec ! [ ] ) ;
126+ if let Some ( filter) = status {
127+ result. retain ( |j| filter. contains ( & j. status ) ) ;
128+ }
129+ Ok ( result)
121130 }
122131 pub async fn get_job ( & self , system_name : & str , job_id : JobId ) -> Result < Option < JobDetail > > {
123132 let jobs = get_compute_system_job ( & self . client , system_name, job_id. clone ( ) . into_string ( ) )
@@ -263,6 +272,7 @@ mod tests {
263272 use injectorpp:: interface:: injector:: * ;
264273
265274 use super :: * ;
275+ use crate :: cscs:: api_client:: types:: JobStatus as ApiJobStatus ;
266276
267277 fn get_client ( ) -> CscsApi {
268278 CscsApi {
@@ -409,8 +419,24 @@ mod tests {
409419 } ) ,
410420 Result <GetJobResponse >
411421 ) ) ;
412- let result = client. list_jobs ( "daint" , None ) . await ;
422+ let result = client. list_jobs ( None , "daint" , None ) . await ;
413423 assert_eq ! ( result. unwrap( ) . len( ) , 5 ) ;
424+ let result = client
425+ . list_jobs ( Some ( vec ! [ ApiJobStatus :: Running , ApiJobStatus :: Pending ] ) , "daint" , None )
426+ . await ;
427+ assert_eq ! ( result. unwrap( ) . len( ) , 2 ) ;
428+ let result = client
429+ . list_jobs (
430+ Some ( vec ! [
431+ ApiJobStatus :: Failed ,
432+ ApiJobStatus :: Finished ,
433+ ApiJobStatus :: Cancelled ,
434+ ] ) ,
435+ "daint" ,
436+ None ,
437+ )
438+ . await ;
439+ assert_eq ! ( result. unwrap( ) . len( ) , 3 ) ;
414440 }
415441 }
416442
0 commit comments