use clap::{Parser, Subcommand};
use crabka_operator::config::OperatorConfig;
use crabka_operator::{gen_crds, run};
#[derive(Debug, Parser)]
#[command(name = "crabka-operator", version, about)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Run(RunArgs),
GenCrds { out_dir: std::path::PathBuf },
CaRenewalCheck(CaRenewalCheckArgs),
}
#[derive(Debug, clap::Args)]
struct RunArgs {
#[command(flatten)]
config: OperatorConfig,
}
#[derive(Debug, clap::Args)]
struct CaRenewalCheckArgs {
#[arg(long, env = "WATCH_NAMESPACE")]
namespace: Option<String>,
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> anyhow::Result<()> {
rustls::crypto::ring::default_provider()
.install_default()
.expect("install default rustls CryptoProvider");
let cli = Cli::parse();
match cli.command {
Command::Run(args) => run::run(args.config).await,
Command::GenCrds { out_dir } => gen_crds::write_all(&out_dir),
Command::CaRenewalCheck(args) => {
tracing_subscriber::fmt::init();
let client = kube::Client::try_default().await?;
crabka_operator::controller::cluster_ca::run_renewal_check(
client,
args.namespace.as_deref(),
)
.await
.map_err(anyhow::Error::from)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
use clap::Parser;
#[test]
fn ca_renewal_check_parses() {
let cli = Cli::parse_from(["bin", "ca-renewal-check", "--namespace", "demo"]);
match cli.command {
Command::CaRenewalCheck(args) => {
assert!(args.namespace.as_deref() == Some("demo"));
}
_ => panic!("expected CaRenewalCheck variant"),
}
}
#[test]
fn ca_renewal_check_parses_no_namespace() {
let cli = Cli::parse_from(["bin", "ca-renewal-check"]);
match cli.command {
Command::CaRenewalCheck(args) => {
assert!(args.namespace.is_none());
}
_ => panic!("expected CaRenewalCheck variant"),
}
}
}