From 7f7b3bdbc8027feb373ba89ab5b94f14498e2fc4 Mon Sep 17 00:00:00 2001 From: Antoine Eiche Date: Sat, 14 Nov 2020 00:14:33 +0100 Subject: [PATCH 1/2] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a849321..ca6b669 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ FLAGS: -V, --version Prints version information OPTIONS: - --timeout Maximum time to wait for (in seconds) + --timeout Maximum time to wait for (in seconds and infinite by default) ARGS: The project of the jobset to wait for From 67da5071803485cdf63ba6829369b75f83391340 Mon Sep 17 00:00:00 2001 From: Antoine Eiche Date: Sat, 14 Nov 2020 00:17:45 +0100 Subject: [PATCH 2/2] jobset-wait: provide link to the jobset on failure Fixes #57 --- src/hydra/client.rs | 3 +++ src/hydra/reqwest_client.rs | 3 +++ src/ops/jobset_wait.rs | 25 +++++++++++++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/hydra/client.rs b/src/hydra/client.rs index 277ea9c..a4c360a 100644 --- a/src/hydra/client.rs +++ b/src/hydra/client.rs @@ -38,6 +38,9 @@ pub trait HydraClient { /// Authenticates with the server using username and password provided by `Creds` fn login(&self, creds: Creds) -> Result<(), ClientError>; + /// Returns the Hydra host + fn host(&self) -> String; + /// Searches the host for the nix store path `query` fn search(&self, query: &str) -> Result; diff --git a/src/hydra/reqwest_client.rs b/src/hydra/reqwest_client.rs index 5a03265..2307aa2 100644 --- a/src/hydra/reqwest_client.rs +++ b/src/hydra/reqwest_client.rs @@ -72,6 +72,9 @@ impl HydraClient for Client { } } + fn host(&self) -> String { + self.host.clone() + } fn projects(&self) -> Result, ClientError> { get_json(&self.client, &self.host) } diff --git a/src/ops/jobset_wait.rs b/src/ops/jobset_wait.rs index f4c2053..36d6328 100644 --- a/src/ops/jobset_wait.rs +++ b/src/ops/jobset_wait.rs @@ -22,19 +22,25 @@ fn is_evaluation_finished_after(jobset: &JobsetOverview, start: SystemTime) -> b } } -fn is_jobset_built(jobset: &JobsetOverview) -> Result { +fn is_jobset_built(client: &dyn HydraClient, jobset: &JobsetOverview) -> Result { if jobset.haserrormsg.unwrap_or(false) { println!(); Err(OpError::Error(format!( - "evaluation of jobset {} failed", + "evaluation of jobset {} failed; for details: {}/jobset/{}/{}", + jobset.name, + client.host(), + jobset.project, jobset.name ))) } else if jobset.nrfailed != 0 { println!(); Err(OpError::Error(format!( - "Jobset {} has {} failed jobs", + "Jobset {} has {} failed jobs; for details: {}/jobset/{}/{}", jobset.name, - jobset.nrfailed.to_string() + jobset.nrfailed.to_string(), + client.host(), + jobset.project, + jobset.name ))) } else if jobset.nrsucceeded == jobset.nrtotal { println!( @@ -96,7 +102,14 @@ pub fn run( let timeout_start = start; let mut nrscheduled = 0; - println!("waiting for jobset {}/{}", project_name, jobset_name); + println!( + "waiting for jobset {}/{} ({}/jobset/{}/{})", + project_name, + jobset_name, + client.host(), + project_name, + jobset_name + ); loop { match timeout { Some(t) if SystemTime::now().duration_since(timeout_start).unwrap() > t => { @@ -148,7 +161,7 @@ pub fn run( } } State::Building => { - if is_jobset_built(&jobset)? { + if is_jobset_built(client, &jobset)? { break; } else if nrscheduled != jobset.nrscheduled { nrscheduled = jobset.nrscheduled;