openstack_cli_load_balancer/v2/l7policy/
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::l7policy::find;
35use openstack_sdk::api::load_balancer::v2::l7policy::set;
36use openstack_types::load_balancer::v2::l7policy::response;
37
38#[derive(Args)]
51#[command(about = "Update a L7 Policy")]
52pub struct L7PolicyCommand {
53 #[command(flatten)]
55 query: QueryParameters,
56
57 #[command(flatten)]
59 path: PathParameters,
60
61 #[command(flatten)]
63 l7policy: L7policy,
64}
65
66#[derive(Args)]
68struct QueryParameters {}
69
70#[derive(Args)]
72struct PathParameters {
73 #[arg(
75 help_heading = "Path parameters",
76 id = "path_param_id",
77 value_name = "ID"
78 )]
79 id: String,
80}
81
82#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
83enum Action {
84 RedirectPrefix,
85 RedirectToPool,
86 RedirectToUrl,
87 Reject,
88}
89
90#[derive(Args, Clone)]
92struct L7policy {
93 #[arg(help_heading = "Body parameters", long)]
96 action: Option<Action>,
97
98 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
101 admin_state_up: Option<bool>,
102
103 #[arg(help_heading = "Body parameters", long)]
105 description: Option<String>,
106
107 #[arg(help_heading = "Body parameters", long)]
109 name: Option<String>,
110
111 #[arg(help_heading = "Body parameters", long)]
113 position: Option<i32>,
114
115 #[arg(help_heading = "Body parameters", long)]
122 redirect_http_code: Option<i32>,
123
124 #[arg(help_heading = "Body parameters", long)]
129 redirect_pool_id: Option<String>,
130
131 #[arg(help_heading = "Body parameters", long)]
134 redirect_prefix: Option<String>,
135
136 #[arg(help_heading = "Body parameters", long)]
139 redirect_url: Option<String>,
140
141 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
147 tags: Option<Vec<String>>,
148}
149
150impl L7PolicyCommand {
151 pub async fn take_action<C: CliArgs>(
153 &self,
154 parsed_args: &C,
155 client: &mut AsyncOpenStack,
156 ) -> Result<(), OpenStackCliError> {
157 info!("Set L7Policy");
158
159 let op =
160 OutputProcessor::from_args(parsed_args, Some("load-balancer.l7policy"), Some("set"));
161 op.validate_args(parsed_args)?;
162
163 let mut find_builder = find::Request::builder();
164
165 find_builder.id(&self.path.id);
166
167 let find_ep = find_builder
168 .build()
169 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
170 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
171
172 let mut ep_builder = set::Request::builder();
173
174 let resource_id = find_data["id"]
175 .as_str()
176 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
177 .to_string();
178 ep_builder.id(resource_id.clone());
179
180 let args = &self.l7policy;
183 let mut l7policy_builder = set::L7policyBuilder::default();
184 if let Some(val) = &args.action {
185 let tmp = match val {
186 Action::RedirectPrefix => set::Action::RedirectPrefix,
187 Action::RedirectToPool => set::Action::RedirectToPool,
188 Action::RedirectToUrl => set::Action::RedirectToUrl,
189 Action::Reject => set::Action::Reject,
190 };
191 l7policy_builder.action(tmp);
192 }
193
194 if let Some(val) = &args.admin_state_up {
195 l7policy_builder.admin_state_up(*val);
196 }
197
198 if let Some(val) = &args.description {
199 l7policy_builder.description(val);
200 }
201
202 if let Some(val) = &args.name {
203 l7policy_builder.name(val);
204 }
205
206 if let Some(val) = &args.position {
207 l7policy_builder.position(*val);
208 }
209
210 if let Some(val) = &args.redirect_http_code {
211 l7policy_builder.redirect_http_code(*val);
212 }
213
214 if let Some(val) = &args.redirect_pool_id {
215 l7policy_builder.redirect_pool_id(val);
216 }
217
218 if let Some(val) = &args.redirect_prefix {
219 l7policy_builder.redirect_prefix(val);
220 }
221
222 if let Some(val) = &args.redirect_url {
223 l7policy_builder.redirect_url(val);
224 }
225
226 if let Some(val) = &args.tags {
227 l7policy_builder.tags(val.iter().map(Into::into).collect::<Vec<_>>());
228 }
229
230 ep_builder.l7policy(
231 l7policy_builder
232 .build()
233 .wrap_err("error preparing the request data")?,
234 );
235
236 let ep = ep_builder
237 .build()
238 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
239
240 let data: serde_json::Value = ep.query_async(client).await?;
241
242 op.output_single::<response::set::L7policyResponse>(data.clone())?;
243 op.show_command_hint()?;
245 Ok(())
246 }
247}