openstack_cli_compute/v2/aggregate/
create_21.rs1use clap::Args;
23use eyre::WrapErr;
24use tracing::info;
25
26use openstack_cli_core::cli::CliArgs;
27use openstack_cli_core::error::OpenStackCliError;
28use openstack_cli_core::output::OutputProcessor;
29use openstack_sdk::AsyncOpenStack;
30
31use openstack_sdk::api::QueryAsync;
32use openstack_sdk::api::compute::v2::aggregate::create_21;
33use openstack_types::compute::v2::aggregate::response;
34
35#[derive(Args)]
44#[command(about = "Create Aggregate (microversion = 2.1)")]
45pub struct AggregateCommand {
46 #[command(flatten)]
48 query: QueryParameters,
49
50 #[command(flatten)]
52 path: PathParameters,
53
54 #[command(flatten)]
56 aggregate: Aggregate,
57}
58
59#[derive(Args)]
61struct QueryParameters {}
62
63#[derive(Args)]
65struct PathParameters {}
66#[derive(Args, Clone)]
68struct Aggregate {
69 #[arg(help_heading = "Body parameters", long)]
74 availability_zone: Option<String>,
75
76 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "availability_zone")]
78 no_availability_zone: bool,
79
80 #[arg(help_heading = "Body parameters", long)]
82 name: String,
83}
84
85impl AggregateCommand {
86 pub async fn take_action<C: CliArgs>(
88 &self,
89 parsed_args: &C,
90 client: &mut AsyncOpenStack,
91 ) -> Result<(), OpenStackCliError> {
92 info!("Create Aggregate");
93
94 let op = OutputProcessor::from_args(parsed_args, Some("compute.aggregate"), Some("create"));
95 op.validate_args(parsed_args)?;
96
97 let mut ep_builder = create_21::Request::builder();
98 ep_builder.header(
99 http::header::HeaderName::from_static("openstack-api-version"),
100 http::header::HeaderValue::from_static("compute 2.1"),
101 );
102
103 let args = &self.aggregate;
106 let mut aggregate_builder = create_21::AggregateBuilder::default();
107 if let Some(val) = &args.availability_zone {
108 aggregate_builder.availability_zone(Some(val.into()));
109 } else if args.no_availability_zone {
110 aggregate_builder.availability_zone(None);
111 }
112
113 aggregate_builder.name(&args.name);
114
115 ep_builder.aggregate(
116 aggregate_builder
117 .build()
118 .wrap_err("error preparing the request data")?,
119 );
120
121 let ep = ep_builder
122 .build()
123 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
124
125 let data: serde_json::Value = ep.query_async(client).await?;
126
127 op.output_single::<response::create_21::AggregateResponse>(data.clone())?;
128 op.show_command_hint()?;
130 Ok(())
131 }
132}