Skip to content

Commit 70b23ef

Browse files
committed
add filtering jobs by status in cli
1 parent daec0c1 commit 70b23ef

7 files changed

Lines changed: 55 additions & 18 deletions

File tree

coman/src/cli/app.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
cscs::{
1616
api_client::{
1717
client::{EdfSpec as EdfSpecEnum, ScriptSpec as ScriptSpecEnum},
18-
types::PathType,
18+
types::{JobStatus, PathType},
1919
},
2020
handlers::{cscs_file_list, cscs_job_list, file_system_roots},
2121
},
@@ -239,7 +239,10 @@ impl FromStr for JobIdOrName {
239239
#[derive(Subcommand, Debug)]
240240
pub enum CscsJobCommands {
241241
#[clap(alias("ls"), about = "List all jobs [aliases: ls]")]
242-
List,
242+
List {
243+
#[clap(short,long,help="filter by job status (separated by ',', [running, pending, finished, cancelled, failed, timeout, requeued])", value_delimiter=',', num_args=1.., value_enum)]
244+
status: Option<Vec<JobStatus>>,
245+
},
243246
#[clap(alias("g"), about = "Get metadata for a specific job [aliases: g]")]
244247
Get {
245248
#[arg(help="id or name of the job (name uses newest job of that name)", add = ArgValueCompleter::new(job_id_or_name_completer))]
@@ -330,7 +333,7 @@ fn job_id_or_name_completer(current: &std::ffi::OsStr) -> Vec<CompletionCandidat
330333
match jn {
331334
JobIdOrName::Id(id) => {
332335
tokio::spawn(async move {
333-
let jobs = cscs_job_list(None, None).await.unwrap();
336+
let jobs = cscs_job_list(None, None, None).await.unwrap();
334337
let partial_id = id.to_string();
335338
let ids: Vec<_> = jobs
336339
.iter()
@@ -345,7 +348,7 @@ fn job_id_or_name_completer(current: &std::ffi::OsStr) -> Vec<CompletionCandidat
345348
}
346349
JobIdOrName::Name(name) => {
347350
tokio::spawn(async move {
348-
let jobs = cscs_job_list(None, None).await.unwrap();
351+
let jobs = cscs_job_list(None, None, None).await.unwrap();
349352
let names: Vec<_> = jobs
350353
.into_iter()
351354
.map(|j| j.name)

coman/src/cscs/api_client/client.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use reqwest::Url;
2020

2121
use 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

coman/src/cscs/api_client/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ pub enum JobStatus {
192192
}
193193
impl From<String> for JobStatus {
194194
fn from(value: String) -> Self {
195-
match value.split_whitespace().next().unwrap() {
195+
match value.split_whitespace().next().unwrap().to_uppercase().as_str() {
196196
"RUNNING" => JobStatus::Running,
197197
"FAILED" => JobStatus::Failed,
198198
"COMPLETED" => JobStatus::Finished,

coman/src/cscs/cli.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ pub(crate) async fn cli_cscs_login() -> Result<()> {
7171
}
7272
Ok(())
7373
}
74-
pub(crate) async fn cli_cscs_job_list(system: Option<String>, platform: Option<ComputePlatform>) -> Result<()> {
75-
match cscs_job_list(system, platform).await {
74+
pub(crate) async fn cli_cscs_job_list(
75+
status: Option<Vec<JobStatus>>,
76+
system: Option<String>,
77+
platform: Option<ComputePlatform>,
78+
) -> Result<()> {
79+
match cscs_job_list(status, system, platform).await {
7680
Ok(jobs) => {
7781
let mut table = tabled::Table::new(jobs);
7882
table.with(tabled::settings::Style::modern());
@@ -90,7 +94,7 @@ async fn maybe_job_id_from_name(
9094
) -> Result<JobId> {
9195
match j {
9296
JobIdOrName::Id(id) => Ok(id.into()),
93-
JobIdOrName::Name(name) => match cscs_job_list(system, platform).await {
97+
JobIdOrName::Name(name) => match cscs_job_list(None, system, platform).await {
9498
Ok(jobs) => {
9599
let job = jobs
96100
.iter()

coman/src/cscs/handlers.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,17 @@ pub async fn cscs_system_set(system_name: String, global: bool) -> Result<()> {
136136
config.set("cscs.current_system", system_name, global)
137137
}
138138

139-
pub async fn cscs_job_list(system: Option<String>, platform: Option<ComputePlatform>) -> Result<Vec<Job>> {
139+
pub async fn cscs_job_list(
140+
status: Option<Vec<JobStatus>>,
141+
system: Option<String>,
142+
platform: Option<ComputePlatform>,
143+
) -> Result<Vec<Job>> {
140144
match get_access_token().await {
141145
Ok(access_token) => {
142146
let api_client = CscsApi::new(access_token.0, platform).unwrap();
143147
let config = Config::new().unwrap();
144148
api_client
145-
.list_jobs(&system.unwrap_or(config.values.cscs.current_system), None)
149+
.list_jobs(status, &system.unwrap_or(config.values.cscs.current_system), None)
146150
.await
147151
}
148152
Err(e) => Err(e),
@@ -367,7 +371,7 @@ async fn garbage_collect_ssh(api_client: &CscsApi, current_system: &str) -> Resu
367371
if !data_dir.exists() {
368372
return Ok(());
369373
}
370-
let jobs = api_client.list_jobs(current_system, None).await?;
374+
let jobs = api_client.list_jobs(None, current_system, None).await?;
371375
let job_entries: HashSet<_> = jobs
372376
.iter()
373377
.filter(|j| j.status == JobStatus::Pending || j.status == JobStatus::Running || j.status == JobStatus::Requeued)

coman/src/cscs/ports.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl AsyncFetchWorkloadsPort {
113113
#[tuirealm::async_trait]
114114
impl PollAsync<UserEvent> for AsyncFetchWorkloadsPort {
115115
async fn poll(&mut self) -> ListenerResult<Option<Event<UserEvent>>> {
116-
match cscs_job_list(None, None).await {
116+
match cscs_job_list(None, None, None).await {
117117
Ok(jobs) => Ok(Some(Event::User(UserEvent::Cscs(CscsEvent::GotWorkloadData(jobs))))),
118118
Err(e) => {
119119
let _ = trace_dbg!(e);

coman/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ async fn main() -> Result<()> {
107107
} => match cscs_command {
108108
CscsCommands::Login => cli_cscs_login().await?,
109109
CscsCommands::Job { command } => match command {
110-
CscsJobCommands::List => cli_cscs_job_list(system, platform).await?,
110+
CscsJobCommands::List { status } => cli_cscs_job_list(status, system, platform).await?,
111111
CscsJobCommands::Get { job } => cli_cscs_job_detail(job, system, platform).await?,
112112
CscsJobCommands::Log { job, stderr } => cli_cscs_job_log(job, stderr, system, platform).await?,
113113
CscsJobCommands::Submit {

0 commit comments

Comments
 (0)