diff --git a/src/cmd/remove.rs b/src/cmd/remove.rs index f4d4929..b9bb5f7 100644 --- a/src/cmd/remove.rs +++ b/src/cmd/remove.rs @@ -1,9 +1,9 @@ -use crate::kubeconfig; use crate::metadata::{self, Metadata}; use crate::Error; +use crate::{config, kubeconfig}; use anyhow::Result; use anyhow::{anyhow, bail}; -use clap::{value_parser, Arg, ArgGroup, ArgMatches, Command}; +use clap::{value_parser, Arg, ArgAction, ArgGroup, ArgMatches, Command}; use std::{fs, path::Path}; pub const NAME: &str = "remove"; @@ -23,8 +23,17 @@ pub fn command() -> Command { .value_delimiter(',') .value_parser(metadata::selectors::parse), ) + .arg( + Arg::new("active") + .help("Remove the currently active kubeconfig") + .long("active") + .required(false) + .action(ArgAction::SetTrue) + .value_parser(clap::value_parser!(bool)), + + ) .group(ArgGroup::new("target") - .args(["kubeconfig", "selectors"]) + .args(["kubeconfig", "selectors", "active"]) .required(true)) .arg_required_else_help(true) } @@ -45,16 +54,28 @@ pub fn execute(config_dir: &Path, matches: &ArgMatches) -> Result<()> { kubeconfig::list(config_dir, &metadata, Some(selectors))? } false => { - let config = matches - .get_one::("kubeconfig") - .ok_or_else(|| anyhow!("failed to get kubeconfig argument"))?; + if matches.contains_id("kubeconfig") { + let config = matches + .get_one::("kubeconfig") + .ok_or_else(|| anyhow!("failed to get kubeconfig argument"))?; - vec![ - (kubeconfig::ListEntry { - name: config.to_string(), - labels: None, - }), - ] + vec![ + (kubeconfig::ListEntry { + name: config.to_string(), + labels: None, + }), + ] + } else if matches.contains_id("active") { + let current = config::get_last_active(config_dir)?; + vec![ + (kubeconfig::ListEntry { + name: current, + labels: None, + }), + ] + } else { + vec![] + } } }; diff --git a/tests/remove.rs b/tests/remove.rs index a66d7cc..d73fed0 100644 --- a/tests/remove.rs +++ b/tests/remove.rs @@ -141,3 +141,72 @@ fn test_kbs_remove_by_selector() { .success() .stdout(is_empty()); } + +#[test] +fn test_kbs_remove_active() { + let temp_dir = tempdir().unwrap(); + let base_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/files"); + + // initial import should succeed. + Command::cargo_bin("kbs") + .unwrap() + .args(&[ + "-c", + temp_dir.path().to_str().unwrap(), + "import", + base_dir.join("test.kubeconfig").to_str().unwrap(), + ]) + .assert() + .success(); + + Command::cargo_bin("kbs") + .unwrap() + .args(&[ + "-c", + temp_dir.path().to_str().unwrap(), + "import", + base_dir.join("localhost.kubeconfig").to_str().unwrap(), + ]) + .assert() + .success(); + + // both should be listed. + Command::cargo_bin("kbs") + .unwrap() + .args(&["-c", temp_dir.path().to_str().unwrap(), "list"]) + .assert() + .success() + .stdout(is_match("^kubernetes.embik.me\nlocalhost\n$").unwrap()); + + // use one of them + Command::cargo_bin("kbs") + .unwrap() + .args(&[ + "-c", + temp_dir.path().to_str().unwrap(), + "use", + "kubernetes.embik.me", + ]) + .assert() + .success(); + + // removing active kubeconfig should succeed. + Command::cargo_bin("kbs") + .unwrap() + .args(&[ + "-c", + temp_dir.path().to_str().unwrap(), + "remove", + "--active", + ]) + .assert() + .success(); + + // only the other kubeconfig should be listed. + Command::cargo_bin("kbs") + .unwrap() + .args(&["-c", temp_dir.path().to_str().unwrap(), "list"]) + .assert() + .success() + .stdout(is_match("^localhost\n$").unwrap()); +}