use clap::Subcommand;
use color_eyre::{eyre::eyre, Result};
use sn_testnet_deploy::{inventory::DeploymentInventoryService, TestnetDeployBuilder};
#[derive(Subcommand, Debug)]
pub enum TelegrafCommands {
Start {
#[clap(name = "custom-inventory", long, use_value_delimiter = true)]
custom_inventory: Option<Vec<String>>,
#[clap(long, default_value_t = 50)]
forks: usize,
#[arg(short = 'n', long)]
name: String,
#[arg(long, conflicts_with = "custom-inventory")]
node_type: Option<sn_testnet_deploy::NodeType>,
#[clap(long, default_value_t = sn_testnet_deploy::CloudProvider::DigitalOcean, value_parser = super::parse_provider, verbatim_doc_comment)]
provider: sn_testnet_deploy::CloudProvider,
},
Stop {
#[clap(name = "custom-inventory", long, use_value_delimiter = true)]
custom_inventory: Option<Vec<String>>,
#[clap(long, default_value_t = 50)]
forks: usize,
#[arg(short = 'n', long)]
name: String,
#[arg(long, conflicts_with = "custom-inventory")]
node_type: Option<sn_testnet_deploy::NodeType>,
#[clap(long, default_value_t = sn_testnet_deploy::CloudProvider::DigitalOcean, value_parser = super::parse_provider, verbatim_doc_comment)]
provider: sn_testnet_deploy::CloudProvider,
},
UpgradeClientConfig {
#[clap(long, default_value_t = 50)]
forks: usize,
#[arg(short = 'n', long)]
name: String,
#[clap(long, default_value_t = sn_testnet_deploy::CloudProvider::DigitalOcean, value_parser = super::parse_provider, verbatim_doc_comment)]
provider: sn_testnet_deploy::CloudProvider,
},
UpgradeNodeConfig {
#[clap(long, default_value_t = 50)]
forks: usize,
#[arg(short = 'n', long)]
name: String,
#[clap(long, default_value_t = sn_testnet_deploy::CloudProvider::DigitalOcean, value_parser = super::parse_provider, verbatim_doc_comment)]
provider: sn_testnet_deploy::CloudProvider,
},
UpgradeGeoIpConfig {
#[clap(long, default_value_t = 50)]
forks: usize,
#[arg(short = 'n', long)]
name: String,
#[clap(long, default_value_t = sn_testnet_deploy::CloudProvider::DigitalOcean, value_parser = super::parse_provider, verbatim_doc_comment)]
provider: sn_testnet_deploy::CloudProvider,
},
}
pub async fn handle_start_telegraf_command(
custom_inventory: Option<Vec<String>>,
forks: usize,
name: String,
node_type: Option<sn_testnet_deploy::NodeType>,
provider: sn_testnet_deploy::CloudProvider,
) -> Result<()> {
let testnet_deployer = TestnetDeployBuilder::default()
.ansible_forks(forks)
.environment_name(&name)
.provider(provider)
.build()?;
let inventory_service = DeploymentInventoryService::from(&testnet_deployer);
let inventory = inventory_service
.generate_or_retrieve_inventory(&name, true, None)
.await?;
if inventory.is_empty() {
return Err(eyre!("The {name} environment does not exist"));
}
let custom_inventory = if let Some(custom_inventory) = custom_inventory {
let custom_vms = super::get_custom_inventory(&inventory, &custom_inventory)?;
Some(custom_vms)
} else {
None
};
testnet_deployer.start_telegraf(node_type, custom_inventory)?;
Ok(())
}
pub async fn handle_stop_telegraf_command(
custom_inventory: Option<Vec<String>>,
forks: usize,
name: String,
node_type: Option<sn_testnet_deploy::NodeType>,
provider: sn_testnet_deploy::CloudProvider,
) -> Result<()> {
let testnet_deployer = TestnetDeployBuilder::default()
.ansible_forks(forks)
.environment_name(&name)
.provider(provider)
.build()?;
let inventory_service = DeploymentInventoryService::from(&testnet_deployer);
let inventory = inventory_service
.generate_or_retrieve_inventory(&name, true, None)
.await?;
if inventory.is_empty() {
return Err(eyre!("The {name} environment does not exist"));
}
let custom_inventory = if let Some(custom_inventory) = custom_inventory {
let custom_vms = super::get_custom_inventory(&inventory, &custom_inventory)?;
Some(custom_vms)
} else {
None
};
testnet_deployer.stop_telegraf(node_type, custom_inventory)?;
Ok(())
}
pub async fn handle_upgrade_client_telegraf_config(
forks: usize,
name: String,
provider: sn_testnet_deploy::CloudProvider,
) -> Result<()> {
let testnet_deployer = TestnetDeployBuilder::default()
.ansible_forks(forks)
.environment_name(&name)
.provider(provider)
.build()?;
let inventory_service = DeploymentInventoryService::from(&testnet_deployer);
let inventory = inventory_service
.generate_or_retrieve_inventory(&name, true, None)
.await?;
if inventory.is_empty() {
return Err(eyre!("The {name} environment does not exist"));
}
testnet_deployer.upgrade_client_telegraf(&name)?;
Ok(())
}
pub async fn handle_upgrade_node_telegraf_config(
forks: usize,
name: String,
provider: sn_testnet_deploy::CloudProvider,
) -> Result<()> {
let testnet_deployer = TestnetDeployBuilder::default()
.ansible_forks(forks)
.environment_name(&name)
.provider(provider)
.build()?;
let inventory_service = DeploymentInventoryService::from(&testnet_deployer);
let inventory = inventory_service
.generate_or_retrieve_inventory(&name, true, None)
.await?;
if inventory.is_empty() {
return Err(eyre!("The {name} environment does not exist"));
}
testnet_deployer.upgrade_node_telegraf(&name)?;
Ok(())
}
pub async fn handle_upgrade_geoip_telegraf_config(
forks: usize,
name: String,
provider: sn_testnet_deploy::CloudProvider,
) -> Result<()> {
let testnet_deployer = TestnetDeployBuilder::default()
.ansible_forks(forks)
.environment_name(&name)
.provider(provider)
.build()?;
let inventory_service = DeploymentInventoryService::from(&testnet_deployer);
let inventory = inventory_service
.generate_or_retrieve_inventory(&name, true, None)
.await?;
if inventory.is_empty() {
return Err(eyre!("The {name} environment does not exist"));
}
testnet_deployer.upgrade_geoip_telegraf(&name)?;
Ok(())
}