use thiserror::Error;
use super::policy::UNCOMMISSIONED_REMEDY;
#[derive(Debug, Error)]
pub enum SupervisionError {
#[error("{UNCOMMISSIONED_REMEDY}")]
NotCommissioned,
#[error(
"worker deployment `{name}` was not found; create it first with a PUT to /worker-deployments/{name}"
)]
UnknownDeployment {
name: String,
},
#[error("worker deployment store failed: {source}")]
Store {
#[source]
source: aion_store::StoreError,
},
#[error("could not resolve the running server executable: {detail}")]
ExecutableUnresolved {
detail: String,
},
#[error("could not read managed worker executable `{path}`: {detail}")]
ExecutableUnreadable {
path: String,
detail: String,
},
#[error("managed worker `{name}` process failed: {source}")]
Process {
name: String,
#[source]
source: aion_worker::ProcessGroupError,
},
#[error("managed worker `{name}` could not be confirmed stopped: {detail}")]
StopIncomplete {
name: String,
detail: String,
},
#[error("managed worker `{name}` supervision task ended abnormally: {detail}")]
TaskLost {
name: String,
detail: String,
},
#[error("managed worker supervision state is poisoned: {detail}")]
StatePoisoned {
detail: String,
},
}
impl SupervisionError {
#[must_use]
pub const fn remedy(&self) -> Option<&'static str> {
match self {
Self::NotCommissioned => Some(UNCOMMISSIONED_REMEDY),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::SupervisionError;
#[test]
fn the_uncommissioned_refusal_names_the_section_and_every_required_key() {
let message = SupervisionError::NotCommissioned.to_string();
for expected in [
"[worker_supervision]",
"restart_backoff_initial_ms",
"restart_backoff_max_ms",
"restart_backoff_multiplier",
"restart_window_ms",
"max_restarts_per_window",
"stop_grace_ms",
] {
assert!(
message.contains(expected),
"the refusal must name `{expected}`: {message}"
);
}
assert_eq!(
SupervisionError::NotCommissioned.remedy(),
Some(super::UNCOMMISSIONED_REMEDY)
);
}
#[test]
fn an_unknown_deployment_refusal_names_the_deployment_and_the_way_to_create_it() {
let message = SupervisionError::UnknownDeployment {
name: "shells".to_owned(),
}
.to_string();
assert!(message.contains("shells"));
assert!(message.contains("/worker-deployments/shells"));
}
}