use super::admission::AdmissionPolicy;
use crate::TaskSpec;
#[derive(Clone)]
#[must_use]
pub struct ControllerSpec {
pub admission: AdmissionPolicy,
pub task_spec: TaskSpec,
}
impl std::fmt::Debug for ControllerSpec {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ControllerSpec")
.field("admission", &self.admission)
.field("task_spec", &self.task_spec)
.finish()
}
}
impl ControllerSpec {
pub fn new(admission: AdmissionPolicy, task_spec: TaskSpec) -> Self {
Self {
admission,
task_spec,
}
}
pub fn slot_name(&self) -> &str {
self.task_spec.name()
}
#[inline]
pub fn queue(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::Queue, task_spec)
}
#[inline]
pub fn replace(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::Replace, task_spec)
}
#[inline]
pub fn drop_if_running(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::DropIfRunning, task_spec)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{BackoffPolicy, RestartPolicy, TaskFn, TaskRef};
use tokio_util::sync::CancellationToken;
fn make_spec(name: &str) -> TaskSpec {
let task: TaskRef = TaskFn::arc(name, |_ctx: CancellationToken| async { Ok(()) });
TaskSpec::new(task, RestartPolicy::Never, BackoffPolicy::default(), None)
}
#[test]
fn convenience_constructors_set_correct_policy() {
assert_eq!(
ControllerSpec::queue(make_spec("t")).admission,
AdmissionPolicy::Queue
);
assert_eq!(
ControllerSpec::replace(make_spec("t")).admission,
AdmissionPolicy::Replace
);
assert_eq!(
ControllerSpec::drop_if_running(make_spec("t")).admission,
AdmissionPolicy::DropIfRunning
);
}
#[test]
fn slot_name_equals_task_name() {
let cs = ControllerSpec::queue(make_spec("my-slot"));
assert_eq!(cs.slot_name(), "my-slot");
}
}