diff --git a/src/command/exec.rs b/src/command/exec.rs index a2b8d38..5f3616a 100644 --- a/src/command/exec.rs +++ b/src/command/exec.rs @@ -110,9 +110,18 @@ pub async fn run( })); } - join_all(futures).await; + let results: Vec> = join_all(futures).await; - Ok(()) + let mut failed: usize = 0; + + for x in results { + match x { + Err(_) => failed += 1, + Ok(_) => (), + } + } + + Ok(failed) }); let (meta, monitor, output) = tokio::join!( @@ -121,9 +130,13 @@ pub async fn run( output.run_until_completion(), ); - meta?; + let failed = meta?; monitor?; output?; - Ok(()) + if failed > 0 { + Err(ColmenaError::ExecError { n_hosts: failed }) + } else { + Ok(()) + } } diff --git a/src/error.rs b/src/error.rs index 9b827ea..a9855e6 100644 --- a/src/error.rs +++ b/src/error.rs @@ -75,6 +75,9 @@ pub enum ColmenaError { #[snafu(display("Unknown error: {}", message))] Unknown { message: String }, + + #[snafu(display("Exec failed on {} hosts", n_hosts))] + ExecError { n_hosts: usize }, } impl From for ColmenaError {