use clap::Args;
use tracing::info;
use openstack_sdk::AsyncOpenStack;
use crate::Cli;
use crate::OpenStackCliError;
use crate::output::OutputProcessor;
use openstack_sdk::api::QueryAsync;
use openstack_sdk::api::load_balancer::v2::amphorae::list;
use openstack_sdk::api::{Pagination, paged};
use openstack_types::load_balancer::v2::amphorae::response::list::AmphoraeResponse;
#[derive(Args)]
#[command(about = "List Amphora")]
pub struct AmphoraesCommand {
#[command(flatten)]
query: QueryParameters,
#[command(flatten)]
path: PathParameters,
#[arg(long, default_value_t = 10000)]
max_items: usize,
}
#[derive(Args)]
struct QueryParameters {
#[arg(help_heading = "Query parameters", long)]
cached_zone: Option<String>,
#[arg(help_heading = "Query parameters", long)]
cert_busy: Option<String>,
#[arg(help_heading = "Query parameters", long)]
cert_expiration: Option<String>,
#[arg(help_heading = "Query parameters", long)]
compute_flavor: Option<String>,
#[arg(help_heading = "Query parameters", long)]
compute_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
created_at: Option<String>,
#[arg(help_heading = "Query parameters", long)]
ha_ip: Option<String>,
#[arg(help_heading = "Query parameters", long)]
ha_port_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
image_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
lb_network_ip: Option<String>,
#[arg(
help_heading = "Query parameters",
long("page-size"),
visible_alias("limit")
)]
limit: Option<i32>,
#[arg(help_heading = "Query parameters", long)]
loadbalancer_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
marker: Option<String>,
#[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
page_reverse: Option<bool>,
#[arg(help_heading = "Query parameters", long)]
role: Option<String>,
#[arg(help_heading = "Query parameters", long)]
status: Option<String>,
#[arg(help_heading = "Query parameters", long)]
updated_at: Option<String>,
#[arg(help_heading = "Query parameters", long)]
vrrp_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
vrrp_interface: Option<String>,
#[arg(help_heading = "Query parameters", long)]
vrrp_ip: Option<String>,
#[arg(help_heading = "Query parameters", long)]
vrrp_port_id: Option<String>,
#[arg(help_heading = "Query parameters", long)]
vrrp_priority: Option<String>,
}
#[derive(Args)]
struct PathParameters {}
impl AmphoraesCommand {
pub async fn take_action(
&self,
parsed_args: &Cli,
client: &mut AsyncOpenStack,
) -> Result<(), OpenStackCliError> {
info!("List Amphoraes");
let op =
OutputProcessor::from_args(parsed_args, Some("load-balancer.amphorae"), Some("list"));
op.validate_args(parsed_args)?;
let mut ep_builder = list::Request::builder();
if let Some(val) = &self.query.cached_zone {
ep_builder.cached_zone(val);
}
if let Some(val) = &self.query.cert_busy {
ep_builder.cert_busy(val);
}
if let Some(val) = &self.query.cert_expiration {
ep_builder.cert_expiration(val);
}
if let Some(val) = &self.query.compute_flavor {
ep_builder.compute_flavor(val);
}
if let Some(val) = &self.query.compute_id {
ep_builder.compute_id(val);
}
if let Some(val) = &self.query.created_at {
ep_builder.created_at(val);
}
if let Some(val) = &self.query.ha_ip {
ep_builder.ha_ip(val);
}
if let Some(val) = &self.query.ha_port_id {
ep_builder.ha_port_id(val);
}
if let Some(val) = &self.query.id {
ep_builder.id(val);
}
if let Some(val) = &self.query.image_id {
ep_builder.image_id(val);
}
if let Some(val) = &self.query.lb_network_ip {
ep_builder.lb_network_ip(val);
}
if let Some(val) = &self.query.limit {
ep_builder.limit(*val);
}
if let Some(val) = &self.query.loadbalancer_id {
ep_builder.loadbalancer_id(val);
}
if let Some(val) = &self.query.marker {
ep_builder.marker(val);
}
if let Some(val) = &self.query.page_reverse {
ep_builder.page_reverse(*val);
}
if let Some(val) = &self.query.role {
ep_builder.role(val);
}
if let Some(val) = &self.query.status {
ep_builder.status(val);
}
if let Some(val) = &self.query.updated_at {
ep_builder.updated_at(val);
}
if let Some(val) = &self.query.vrrp_id {
ep_builder.vrrp_id(val);
}
if let Some(val) = &self.query.vrrp_interface {
ep_builder.vrrp_interface(val);
}
if let Some(val) = &self.query.vrrp_ip {
ep_builder.vrrp_ip(val);
}
if let Some(val) = &self.query.vrrp_port_id {
ep_builder.vrrp_port_id(val);
}
if let Some(val) = &self.query.vrrp_priority {
ep_builder.vrrp_priority(val);
}
let ep = ep_builder
.build()
.map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
let data: Vec<serde_json::Value> = paged(ep, Pagination::Limit(self.max_items))
.query_async(client)
.await?;
op.output_list::<AmphoraeResponse>(data)?;
op.show_command_hint()?;
Ok(())
}
}