diff --git a/crates/firecracker-up/src/cmd/mod.rs b/crates/firecracker-up/src/cmd/mod.rs index 449535c..2e998dd 100644 --- a/crates/firecracker-up/src/cmd/mod.rs +++ b/crates/firecracker-up/src/cmd/mod.rs @@ -3,6 +3,7 @@ pub mod init; pub mod logs; pub mod ps; pub mod reset; +pub mod rm; pub mod serve; pub mod ssh; pub mod start; diff --git a/crates/firecracker-up/src/cmd/rm.rs b/crates/firecracker-up/src/cmd/rm.rs new file mode 100644 index 0000000..7bc2fd5 --- /dev/null +++ b/crates/firecracker-up/src/cmd/rm.rs @@ -0,0 +1,22 @@ +use std::process; + +use anyhow::Error; +use firecracker_state::repo; + +pub async fn remove(name: &str) -> Result<(), Error> { + let pool = firecracker_state::create_connection_pool().await?; + let vm = repo::virtual_machine::find(&pool, name).await?; + + if vm.is_none() { + println!("[!] No virtual machine found with the name: {}", name); + process::exit(1); + } + let vm = vm.unwrap(); + + firecracker_process::stop(Some(vm.name)).await.ok(); + repo::virtual_machine::delete(&pool, &vm.id).await?; + + println!("{}", vm.id); + + Ok(()) +} diff --git a/crates/firecracker-up/src/main.rs b/crates/firecracker-up/src/main.rs index d998063..2a68522 100644 --- a/crates/firecracker-up/src/main.rs +++ b/crates/firecracker-up/src/main.rs @@ -4,8 +4,8 @@ use firecracker_vm::{constants::BRIDGE_DEV, mac::generate_unique_mac, types::VmO use owo_colors::OwoColorize; use crate::cmd::{ - down::down, init::init, logs::logs, ps::list_all_instances, reset::reset, serve::serve, - ssh::ssh, start::start, status::status, stop::stop, up::up, + down::down, init::init, logs::logs, ps::list_all_instances, reset::reset, rm::remove, + serve::serve, ssh::ssh, start::start, status::status, stop::stop, up::up, }; pub mod cmd; @@ -130,6 +130,11 @@ fn cli() -> Command { .arg(arg!([name] "Name of the Firecracker MicroVM to reset").required(false)) .about("Reset the Firecracker MicroVM"), ) + .subcommand( + Command::new("rm") + .arg(arg!( "Name or ID of the Firecracker MicroVM to delete").required(true)) + .about("Delete the Firecracker MicroVM"), + ) .subcommand( Command::new("serve") .about("Start fireup HTTP API server") @@ -283,6 +288,10 @@ async fn main() -> Result<()> { }) .await? } + Some(("rm", args)) => { + let name = args.get_one::("name").cloned().unwrap(); + remove(&name).await? + } Some(("serve", _)) => serve().await?, _ => { let debian = matches.get_one::("debian").copied().unwrap_or(false);