feat: implement VM command handling in snp module for enhanced CLI functionality
This commit is contained in:
		
							parent
							
								
									daff2fd533
								
							
						
					
					
						commit
						30fc217ac3
					
				| @ -1,6 +1,7 @@ | |||||||
| use clap::{builder::PossibleValue, Arg, ArgMatches, Command}; | use clap::{builder::PossibleValue, Arg, ArgMatches, Command}; | ||||||
| use clap_complete::{generate, Shell}; | use clap_complete::{generate, Shell}; | ||||||
| use detee_cli::sgx::cli_handler::handle_app; | use detee_cli::sgx::cli_handler::handle_app; | ||||||
|  | use detee_cli::snp::cli_handler::handle_vm; | ||||||
| use detee_cli::*; | use detee_cli::*; | ||||||
| use std::error::Error; | use std::error::Error; | ||||||
| use std::io; | use std::io; | ||||||
| @ -598,98 +599,6 @@ fn handle_completion(matches: &ArgMatches, cmd: Command) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn handle_vm(matches: &ArgMatches) { |  | ||||||
|     match matches.subcommand() { |  | ||||||
|         Some(("deploy", args)) => cli_print(handle_vm_deploy(args)), |  | ||||||
|         Some(("ssh", args)) => cli_print(handle_vm_ssh(args)), |  | ||||||
|         Some(("list", args)) => cli_print(handle_vm_list(args)), |  | ||||||
|         Some(("inspect", inspect_args)) => { |  | ||||||
|             let uuid: String = inspect_args.get_one::<String>("uuid").unwrap().clone(); |  | ||||||
|             if *inspect_args.get_one::<bool>("show-node").unwrap() { |  | ||||||
|                 cli_print(snp::get_node_by_contract(&uuid).map_err(Into::into)); |  | ||||||
|             } else { |  | ||||||
|                 cli_print(snp::get_one_contract(&uuid).map_err(Into::into)); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         Some(("update", args)) => cli_print(handle_vm_update(args)), |  | ||||||
|         Some(("delete", args)) => cli_print(handle_vm_delete(args)), |  | ||||||
|         Some(("dtrfs", subcom_args)) => cli_print(handle_vm_dtrfs(subcom_args)), |  | ||||||
|         Some(("distro", _)) => cli_print(Ok(crate::snp::Distro::get_template_list())), |  | ||||||
|         _ => println!("No valid VM subcommand provided."), |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_deploy(matches: &ArgMatches) -> Result<snp::VmSshArgs, Box<dyn Error>> { |  | ||||||
|     if let Some(path) = matches.get_one::<String>("yaml-path") { |  | ||||||
|         return Ok(snp::deploy::Request::load_from_yaml(path)?); |  | ||||||
|     } |  | ||||||
|     let hostname = match matches.get_one::<String>("hostname") { |  | ||||||
|         Some(hostname) => hostname.to_string(), |  | ||||||
|         None => name_generator::random_vm_name(), |  | ||||||
|     }; |  | ||||||
|     let location = matches.get_one::<String>("location").unwrap().as_str(); |  | ||||||
|     let ipv4: crate::snp::deploy::IPv4Config = match matches.get_one::<bool>("public-ip").unwrap() { |  | ||||||
|         true => crate::snp::deploy::IPv4Config::PublicIPv4, |  | ||||||
|         false => crate::snp::deploy::IPv4Config::PublishPorts(Vec::new()), |  | ||||||
|     }; |  | ||||||
|     let distro = |  | ||||||
|         crate::snp::Distro::from_string(matches.get_one::<String>("distribution").unwrap()); |  | ||||||
|     let vm_config = snp::deploy::Request { |  | ||||||
|         hostname, |  | ||||||
|         location: location.into(), |  | ||||||
|         ipv4, |  | ||||||
|         public_ipv6: false, |  | ||||||
|         vcpus: *matches.get_one::<u32>("vcpus").unwrap(), |  | ||||||
|         memory_mb: *matches.get_one::<u32>("memory").unwrap(), |  | ||||||
|         disk_size_gb: *matches.get_one::<u32>("disk").unwrap(), |  | ||||||
|         dtrfs: None, |  | ||||||
|         hours: *matches.get_one::<u32>("hours").unwrap(), |  | ||||||
|         price: *matches.get_one::<u64>("price").unwrap(), |  | ||||||
|         distro: Some(distro), |  | ||||||
|     }; |  | ||||||
|     Ok(vm_config.deploy()?) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_update(update_vm_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> { |  | ||||||
|     let uuid = update_vm_args.get_one::<String>("uuid").unwrap().clone(); |  | ||||||
|     let memory = *update_vm_args.get_one::<u32>("memory").unwrap(); |  | ||||||
|     if memory > 0 && memory < 800 { |  | ||||||
|         log::error!("At least 800MB of memory must be assgined to the VM"); |  | ||||||
|         return Ok(SimpleOutput::from("")); |  | ||||||
|     } |  | ||||||
|     snp::update::Request::process_request( |  | ||||||
|         &uuid, |  | ||||||
|         *update_vm_args.get_one::<u32>("vcpus").unwrap(), |  | ||||||
|         memory, |  | ||||||
|         *update_vm_args.get_one::<u32>("disk").unwrap(), |  | ||||||
|         &update_vm_args.get_one::<String>("dtrfs").unwrap().to_string(), |  | ||||||
|     )?; |  | ||||||
|     let hours = *update_vm_args.get_one::<u32>("hours").unwrap(); |  | ||||||
|     if hours != 0 { |  | ||||||
|         snp::update::expand_vm_hours(&uuid, hours)?; |  | ||||||
|     } |  | ||||||
|     Ok(SimpleOutput::from("VM successfully updated.")) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_list(update_vm_args: &ArgMatches) -> Result<Vec<snp::VmContract>, Box<dyn Error>> { |  | ||||||
|     Ok(snp::list_contracts(*update_vm_args.get_one::<bool>("as-operator").unwrap())?) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_ssh(ssh_args: &ArgMatches) -> Result<snp::VmSshArgs, Box<dyn Error>> { |  | ||||||
|     let uuid: String = ssh_args.get_one::<String>("uuid").unwrap().clone(); |  | ||||||
|     Ok(snp::ssh(&uuid, *ssh_args.get_one::<bool>("just-print").unwrap())?) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_delete(delete_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> { |  | ||||||
|     let uuid: String = delete_args.get_one::<String>("uuid").unwrap().clone(); |  | ||||||
|     snp::delete_contract(&uuid)?; |  | ||||||
|     Ok(SimpleOutput::from("VM successfully deleted.")) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_dtrfs(_matches: &ArgMatches) -> Result<Vec<snp::Dtrfs>, Box<dyn Error>> { |  | ||||||
|     Ok(crate::snp::Dtrfs::print_dtrfs_list()) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn handle_vm_nodes(matches: &ArgMatches) { | fn handle_vm_nodes(matches: &ArgMatches) { | ||||||
|     match matches.subcommand() { |     match matches.subcommand() { | ||||||
|         Some(("search", _)) => cli_print(snp::print_nodes().map_err(Into::into)), |         Some(("search", _)) => cli_print(snp::print_nodes().map_err(Into::into)), | ||||||
|  | |||||||
							
								
								
									
										96
									
								
								src/snp/cli_handler.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										96
									
								
								src/snp/cli_handler.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | |||||||
|  | use crate::name_generator; | ||||||
|  | use crate::snp; | ||||||
|  | use crate::{cli_print, SimpleOutput}; | ||||||
|  | use clap::ArgMatches; | ||||||
|  | use std::error::Error; | ||||||
|  | 
 | ||||||
|  | pub fn handle_vm(matches: &ArgMatches) { | ||||||
|  |     match matches.subcommand() { | ||||||
|  |         Some(("deploy", args)) => cli_print(handle_vm_deploy(args)), | ||||||
|  |         Some(("ssh", args)) => cli_print(handle_vm_ssh(args)), | ||||||
|  |         Some(("list", args)) => cli_print(handle_vm_list(args)), | ||||||
|  |         Some(("inspect", inspect_args)) => { | ||||||
|  |             let uuid: String = inspect_args.get_one::<String>("uuid").unwrap().clone(); | ||||||
|  |             if *inspect_args.get_one::<bool>("show-node").unwrap() { | ||||||
|  |                 cli_print(snp::get_node_by_contract(&uuid).map_err(Into::into)); | ||||||
|  |             } else { | ||||||
|  |                 cli_print(snp::get_one_contract(&uuid).map_err(Into::into)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Some(("update", args)) => cli_print(handle_vm_update(args)), | ||||||
|  |         Some(("delete", args)) => cli_print(handle_vm_delete(args)), | ||||||
|  |         Some(("dtrfs", subcom_args)) => cli_print(handle_vm_dtrfs(subcom_args)), | ||||||
|  |         Some(("distro", _)) => cli_print(Ok(crate::snp::Distro::get_template_list())), | ||||||
|  |         _ => println!("No valid VM subcommand provided."), | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | fn handle_vm_deploy(matches: &ArgMatches) -> Result<snp::VmSshArgs, Box<dyn Error>> { | ||||||
|  |     if let Some(path) = matches.get_one::<String>("yaml-path") { | ||||||
|  |         return Ok(snp::deploy::Request::load_from_yaml(path)?); | ||||||
|  |     } | ||||||
|  |     let hostname = match matches.get_one::<String>("hostname") { | ||||||
|  |         Some(hostname) => hostname.to_string(), | ||||||
|  |         None => name_generator::random_vm_name(), | ||||||
|  |     }; | ||||||
|  |     let location = matches.get_one::<String>("location").unwrap().as_str(); | ||||||
|  |     let ipv4: crate::snp::deploy::IPv4Config = match matches.get_one::<bool>("public-ip").unwrap() { | ||||||
|  |         true => crate::snp::deploy::IPv4Config::PublicIPv4, | ||||||
|  |         false => crate::snp::deploy::IPv4Config::PublishPorts(Vec::new()), | ||||||
|  |     }; | ||||||
|  |     let distro = | ||||||
|  |         crate::snp::Distro::from_string(matches.get_one::<String>("distribution").unwrap()); | ||||||
|  |     let vm_config = snp::deploy::Request { | ||||||
|  |         hostname, | ||||||
|  |         location: location.into(), | ||||||
|  |         ipv4, | ||||||
|  |         public_ipv6: false, | ||||||
|  |         vcpus: *matches.get_one::<u32>("vcpus").unwrap(), | ||||||
|  |         memory_mb: *matches.get_one::<u32>("memory").unwrap(), | ||||||
|  |         disk_size_gb: *matches.get_one::<u32>("disk").unwrap(), | ||||||
|  |         dtrfs: None, | ||||||
|  |         hours: *matches.get_one::<u32>("hours").unwrap(), | ||||||
|  |         price: *matches.get_one::<u64>("price").unwrap(), | ||||||
|  |         distro: Some(distro), | ||||||
|  |     }; | ||||||
|  |     Ok(vm_config.deploy()?) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn handle_vm_ssh(ssh_args: &ArgMatches) -> Result<snp::VmSshArgs, Box<dyn Error>> { | ||||||
|  |     let uuid: String = ssh_args.get_one::<String>("uuid").unwrap().clone(); | ||||||
|  |     Ok(snp::ssh(&uuid, *ssh_args.get_one::<bool>("just-print").unwrap())?) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn handle_vm_list(update_vm_args: &ArgMatches) -> Result<Vec<snp::VmContract>, Box<dyn Error>> { | ||||||
|  |     Ok(snp::list_contracts(*update_vm_args.get_one::<bool>("as-operator").unwrap())?) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn handle_vm_update(update_vm_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> { | ||||||
|  |     let uuid = update_vm_args.get_one::<String>("uuid").unwrap().clone(); | ||||||
|  |     let memory = *update_vm_args.get_one::<u32>("memory").unwrap(); | ||||||
|  |     if memory > 0 && memory < 800 { | ||||||
|  |         log::error!("At least 800MB of memory must be assgined to the VM"); | ||||||
|  |         return Ok(SimpleOutput::from("")); | ||||||
|  |     } | ||||||
|  |     snp::update::Request::process_request( | ||||||
|  |         &uuid, | ||||||
|  |         *update_vm_args.get_one::<u32>("vcpus").unwrap(), | ||||||
|  |         memory, | ||||||
|  |         *update_vm_args.get_one::<u32>("disk").unwrap(), | ||||||
|  |         &update_vm_args.get_one::<String>("dtrfs").unwrap().to_string(), | ||||||
|  |     )?; | ||||||
|  |     let hours = *update_vm_args.get_one::<u32>("hours").unwrap(); | ||||||
|  |     if hours != 0 { | ||||||
|  |         snp::update::expand_vm_hours(&uuid, hours)?; | ||||||
|  |     } | ||||||
|  |     Ok(SimpleOutput::from("VM successfully updated.")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn handle_vm_delete(delete_args: &ArgMatches) -> Result<SimpleOutput, Box<dyn Error>> { | ||||||
|  |     let uuid: String = delete_args.get_one::<String>("uuid").unwrap().clone(); | ||||||
|  |     snp::delete_contract(&uuid)?; | ||||||
|  |     Ok(SimpleOutput::from("VM successfully deleted.")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn handle_vm_dtrfs(_matches: &ArgMatches) -> Result<Vec<snp::Dtrfs>, Box<dyn Error>> { | ||||||
|  |     Ok(crate::snp::Dtrfs::print_dtrfs_list()) | ||||||
|  | } | ||||||
| @ -1,3 +1,4 @@ | |||||||
|  | pub mod cli_handler; | ||||||
| pub mod deploy; | pub mod deploy; | ||||||
| pub mod grpc; | pub mod grpc; | ||||||
| mod injector; | mod injector; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user