use super::{command_mechanism, ActionSpec};
use sysknife_types::RiskLevel;
pub fn specs() -> Vec<ActionSpec> {
vec![ubuntu_release_upgrade()]
}
pub fn ubuntu_release_upgrade() -> ActionSpec {
ActionSpec {
action_name: "UbuntuReleaseUpgrade",
mechanism: command_mechanism(
"sudo",
["do-release-upgrade", "-f", "DistUpgradeViewNonInteractive"],
),
risk_level: RiskLevel::High,
reboot_required: true,
rollback_available: false,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::actions::ActionMechanism;
fn extract_cmd(spec: &ActionSpec) -> (&'static str, Vec<&str>) {
match &spec.mechanism {
ActionMechanism::Command { program, args } => {
(*program, args.iter().map(String::as_str).collect())
}
_ => panic!("expected Command mechanism"),
}
}
#[test]
fn ubuntu_release_upgrade_action_name() {
assert_eq!(ubuntu_release_upgrade().action_name, "UbuntuReleaseUpgrade");
}
#[test]
fn ubuntu_release_upgrade_risk_high() {
assert_eq!(ubuntu_release_upgrade().risk_level, RiskLevel::High);
}
#[test]
fn ubuntu_release_upgrade_reboot_required() {
assert!(ubuntu_release_upgrade().reboot_required);
}
#[test]
fn ubuntu_release_upgrade_no_rollback() {
assert!(!ubuntu_release_upgrade().rollback_available);
}
#[test]
fn ubuntu_release_upgrade_argv() {
let spec = ubuntu_release_upgrade();
let (prog, args) = extract_cmd(&spec);
assert_eq!(prog, "sudo");
assert!(args.contains(&"do-release-upgrade"));
assert!(args.contains(&"-f"));
assert!(args.contains(&"DistUpgradeViewNonInteractive"));
}
#[test]
fn specs_covers_all_action_names() {
let expected = ["UbuntuReleaseUpgrade"];
let spec_names: Vec<&str> = specs().iter().map(|s| s.action_name).collect();
for name in &expected {
assert!(spec_names.contains(name), "specs() missing {name}");
}
}
}