use std::time::SystemTime;
use eyre::{Context, OptionExt};
use tonic::Request;
use crate::{AdminClient, JobTypeId, executor::ExecutorId, proto::admin::v1::ListExecutorsRequest};
pub struct ExecutorInfo {
pub id: ExecutorId,
pub name: Option<String>,
pub last_seen_at: SystemTime,
pub queues: Vec<ExecutorQueueInfo>,
}
pub struct ExecutorQueueInfo {
pub job_type_id: JobTypeId,
pub active_executions: u64,
pub max_concurrent_executions: u64,
}
impl AdminClient {
pub async fn list_executors(&self) -> crate::Result<Vec<ExecutorInfo>> {
self.inner
.list_executors(Request::new(ListExecutorsRequest {}))
.await?
.into_inner()
.executors
.into_iter()
.map(|j| {
Ok(ExecutorInfo {
id: ExecutorId(j.id.parse().wrap_err("invalid executor ID")?),
name: j.name,
last_seen_at: j
.last_seen_at
.map(TryInto::try_into)
.transpose()
.wrap_err("invalid last_seen_at")?
.ok_or_eyre("missing last_seen_at")?,
queues: j
.queues
.into_iter()
.map(|q| {
Ok(ExecutorQueueInfo {
job_type_id: JobTypeId::new(
q.job_type.ok_or_eyre("missing job type")?.id,
)?,
active_executions: q.active_executions,
max_concurrent_executions: q.max_concurrent_executions,
})
})
.collect::<Result<Vec<_>, crate::Error>>()?,
})
})
.collect::<Result<Vec<_>, crate::Error>>()
}
}