openstack_cli_load_balancer/v2/pool/
set.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::find;
34use openstack_sdk::api::load_balancer::v2::pool::find;
35use openstack_sdk::api::load_balancer::v2::pool::set;
36use openstack_types::load_balancer::v2::pool::response;
37
38#[derive(Args)]
48#[command(about = "Update a Pool")]
49pub struct PoolCommand {
50 #[command(flatten)]
52 query: QueryParameters,
53
54 #[command(flatten)]
56 path: PathParameters,
57
58 #[command(flatten)]
60 pool: Pool,
61}
62
63#[derive(Args)]
65struct QueryParameters {}
66
67#[derive(Args)]
69struct PathParameters {
70 #[arg(
72 help_heading = "Path parameters",
73 id = "path_param_id",
74 value_name = "ID"
75 )]
76 id: String,
77}
78
79#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
80enum LbAlgorithm {
81 LeastConnections,
82 RoundRobin,
83 SourceIp,
84 SourceIpPort,
85}
86
87#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
88enum Type {
89 AppCookie,
90 HttpCookie,
91 SourceIp,
92}
93
94#[derive(Args, Clone)]
96#[group(required = false, multiple = true)]
97struct SessionPersistence {
98 #[arg(help_heading = "Body parameters", long)]
99 cookie_name: Option<String>,
100
101 #[arg(help_heading = "Body parameters", long)]
102 persistence_granularity: Option<String>,
103
104 #[arg(help_heading = "Body parameters", long)]
105 persistence_timeout: Option<i32>,
106
107 #[arg(help_heading = "Body parameters", long)]
108 _type: Option<Type>,
109}
110
111#[derive(Args, Clone)]
113struct Pool {
114 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
117 admin_state_up: Option<bool>,
118
119 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
125 alpn_protocols: Option<Vec<String>>,
126
127 #[arg(help_heading = "Body parameters", long)]
134 ca_tls_container_ref: Option<String>,
135
136 #[arg(help_heading = "Body parameters", long)]
141 crl_container_ref: Option<String>,
142
143 #[arg(help_heading = "Body parameters", long)]
145 description: Option<String>,
146
147 #[arg(help_heading = "Body parameters", long)]
150 lb_algorithm: Option<LbAlgorithm>,
151
152 #[arg(help_heading = "Body parameters", long)]
154 name: Option<String>,
155
156 #[command(flatten)]
160 session_persistence: Option<SessionPersistence>,
161
162 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
168 tags: Option<Vec<String>>,
169
170 #[arg(help_heading = "Body parameters", long)]
175 tls_ciphers: Option<String>,
176
177 #[arg(help_heading = "Body parameters", long)]
185 tls_container_ref: Option<String>,
186
187 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
192 tls_enabled: Option<bool>,
193
194 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
201 tls_versions: Option<Vec<String>>,
202}
203
204impl PoolCommand {
205 pub async fn take_action<C: CliArgs>(
207 &self,
208 parsed_args: &C,
209 client: &mut AsyncOpenStack,
210 ) -> Result<(), OpenStackCliError> {
211 info!("Set Pool");
212
213 let op = OutputProcessor::from_args(parsed_args, Some("load-balancer.pool"), Some("set"));
214 op.validate_args(parsed_args)?;
215
216 let mut find_builder = find::Request::builder();
217
218 find_builder.id(&self.path.id);
219
220 let find_ep = find_builder
221 .build()
222 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
223 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
224
225 let mut ep_builder = set::Request::builder();
226
227 let resource_id = find_data["id"]
228 .as_str()
229 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
230 .to_string();
231 ep_builder.id(resource_id.clone());
232
233 let args = &self.pool;
236 let mut pool_builder = set::PoolBuilder::default();
237 if let Some(val) = &args.admin_state_up {
238 pool_builder.admin_state_up(*val);
239 }
240
241 if let Some(val) = &args.alpn_protocols {
242 pool_builder.alpn_protocols(val.iter().map(Into::into).collect::<Vec<_>>());
243 }
244
245 if let Some(val) = &args.ca_tls_container_ref {
246 pool_builder.ca_tls_container_ref(val);
247 }
248
249 if let Some(val) = &args.crl_container_ref {
250 pool_builder.crl_container_ref(val);
251 }
252
253 if let Some(val) = &args.description {
254 pool_builder.description(val);
255 }
256
257 if let Some(val) = &args.lb_algorithm {
258 let tmp = match val {
259 LbAlgorithm::LeastConnections => set::LbAlgorithm::LeastConnections,
260 LbAlgorithm::RoundRobin => set::LbAlgorithm::RoundRobin,
261 LbAlgorithm::SourceIp => set::LbAlgorithm::SourceIp,
262 LbAlgorithm::SourceIpPort => set::LbAlgorithm::SourceIpPort,
263 };
264 pool_builder.lb_algorithm(tmp);
265 }
266
267 if let Some(val) = &args.name {
268 pool_builder.name(val);
269 }
270
271 if let Some(val) = &args.session_persistence {
272 let mut session_persistence_builder = set::SessionPersistenceBuilder::default();
273 if let Some(val) = &val.cookie_name {
274 session_persistence_builder.cookie_name(val);
275 }
276 if let Some(val) = &val.persistence_granularity {
277 session_persistence_builder.persistence_granularity(val);
278 }
279 if let Some(val) = &val.persistence_timeout {
280 session_persistence_builder.persistence_timeout(*val);
281 }
282 if let Some(val) = &val._type {
283 let tmp = match val {
284 Type::AppCookie => set::Type::AppCookie,
285 Type::HttpCookie => set::Type::HttpCookie,
286 Type::SourceIp => set::Type::SourceIp,
287 };
288 session_persistence_builder._type(tmp);
289 }
290 pool_builder.session_persistence(
291 session_persistence_builder
292 .build()
293 .wrap_err("error preparing the request data")?,
294 );
295 }
296
297 if let Some(val) = &args.tags {
298 pool_builder.tags(val.iter().map(Into::into).collect::<Vec<_>>());
299 }
300
301 if let Some(val) = &args.tls_ciphers {
302 pool_builder.tls_ciphers(val);
303 }
304
305 if let Some(val) = &args.tls_container_ref {
306 pool_builder.tls_container_ref(val);
307 }
308
309 if let Some(val) = &args.tls_enabled {
310 pool_builder.tls_enabled(*val);
311 }
312
313 if let Some(val) = &args.tls_versions {
314 pool_builder.tls_versions(val.iter().map(Into::into).collect::<Vec<_>>());
315 }
316
317 ep_builder.pool(
318 pool_builder
319 .build()
320 .wrap_err("error preparing the request data")?,
321 );
322
323 let ep = ep_builder
324 .build()
325 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
326
327 let data: serde_json::Value = ep.query_async(client).await?;
328
329 op.output_single::<response::set::PoolResponse>(data.clone())?;
330 op.show_command_hint()?;
332 Ok(())
333 }
334}