use crate::document::ProvisionDoc;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct ControllerPlaybook {
pub(crate) path: String,
pub(crate) machine: String,
}
impl From<&ControllerPlaybook> for ProvisionDoc {
fn from(p: &ControllerPlaybook) -> ProvisionDoc {
ProvisionDoc { ansible: p.path.clone() }
}
}
pub(crate) fn starter(machine: &str) -> String {
format!(
"# Starter playbook for `{machine}`, run from Isoloom's controller over WinRM, written by Isothrum: edit it to build your lab.\n- hosts: {machine}\n tasks:\n - name: The machine answers\n ansible.windows.win_ping:\n"
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_controller_playbook_is_a_provision_step_and_its_starter_sets_up_its_machine() {
let p = ControllerPlaybook {
path: "provision/dc01.yml".into(),
machine: "dc01".into(),
};
assert_eq!(
ProvisionDoc::from(&p),
ProvisionDoc {
ansible: "provision/dc01.yml".into()
}
);
let starter = starter("dc01");
assert!(starter.contains("\n- hosts: dc01\n"), "{starter}");
assert!(starter.contains("ansible.windows.win_ping:"), "{starter}");
assert!(!starter.contains("become"), "WinRM has no sudo: {starter}");
}
}