use crate::cli::args::CreateCommand;
use crate::k8s;
use crate::security;
pub fn create_command(cmd: &CreateCommand) -> Result<(), anyhow::Error> {
security::register_signal_handlers()?;
cmd.validate()?;
let request = if cmd.interactive {
crate::cli::interactive_create()?
} else {
cmd.to_secret_request()?
};
match k8s::load_context_sync() {
Ok(context) => {
eprintln!("\n{}", context.display());
eprintln!();
}
Err(e) => {
eprintln!("\n⚠️ Warning: Could not load cluster context");
eprintln!(" {}", e);
eprintln!();
eprintln!(" Possible causes:");
eprintln!(" - No kubeconfig file found (~/.kube/config or $KUBECONFIG)");
eprintln!(" - Invalid kubeconfig format");
eprintln!(" - No current context configured");
eprintln!();
eprintln!(" You can still create the sealed secret, but verify you're");
eprintln!(" targeting the correct cluster manually.");
eprintln!();
eprintln!(" Proceeding with secret creation...\n");
}
}
eprintln!("Sealing secret...");
let sealed_secret = k8s::seal_secret(&request)?;
eprintln!("✓ SealedSecret created successfully!\n");
let output = match cmd.output.as_str() {
"json" => serde_json::to_string_pretty(&sealed_secret)?,
_ => sealed_secret.to_yaml()?,
};
println!("{}", output);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_command_interactive_not_implemented() {
let cmd = CreateCommand {
name: "test-secret".to_string(),
namespace: "default".to_string(),
from_literal: vec!["key=value".to_string()],
labels: vec![],
annotations: vec![],
output: "yaml".to_string(),
interactive: true,
};
let result = create_command(&cmd);
assert!(result.is_err());
}
#[test]
fn test_create_command_validation_fails() {
let cmd = CreateCommand {
name: "".to_string(), namespace: "default".to_string(),
from_literal: vec!["key=value".to_string()],
labels: vec![],
annotations: vec![],
output: "yaml".to_string(),
interactive: false,
};
let result = create_command(&cmd);
assert!(result.is_err());
}
#[test]
fn test_create_command_no_literals() {
let cmd = CreateCommand {
name: "test-secret".to_string(),
namespace: "default".to_string(),
from_literal: vec![], labels: vec![],
annotations: vec![],
output: "yaml".to_string(),
interactive: false,
};
let result = create_command(&cmd);
assert!(result.is_err());
}
}