diff --git a/src/bin/stratis-min/stratis-min.rs b/src/bin/stratis-min/stratis-min.rs index 32aad13a39..26aea85992 100644 --- a/src/bin/stratis-min/stratis-min.rs +++ b/src/bin/stratis-min/stratis-min.rs @@ -9,11 +9,10 @@ use serde_json::{json, Map, Value}; use stratisd::{ engine::{ - EncryptionInfo, KeyDescription, Name, PoolIdentifier, PoolUuid, UnlockMethod, - CLEVIS_TANG_TRUST_URL, + EncryptionInfo, KeyDescription, Name, PoolIdentifier, PoolUuid, CLEVIS_TANG_TRUST_URL, }, jsonrpc::client::{filesystem, key, pool, report}, - stratis::{StratisError, VERSION}, + stratis::{UnlockMethod, VERSION}, }; fn parse_args() -> Command { @@ -41,7 +40,12 @@ fn parse_args() -> Command { Command::new("start") .arg(Arg::new("id").required(true)) .arg(Arg::new("name").long("name").num_args(0)) - .arg(Arg::new("unlock_method").long("unlock-method").num_args(1)) + .arg( + Arg::new("unlock_method") + .long("unlock-method") + .num_args(1) + .value_parser(clap::value_parser!(UnlockMethod)), + ) .arg( Arg::new("prompt") .long("prompt") @@ -235,13 +239,7 @@ fn main() -> Result<(), String> { .expect("required"), )?) }; - let unlock_method = - match args.get_one::("unlock_method").map(|s| s.as_str()) { - Some(um) => Some(UnlockMethod::try_from(um).map_err(|_| { - StratisError::Msg(format!("{um} is an invalid unlock method")) - })?), - None => None, - }; + let unlock_method = args.get_one::("unlock_method").copied(); let prompt = args.get_flag("prompt"); pool::pool_start(id, unlock_method, prompt)?; Ok(()) diff --git a/src/engine/types/mod.rs b/src/engine/types/mod.rs index 1909d6487d..faf4e6b802 100644 --- a/src/engine/types/mod.rs +++ b/src/engine/types/mod.rs @@ -16,7 +16,7 @@ use std::{ use libudev::EventType; use serde::{Deserialize, Serialize}; use serde_json::Value; -use strum_macros::{self, EnumString, FromRepr}; +use strum_macros::{self, EnumString, FromRepr, IntoStaticStr, VariantArray}; use uuid::Uuid; pub use crate::engine::{ @@ -131,7 +131,18 @@ impl Display for StratisUuid { } /// Use Clevis or keyring to unlock LUKS volume. -#[derive(Serialize, Deserialize, Clone, Copy, Eq, PartialEq, Debug, EnumString)] +#[derive( + Serialize, + Deserialize, + Clone, + Copy, + Eq, + PartialEq, + Debug, + EnumString, + VariantArray, + IntoStaticStr, +)] #[strum(serialize_all = "snake_case")] pub enum UnlockMethod { Clevis, diff --git a/src/stratis/command_line.rs b/src/stratis/command_line.rs new file mode 100644 index 0000000000..ff15124026 --- /dev/null +++ b/src/stratis/command_line.rs @@ -0,0 +1,20 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +use clap::{builder::PossibleValue, ValueEnum}; + +use strum::VariantArray; + +pub use crate::engine::UnlockMethod; + +impl ValueEnum for UnlockMethod { + fn value_variants<'a>() -> &'a [UnlockMethod] { + UnlockMethod::VARIANTS + } + + fn to_possible_value(&self) -> Option { + let value: &'static str = self.into(); + Some(PossibleValue::new(value)) + } +} diff --git a/src/stratis/mod.rs b/src/stratis/mod.rs index 06053b75dc..2c200b92b8 100644 --- a/src/stratis/mod.rs +++ b/src/stratis/mod.rs @@ -3,11 +3,13 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. pub use self::{ + command_line::UnlockMethod, errors::{StratisError, StratisResult}, run::run, stratis::VERSION, }; +mod command_line; mod dm; mod errors; mod ipc_support; diff --git a/tests/stratis_min.rs b/tests/stratis_min.rs index ad209857e9..68867a78b8 100644 --- a/tests/stratis_min.rs +++ b/tests/stratis_min.rs @@ -254,12 +254,7 @@ fn test_stratis_min_pool_start_invalid_unlock_method() { .arg("--name") .arg("pn") .arg("--unlock-method=bogus"); - cmd.assert() - .failure() - .code(1) - .stderr(predicate::str::contains( - "bogus is an invalid unlock method", - )); + cmd.assert().failure().code(2); } #[test]