1+ use chrono:: prelude:: * ;
12use color_eyre:: eyre:: { Context , Result } ;
23use firecrest_client:: {
34 client:: FirecrestClient ,
45 compute_api:: {
56 get_compute_system_job, get_compute_system_job_metadata, get_compute_system_jobs,
6- post_compute_system_job,
7+ post_compute_system_job, stop_compute_system_job ,
78 } ,
89 filesystem_api:: {
910 post_filesystem_ops_mkdir, post_filesystem_ops_upload, put_filesystem_ops_chmod,
@@ -80,27 +81,46 @@ pub enum JobStatus {
8081 Cancelled ,
8182 Failed ,
8283}
84+ impl From < String > for JobStatus {
85+ fn from ( value : String ) -> Self {
86+ match value. as_str ( ) {
87+ "RUNNING" => JobStatus :: Running ,
88+ "FAILED" => JobStatus :: Failed ,
89+ "COMPLETED" => JobStatus :: Finished ,
90+ "CANCELLED" => JobStatus :: Cancelled ,
91+ "PENDING" => JobStatus :: Pending ,
92+ other => panic ! ( "got job status: {}" , other) ,
93+ }
94+ }
95+ }
8396#[ derive( Debug , Eq , Clone , PartialEq , PartialOrd , Ord , tabled:: Tabled ) ]
8497pub struct Job {
8598 pub id : usize ,
8699 pub name : String ,
87100 pub status : JobStatus ,
88101 pub user : String ,
102+ #[ tabled( display( "display_option_datetime" ) ) ]
103+ pub start_date : Option < DateTime < Local > > ,
104+ #[ tabled( display( "display_option_datetime" ) ) ]
105+ pub end_date : Option < DateTime < Local > > ,
89106}
90107impl From < JobModelOutput > for Job {
91108 fn from ( value : JobModelOutput ) -> Self {
92109 Self {
93110 id : value. job_id as usize ,
94111 name : value. name ,
95- status : match value. status . state . as_str ( ) {
96- "RUNNING" => JobStatus :: Running ,
97- "FAILED" => JobStatus :: Failed ,
98- "COMPLETED" => JobStatus :: Finished ,
99- "CANCELLED" => JobStatus :: Cancelled ,
100- "PENDING" => JobStatus :: Pending ,
101- other => panic ! ( "got job status: {}" , other) ,
102- } ,
112+ status : value. status . state . into ( ) ,
103113 user : value. user . unwrap_or ( "" . to_string ( ) ) ,
114+ start_date : value. time . start . map ( |s| {
115+ DateTime :: from_timestamp_secs ( s)
116+ . unwrap ( )
117+ . with_timezone ( & Local )
118+ } ) ,
119+ end_date : value. time . end . map ( |e| {
120+ DateTime :: from_timestamp_secs ( e)
121+ . unwrap ( )
122+ . with_timezone ( & Local )
123+ } ) ,
104124 }
105125 }
106126}
@@ -109,6 +129,10 @@ impl From<JobModelOutput> for Job {
109129pub struct JobDetail {
110130 pub id : usize ,
111131 pub name : String ,
132+ #[ tabled( display( "display_option_datetime" ) ) ]
133+ pub start_date : Option < DateTime < Local > > ,
134+ #[ tabled( display( "display_option_datetime" ) ) ]
135+ pub end_date : Option < DateTime < Local > > ,
112136 pub status : JobStatus ,
113137 pub status_reason : String ,
114138 pub exit_code : i64 ,
@@ -117,18 +141,28 @@ pub struct JobDetail {
117141 pub stderr : String ,
118142 pub stdin : String ,
119143}
144+ fn display_option_datetime ( value : & Option < DateTime < Local > > ) -> String {
145+ match value {
146+ Some ( dt) => dt. to_string ( ) ,
147+ None => "" . to_owned ( ) ,
148+ }
149+ }
120150impl From < ( JobModelOutput , JobMetadataModel ) > for JobDetail {
121151 fn from ( value : ( JobModelOutput , JobMetadataModel ) ) -> Self {
122152 Self {
123153 id : value. 0 . job_id as usize ,
124154 name : value. 0 . name ,
125- status : match value. 0 . status . state . as_str ( ) {
126- "RUNNING" => JobStatus :: Running ,
127- "FAILED" => JobStatus :: Failed ,
128- "COMPLETED" => JobStatus :: Finished ,
129- "CANCELLED" => JobStatus :: Cancelled ,
130- other => panic ! ( "got job status: {}" , other) ,
131- } ,
155+ start_date : value. 0 . time . start . map ( |s| {
156+ DateTime :: from_timestamp_secs ( s)
157+ . unwrap ( )
158+ . with_timezone ( & Local )
159+ } ) ,
160+ end_date : value. 0 . time . end . map ( |e| {
161+ DateTime :: from_timestamp_secs ( e)
162+ . unwrap ( )
163+ . with_timezone ( & Local )
164+ } ) ,
165+ status : value. 0 . status . state . into ( ) ,
132166 status_reason : value. 0 . status . state_reason . unwrap_or ( "" . to_owned ( ) ) ,
133167 exit_code : value. 0 . status . exit_code . unwrap_or ( 0 ) ,
134168 user : value. 0 . user . unwrap_or ( "" . to_string ( ) ) ,
@@ -288,6 +322,13 @@ impl CscsApi {
288322 Ok ( Some ( ( job, job_metadata) . into ( ) ) )
289323 }
290324
325+ pub async fn delete_stop ( & self , system_name : & str , job_id : i64 ) -> Result < ( ) > {
326+ stop_compute_system_job ( & self . client , system_name, job_id)
327+ . await
328+ . wrap_err ( "couldn't delete job" ) ?;
329+ Ok ( ( ) )
330+ }
331+
291332 pub async fn mkdir ( & self , system_name : & str , path : PathBuf ) -> Result < ( ) > {
292333 let _ = post_filesystem_ops_mkdir ( & self . client , system_name, path)
293334 . await
0 commit comments