summaryrefslogtreecommitdiffstats
path: root/src/endpoint
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-12-10 11:39:30 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-12-10 11:39:30 +0100
commit368d43485d6c888a23afe51743dd6026363238dc (patch)
treec06d924c36354c2c409072f7f708931c98339476 /src/endpoint
parent7ddbb6dc627e0086eb1da25278ee29922aa88473 (diff)
Rewrite container error reporting
This patch rewrites the container error reporting to be more simple. The ContainerError type was rewritten to not wrap other errors anymore, but be the root error itself. It only has one variant now, because there's only one kind of error: "It didn't work". The reporting in the calling functions can now use anyhow::Result<_> instead of std::result::Result because of that. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/endpoint')
-rw-r--r--src/endpoint/configured.rs5
-rw-r--r--src/endpoint/error.rs30
-rw-r--r--src/endpoint/scheduler.rs6
3 files changed, 5 insertions, 36 deletions
diff --git a/src/endpoint/configured.rs b/src/endpoint/configured.rs
index 191e565..a478857 100644
--- a/src/endpoint/configured.rs
+++ b/src/endpoint/configured.rs
@@ -1,6 +1,5 @@
use std::fmt::{Debug, Formatter};
use std::path::PathBuf;
-use std::result::Result as RResult;
use std::str::FromStr;
use std::sync::Arc;
@@ -176,7 +175,7 @@ impl Endpoint {
.map(|_| ())
}
- pub async fn run_job(&self, job: RunnableJob, logsink: UnboundedSender<LogItem>, staging: Arc<RwLock<StagingStore>>) -> RResult<(Vec<ArtifactPath>, ContainerHash, Script), ContainerError> {
+ pub async fn run_job(&self, job: RunnableJob, logsink: UnboundedSender<LogItem>, staging: Arc<RwLock<StagingStore>>) -> Result<(Vec<ArtifactPath>, ContainerHash, Script)> {
let (container_id, _warnings) = {
let envs = job.environment()
.into_iter()
@@ -365,7 +364,7 @@ impl Endpoint {
let script: Script = job.script().clone();
match exited_successfully {
- Some(false) => Err(ContainerError::container_error(ContainerHash::from(container_id), self.uri().clone())),
+ Some(false) => Err(ContainerError::container_error(ContainerHash::from(container_id), self.uri().clone())).map_err(Error::from),
Some(true) | None => {
container.stop(Some(std::time::Duration::new(1, 0)))
.await
diff --git a/src/endpoint/error.rs b/src/endpoint/error.rs
index dc4468a..5638efe 100644
--- a/src/endpoint/error.rs
+++ b/src/endpoint/error.rs
@@ -4,44 +4,16 @@ use crate::util::docker::ContainerHash;
#[derive(ThisError, Debug)]
pub enum ContainerError {
-
- #[error("Error during container run: {container_id}")]
+ #[error("Error during container run, connect using `docker --host {uri} exec -it {container_id} /bin/bash`")]
ContainerError {
container_id: ContainerHash,
uri: String,
},
-
- #[error("{0}")]
- Err(anyhow::Error),
}
impl ContainerError {
pub fn container_error(container_id: ContainerHash, uri: String) -> Self {
ContainerError::ContainerError { container_id, uri }
}
-
- pub fn explain_container_error(&self) -> Option<String> {
- match self {
- ContainerError::ContainerError { container_id, uri } => Some({
- indoc::formatdoc!(r#"
- Container did not exit successfully: {container_id}
- It was not stopped because of this.
-
- Use
-
- docker --host {uri} exec -it {container_id} /bin/bash
-
- to access and debug.
- "#, uri = uri, container_id = container_id)
- }),
- _ => None,
- }
- }
-}
-
-impl From<anyhow::Error> for ContainerError {
- fn from(ae: anyhow::Error) -> Self {
- ContainerError::Err(ae)
- }
}
diff --git a/src/endpoint/scheduler.rs b/src/endpoint/scheduler.rs
index 6d0eb1e..1b15789 100644
--- a/src/endpoint/scheduler.rs
+++ b/src/endpoint/scheduler.rs
@@ -1,5 +1,4 @@
use std::path::PathBuf;
-use std::result::Result as RResult;
use std::sync::Arc;
use anyhow::Context;
@@ -18,7 +17,6 @@ use tokio::sync::mpsc::UnboundedReceiver;
use uuid::Uuid;
use crate::db::models as dbmodels;
-use crate::endpoint::ContainerError;
use crate::endpoint::Endpoint;
use crate::endpoint::EndpointConfiguration;
use crate::filestore::StagingStore;
@@ -131,7 +129,7 @@ impl std::fmt::Debug for JobHandle {
}
impl JobHandle {
- pub async fn run(self) -> RResult<Vec<dbmodels::Artifact>, ContainerError> {
+ pub async fn run(self) -> Result<Vec<dbmodels::Artifact>> {
let (log_sender, log_receiver) = tokio::sync::mpsc::unbounded_channel::<LogItem>();
let ep = self.endpoint.read().await;
let endpoint = dbmodels::Endpoint::create_or_fetch(&self.db, ep.name())?;
@@ -156,7 +154,7 @@ impl JobHandle {
trace!("Found result for job {}: {:?}", job_id, res);
let log = logres.with_context(|| anyhow!("Collecting logs for job on '{}'", ep.name()))?;
- let (paths, container_hash, script) = res.with_context(|| anyhow!("Running job on '{}'", ep.name()))?;
+ let (paths, container_hash, script) = res.with_context(|| anyhow!("Error during running job on '{}'", ep.name()))?;
let job = dbmodels::Job::create(&self.db, &job_id, &self.submit, &endpoint, &package, &image, &container_hash, &script, &log)?;
for env in envs {