use crate::cli::commands::{
add_boot_parameters, add_group, add_hw_component_cluster,
add_kernel_parameters, add_node, add_redfish_endpoint,
};
use crate::common::app_context::AppContext;
use crate::common::{
authentication::get_api_token, authorization::get_groups_names_available,
};
use anyhow::{Context, Error, bail};
use clap::ArgMatches;
use std::path::PathBuf;
pub async fn handle_add(
cli_add: &ArgMatches,
ctx: &AppContext<'_>,
) -> Result<(), Error> {
let token = get_api_token(ctx.infra.backend, ctx.infra.site_name).await?;
match cli_add.subcommand() {
Some(("node", m)) => {
let id = m
.get_one::<String>("id")
.context("'id' argument is mandatory")?;
let group = m
.get_one::<String>("group")
.context("'group' argument is mandatory")?;
let hardware_file_opt = m.get_one::<PathBuf>("hardware");
let arch_opt = m.get_one::<String>("arch").cloned();
let enabled = m.get_one::<bool>("disabled").cloned().unwrap_or(true);
add_node::exec(ctx, &token, id, group, enabled, arch_opt, hardware_file_opt)
.await?;
}
Some(("group", m)) => {
let label = m
.get_one::<String>("label")
.context("'label' argument is mandatory")?;
let description = m.get_one::<String>("description").map(String::as_str);
let node_expression = m.get_one::<String>("nodes").map(String::as_str);
add_group::exec(ctx, &token, label, description, node_expression, true, false)
.await?;
}
Some(("hardware", m)) => {
let target_hsm_group_name_arg_opt =
m.get_one::<String>("target-cluster").map(String::as_str);
let target_hsm_group_vec = get_groups_names_available(
ctx.infra.backend,
&token,
target_hsm_group_name_arg_opt,
ctx.cli.settings_hsm_group_name_opt,
)
.await?;
let parent_hsm_group_name_arg_opt =
m.get_one::<String>("parent-cluster").map(String::as_str);
let parent_hsm_group_vec = get_groups_names_available(
ctx.infra.backend,
&token,
parent_hsm_group_name_arg_opt,
ctx.cli.settings_hsm_group_name_opt,
)
.await?;
let dryrun = m.get_flag("dry-run");
let create_hsm_group =
*m.get_one::<bool>("create-hsm-group").unwrap_or(&false);
add_hw_component_cluster::exec(
ctx.infra.backend,
&token,
target_hsm_group_vec
.first()
.context("No target HSM groups available")?,
parent_hsm_group_vec
.first()
.context("No parent HSM groups available")?,
m.get_one::<String>("pattern")
.context("'pattern' argument is mandatory")?,
dryrun,
create_hsm_group,
)
.await?;
}
Some(("boot-parameters", m)) => {
add_boot_parameters::exec(ctx, &token, m).await?;
}
Some(("kernel-parameters", m)) => {
let hsm_group_name_arg_opt =
m.get_one::<String>("hsm-group").map(String::as_str);
let nodes_opt: Option<&str> = if hsm_group_name_arg_opt.is_none() {
m.get_one::<String>("nodes").map(String::as_str)
} else {
None
};
let kernel_parameters = m
.get_one::<String>("VALUE")
.context("'VALUE' argument is mandatory")?;
let overwrite: bool = m.get_flag("overwrite");
let assume_yes: bool = m.get_flag("assume-yes");
let do_not_reboot: bool = m.get_flag("do-not-reboot");
let dryrun = m.get_flag("dry-run");
add_kernel_parameters::exec(
ctx,
&token,
kernel_parameters,
nodes_opt,
hsm_group_name_arg_opt,
overwrite,
assume_yes,
do_not_reboot,
dryrun,
)
.await?;
}
Some(("redfish-endpoint", m)) => {
add_redfish_endpoint::exec(ctx, &token, m).await?;
}
Some((other, _)) => bail!("Unknown 'add' subcommand: {other}"),
None => bail!("No 'add' subcommand provided"),
}
Ok(())
}