use std::sync::Arc;
use super::error::SupervisionError;
use super::fleet::{Convergence, WorkerSupervisor};
use super::status::ManagedWorkerStatus;
pub async fn converge_and_report(
supervisor: &Arc<WorkerSupervisor>,
name: &str,
mode: Convergence,
operation: &'static str,
) -> Result<ManagedWorkerStatus, SupervisionError> {
let converged = supervisor.converge(name, mode).await;
match &converged {
Ok(status) => tracing::info!(
operation,
worker = name,
desired = status.desired.token(),
state = status.state.token(),
"worker deployment converged on the node that accepted it"
),
Err(error @ SupervisionError::NotCommissioned) => tracing::warn!(
operation,
worker = name,
remedy = error.remedy(),
"the worker deployment was written durably but nothing supervises it on this server"
),
Err(error @ SupervisionError::UnknownDeployment { .. }) => tracing::warn!(
operation,
worker = name,
%error,
"the worker deployment was removed before this node could converge it"
),
Err(error) => tracing::error!(
operation,
worker = name,
%error,
"the worker deployment was written durably but could not be converged on this node"
),
}
converged
}