use std::sync::Arc;
use super::admission::AdmissionPolicy;
use crate::TaskSpec;
#[derive(Clone)]
#[must_use]
pub struct ControllerSpec {
pub admission: AdmissionPolicy,
pub task_spec: TaskSpec,
slot: Option<Arc<str>>,
}
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)
.field("slot", &self.slot_name())
.finish()
}
}
impl ControllerSpec {
pub fn new(admission: AdmissionPolicy, task_spec: TaskSpec) -> Self {
Self {
admission,
task_spec,
slot: None,
}
}
pub fn with_slot(mut self, slot: impl Into<Arc<str>>) -> Self {
self.slot = Some(slot.into());
self
}
pub fn slot_name(&self) -> &str {
self.slot
.as_deref()
.unwrap_or_else(|| self.task_spec.name())
}
pub fn queue(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::Queue, task_spec)
}
pub fn replace(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::Replace, task_spec)
}
pub fn drop_if_running(task_spec: TaskSpec) -> Self {
Self::new(AdmissionPolicy::DropIfRunning, task_spec)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::TaskContext;
use crate::{BackoffPolicy, RestartPolicy, TaskFn, TaskRef};
fn make_spec(name: &str) -> TaskSpec {
let task: TaskRef = TaskFn::arc(name, |_ctx: TaskContext| 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_falls_back_to_task_name() {
let cs = ControllerSpec::queue(make_spec("my-slot"));
assert_eq!(cs.slot_name(), "my-slot");
}
#[test]
fn slot_name_uses_explicit_slot() {
let cs = ControllerSpec::queue(make_spec("runner-web-7")).with_slot("web");
assert_eq!(cs.slot_name(), "web");
assert_eq!(cs.task_spec.name(), "runner-web-7");
}
}