openstack_cli_load_balancer/v2/pool/
create.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 clap::ValueEnum;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::load_balancer::v2::pool::create;
34use openstack_types::load_balancer::v2::pool::response;
35use serde_json::Value;
36
37#[derive(Args)]
75#[command(about = "Create Pool")]
76pub struct PoolCommand {
77 #[command(flatten)]
79 query: QueryParameters,
80
81 #[command(flatten)]
83 path: PathParameters,
84
85 #[command(flatten)]
87 pool: Pool,
88}
89
90#[derive(Args)]
92struct QueryParameters {}
93
94#[derive(Args)]
96struct PathParameters {}
97
98#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
99enum LbAlgorithm {
100 LeastConnections,
101 RoundRobin,
102 SourceIp,
103 SourceIpPort,
104}
105
106#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
107enum Protocol {
108 Http,
109 Https,
110 Proxy,
111 Proxyv2,
112 Sctp,
113 Tcp,
114 Udp,
115}
116
117#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
118enum SessionPersistenceType {
119 AppCookie,
120 HttpCookie,
121 SourceIp,
122}
123
124#[derive(Args, Clone)]
126#[group(required = false, multiple = true)]
127struct SessionPersistence {
128 #[arg(help_heading = "Body parameters", long)]
129 cookie_name: Option<String>,
130
131 #[arg(help_heading = "Body parameters", long)]
132 persistence_granularity: Option<String>,
133
134 #[arg(help_heading = "Body parameters", long)]
135 persistence_timeout: Option<i32>,
136
137 #[arg(help_heading = "Body parameters", long, required = false)]
138 _type: SessionPersistenceType,
139}
140
141#[derive(Args, Clone)]
143struct Pool {
144 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
147 admin_state_up: Option<bool>,
148
149 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
155 alpn_protocols: Option<Vec<String>>,
156
157 #[arg(help_heading = "Body parameters", long)]
164 ca_tls_container_ref: Option<String>,
165
166 #[arg(help_heading = "Body parameters", long)]
171 crl_container_ref: Option<String>,
172
173 #[arg(help_heading = "Body parameters", long)]
175 description: Option<String>,
176
177 #[arg(help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
179 healthmonitor: Option<Value>,
180
181 #[arg(help_heading = "Body parameters", long)]
184 lb_algorithm: LbAlgorithm,
185
186 #[arg(help_heading = "Body parameters", long)]
191 listener_id: Option<String>,
192
193 #[arg(help_heading = "Body parameters", long)]
196 loadbalancer_id: Option<String>,
197
198 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
200 members: Option<Vec<Value>>,
201
202 #[arg(help_heading = "Body parameters", long)]
204 name: Option<String>,
205
206 #[arg(help_heading = "Body parameters", long)]
208 project_id: Option<String>,
209
210 #[arg(help_heading = "Body parameters", long)]
213 protocol: Protocol,
214
215 #[command(flatten)]
219 session_persistence: Option<SessionPersistence>,
220
221 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
223 tags: Option<Vec<String>>,
224
225 #[arg(help_heading = "Body parameters", long)]
226 tenant_id: Option<String>,
227
228 #[arg(help_heading = "Body parameters", long)]
233 tls_ciphers: Option<String>,
234
235 #[arg(help_heading = "Body parameters", long)]
243 tls_container_ref: Option<String>,
244
245 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
250 tls_enabled: Option<bool>,
251
252 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
259 tls_versions: Option<Vec<String>>,
260}
261
262impl PoolCommand {
263 pub async fn take_action<C: CliArgs>(
265 &self,
266 parsed_args: &C,
267 client: &mut AsyncOpenStack,
268 ) -> Result<(), OpenStackCliError> {
269 info!("Create Pool");
270
271 let op =
272 OutputProcessor::from_args(parsed_args, Some("load-balancer.pool"), Some("create"));
273 op.validate_args(parsed_args)?;
274
275 let mut ep_builder = create::Request::builder();
276
277 let args = &self.pool;
280 let mut pool_builder = create::PoolBuilder::default();
281 if let Some(val) = &args.admin_state_up {
282 pool_builder.admin_state_up(*val);
283 }
284
285 if let Some(val) = &args.alpn_protocols {
286 pool_builder.alpn_protocols(val.iter().map(Into::into).collect::<Vec<_>>());
287 }
288
289 if let Some(val) = &args.ca_tls_container_ref {
290 pool_builder.ca_tls_container_ref(val);
291 }
292
293 if let Some(val) = &args.crl_container_ref {
294 pool_builder.crl_container_ref(val);
295 }
296
297 if let Some(val) = &args.description {
298 pool_builder.description(val);
299 }
300
301 if let Some(val) = &args.healthmonitor {
302 pool_builder.healthmonitor(serde_json::from_value::<create::Healthmonitor>(
303 val.to_owned(),
304 )?);
305 }
306
307 let tmp = match &args.lb_algorithm {
308 LbAlgorithm::LeastConnections => create::LbAlgorithm::LeastConnections,
309 LbAlgorithm::RoundRobin => create::LbAlgorithm::RoundRobin,
310 LbAlgorithm::SourceIp => create::LbAlgorithm::SourceIp,
311 LbAlgorithm::SourceIpPort => create::LbAlgorithm::SourceIpPort,
312 };
313 pool_builder.lb_algorithm(tmp);
314
315 if let Some(val) = &args.listener_id {
316 pool_builder.listener_id(val);
317 }
318
319 if let Some(val) = &args.loadbalancer_id {
320 pool_builder.loadbalancer_id(val);
321 }
322
323 if let Some(val) = &args.members {
324 let members_builder: Vec<create::Members> = val
325 .iter()
326 .flat_map(|v| serde_json::from_value::<create::Members>(v.to_owned()))
327 .collect::<Vec<create::Members>>();
328 pool_builder.members(members_builder);
329 }
330
331 if let Some(val) = &args.name {
332 pool_builder.name(val);
333 }
334
335 if let Some(val) = &args.project_id {
336 pool_builder.project_id(val);
337 }
338
339 let tmp = match &args.protocol {
340 Protocol::Http => create::Protocol::Http,
341 Protocol::Https => create::Protocol::Https,
342 Protocol::Proxy => create::Protocol::Proxy,
343 Protocol::Proxyv2 => create::Protocol::Proxyv2,
344 Protocol::Sctp => create::Protocol::Sctp,
345 Protocol::Tcp => create::Protocol::Tcp,
346 Protocol::Udp => create::Protocol::Udp,
347 };
348 pool_builder.protocol(tmp);
349
350 if let Some(val) = &args.session_persistence {
351 let mut session_persistence_builder = create::SessionPersistenceBuilder::default();
352 if let Some(val) = &val.cookie_name {
353 session_persistence_builder.cookie_name(val);
354 }
355 if let Some(val) = &val.persistence_granularity {
356 session_persistence_builder.persistence_granularity(val);
357 }
358 if let Some(val) = &val.persistence_timeout {
359 session_persistence_builder.persistence_timeout(*val);
360 }
361
362 let tmp = match &val._type {
363 SessionPersistenceType::AppCookie => create::SessionPersistenceType::AppCookie,
364 SessionPersistenceType::HttpCookie => create::SessionPersistenceType::HttpCookie,
365 SessionPersistenceType::SourceIp => create::SessionPersistenceType::SourceIp,
366 };
367 session_persistence_builder._type(tmp);
368 pool_builder.session_persistence(
369 session_persistence_builder
370 .build()
371 .wrap_err("error preparing the request data")?,
372 );
373 }
374
375 if let Some(val) = &args.tags {
376 pool_builder.tags(val.iter().map(Into::into).collect::<Vec<_>>());
377 }
378
379 if let Some(val) = &args.tenant_id {
380 pool_builder.tenant_id(val);
381 }
382
383 if let Some(val) = &args.tls_ciphers {
384 pool_builder.tls_ciphers(val);
385 }
386
387 if let Some(val) = &args.tls_container_ref {
388 pool_builder.tls_container_ref(val);
389 }
390
391 if let Some(val) = &args.tls_enabled {
392 pool_builder.tls_enabled(*val);
393 }
394
395 if let Some(val) = &args.tls_versions {
396 pool_builder.tls_versions(val.iter().map(Into::into).collect::<Vec<_>>());
397 }
398
399 ep_builder.pool(
400 pool_builder
401 .build()
402 .wrap_err("error preparing the request data")?,
403 );
404
405 let ep = ep_builder
406 .build()
407 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
408
409 let data: serde_json::Value = ep.query_async(client).await?;
410
411 op.output_single::<response::create::PoolResponse>(data.clone())?;
412 op.show_command_hint()?;
414 Ok(())
415 }
416}