use crate::commands;
use crate::commands::instance_add_command::{
InstanceAddCommand, DEFAULT_CPU_COUNT, DEFAULT_DISK_SIZE, DEFAULT_MEM_SIZE,
};
use crate::error::Error;
use crate::image::ImageDao;
use crate::instance::{InstanceDao, PortForward};
use clap::Parser;
#[derive(Parser)]
pub struct InstanceRunCommand {
#[clap(conflicts_with = "name")]
instance_name: Option<String>,
#[clap(short, long)]
image: String,
#[clap(short, long, conflicts_with = "instance_name", hide = true)]
name: Option<String>,
#[clap(short, long, default_value = "cubic")]
user: String,
#[clap(short, long, default_value_t = DEFAULT_CPU_COUNT)]
cpus: u16,
#[clap(short, long, default_value = DEFAULT_MEM_SIZE)]
mem: String,
#[clap(short, long, default_value = DEFAULT_DISK_SIZE)]
disk: String,
#[clap(short, long)]
port: Vec<PortForward>,
#[clap(short, long, default_value_t = false)]
verbose: bool,
#[clap(short, long, default_value_t = false)]
quiet: bool,
}
impl InstanceRunCommand {
pub fn run(&self, image_dao: &ImageDao, instance_dao: &InstanceDao) -> Result<(), Error> {
let instance_name = self
.instance_name
.as_ref()
.or(self.name.as_ref())
.ok_or(Error::InvalidArgument("Missing instance name".to_string()))?
.to_string();
InstanceAddCommand::new(
instance_name.clone(),
self.image.to_string(),
self.user.clone(),
self.cpus,
self.mem.clone(),
self.disk.clone(),
self.port.clone(),
)
.run(image_dao, instance_dao)?;
commands::InstanceSshCommand {
instance: instance_name.clone(),
xforward: false,
verbose: self.verbose,
quiet: self.quiet,
ssh_args: None,
cmd: None,
}
.run(instance_dao)
}
}