openstack_cli_load_balancer/v2/healthmonitor/
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::healthmonitor::find;
35use openstack_sdk::api::load_balancer::v2::healthmonitor::set;
36use openstack_types::load_balancer::v2::healthmonitor::response;
37
38#[derive(Args)]
48#[command(about = "Update a Health Monitor")]
49pub struct HealthmonitorCommand {
50 #[command(flatten)]
52 query: QueryParameters,
53
54 #[command(flatten)]
56 path: PathParameters,
57
58 #[command(flatten)]
60 healthmonitor: Healthmonitor,
61}
62
63#[derive(Args)]
65struct QueryParameters {}
66
67#[derive(Args)]
69struct PathParameters {
70 #[arg(
73 help_heading = "Path parameters",
74 id = "path_param_id",
75 value_name = "ID"
76 )]
77 id: String,
78}
79
80#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
81enum HttpMethod {
82 Connect,
83 Delete,
84 Get,
85 Head,
86 Options,
87 Patch,
88 Post,
89 Put,
90 Trace,
91}
92
93#[derive(Args, Clone)]
95struct Healthmonitor {
96 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
99 admin_state_up: Option<bool>,
100
101 #[arg(help_heading = "Body parameters", long)]
103 delay: Option<i32>,
104
105 #[arg(help_heading = "Body parameters", long)]
110 domain_name: Option<String>,
111
112 #[arg(help_heading = "Body parameters", long)]
121 expected_codes: Option<String>,
122
123 #[arg(help_heading = "Body parameters", long)]
127 http_method: Option<HttpMethod>,
128
129 #[arg(help_heading = "Body parameters", long)]
133 http_version: Option<f32>,
134
135 #[arg(help_heading = "Body parameters", long)]
138 max_retries: Option<i32>,
139
140 #[arg(help_heading = "Body parameters", long)]
144 max_retries_down: Option<i32>,
145
146 #[arg(help_heading = "Body parameters", long)]
148 name: Option<String>,
149
150 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
156 tags: Option<Vec<String>>,
157
158 #[arg(help_heading = "Body parameters", long)]
161 timeout: Option<i32>,
162
163 #[arg(help_heading = "Body parameters", long)]
167 url_path: Option<String>,
168}
169
170impl HealthmonitorCommand {
171 pub async fn take_action<C: CliArgs>(
173 &self,
174 parsed_args: &C,
175 client: &mut AsyncOpenStack,
176 ) -> Result<(), OpenStackCliError> {
177 info!("Set Healthmonitor");
178
179 let op = OutputProcessor::from_args(
180 parsed_args,
181 Some("load-balancer.healthmonitor"),
182 Some("set"),
183 );
184 op.validate_args(parsed_args)?;
185
186 let mut find_builder = find::Request::builder();
187
188 find_builder.id(&self.path.id);
189
190 let find_ep = find_builder
191 .build()
192 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
193 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
194
195 let mut ep_builder = set::Request::builder();
196
197 let resource_id = find_data["id"]
198 .as_str()
199 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
200 .to_string();
201 ep_builder.id(resource_id.clone());
202
203 let args = &self.healthmonitor;
206 let mut healthmonitor_builder = set::HealthmonitorBuilder::default();
207 if let Some(val) = &args.admin_state_up {
208 healthmonitor_builder.admin_state_up(*val);
209 }
210
211 if let Some(val) = &args.delay {
212 healthmonitor_builder.delay(*val);
213 }
214
215 if let Some(val) = &args.domain_name {
216 healthmonitor_builder.domain_name(val);
217 }
218
219 if let Some(val) = &args.expected_codes {
220 healthmonitor_builder.expected_codes(val);
221 }
222
223 if let Some(val) = &args.http_method {
224 let tmp = match val {
225 HttpMethod::Connect => set::HttpMethod::Connect,
226 HttpMethod::Delete => set::HttpMethod::Delete,
227 HttpMethod::Get => set::HttpMethod::Get,
228 HttpMethod::Head => set::HttpMethod::Head,
229 HttpMethod::Options => set::HttpMethod::Options,
230 HttpMethod::Patch => set::HttpMethod::Patch,
231 HttpMethod::Post => set::HttpMethod::Post,
232 HttpMethod::Put => set::HttpMethod::Put,
233 HttpMethod::Trace => set::HttpMethod::Trace,
234 };
235 healthmonitor_builder.http_method(tmp);
236 }
237
238 if let Some(val) = &args.http_version {
239 healthmonitor_builder.http_version(*val);
240 }
241
242 if let Some(val) = &args.max_retries {
243 healthmonitor_builder.max_retries(*val);
244 }
245
246 if let Some(val) = &args.max_retries_down {
247 healthmonitor_builder.max_retries_down(*val);
248 }
249
250 if let Some(val) = &args.name {
251 healthmonitor_builder.name(val);
252 }
253
254 if let Some(val) = &args.tags {
255 healthmonitor_builder.tags(val.iter().map(Into::into).collect::<Vec<_>>());
256 }
257
258 if let Some(val) = &args.timeout {
259 healthmonitor_builder.timeout(*val);
260 }
261
262 if let Some(val) = &args.url_path {
263 healthmonitor_builder.url_path(val);
264 }
265
266 ep_builder.healthmonitor(
267 healthmonitor_builder
268 .build()
269 .wrap_err("error preparing the request data")?,
270 );
271
272 let ep = ep_builder
273 .build()
274 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
275
276 let data: serde_json::Value = ep.query_async(client).await?;
277
278 op.output_single::<response::set::HealthmonitorResponse>(data.clone())?;
279 op.show_command_hint()?;
281 Ok(())
282 }
283}