openstack_sdk_load_balancer/v2/healthmonitor/
set.rs1use derive_builder::Builder;
29use http::{HeaderMap, HeaderName, HeaderValue};
30
31use openstack_sdk_core::api::rest_endpoint_prelude::*;
32
33use serde::Deserialize;
34use serde::Serialize;
35use std::borrow::Cow;
36
37#[derive(Debug, Deserialize, Clone, Serialize)]
38pub enum HttpMethod {
39 #[serde(rename = "CONNECT")]
40 Connect,
41 #[serde(rename = "DELETE")]
42 Delete,
43 #[serde(rename = "GET")]
44 Get,
45 #[serde(rename = "HEAD")]
46 Head,
47 #[serde(rename = "OPTIONS")]
48 Options,
49 #[serde(rename = "PATCH")]
50 Patch,
51 #[serde(rename = "POST")]
52 Post,
53 #[serde(rename = "PUT")]
54 Put,
55 #[serde(rename = "TRACE")]
56 Trace,
57}
58
59#[derive(Builder, Debug, Deserialize, Clone, Serialize)]
61#[builder(setter(strip_option))]
62pub struct Healthmonitor<'a> {
63 #[serde(skip_serializing_if = "Option::is_none")]
66 #[builder(default, setter(into))]
67 pub(crate) admin_state_up: Option<bool>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 #[builder(default, setter(into))]
72 pub(crate) delay: Option<i32>,
73
74 #[serde(skip_serializing_if = "Option::is_none")]
79 #[builder(default, setter(into))]
80 pub(crate) domain_name: Option<Cow<'a, str>>,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
91 #[builder(default, setter(into))]
92 pub(crate) expected_codes: Option<Cow<'a, str>>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
98 #[builder(default)]
99 pub(crate) http_method: Option<HttpMethod>,
100
101 #[serde(skip_serializing_if = "Option::is_none")]
105 #[builder(default, setter(into))]
106 pub(crate) http_version: Option<f32>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
111 #[builder(default, setter(into))]
112 pub(crate) max_retries: Option<i32>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
118 #[builder(default, setter(into))]
119 pub(crate) max_retries_down: Option<i32>,
120
121 #[serde(skip_serializing_if = "Option::is_none")]
123 #[builder(default, setter(into))]
124 pub(crate) name: Option<Cow<'a, str>>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
130 #[builder(default, setter(into))]
131 pub(crate) tags: Option<Vec<Cow<'a, str>>>,
132
133 #[serde(skip_serializing_if = "Option::is_none")]
136 #[builder(default, setter(into))]
137 pub(crate) timeout: Option<i32>,
138
139 #[serde(skip_serializing_if = "Option::is_none")]
143 #[builder(default, setter(into))]
144 pub(crate) url_path: Option<Cow<'a, str>>,
145}
146
147#[derive(Builder, Debug, Clone)]
148#[builder(setter(strip_option))]
149pub struct Request<'a> {
150 #[builder(setter(into))]
152 pub(crate) healthmonitor: Healthmonitor<'a>,
153
154 #[builder(default, setter(into))]
157 id: Cow<'a, str>,
158
159 #[builder(setter(name = "_headers"), default, private)]
160 _headers: Option<HeaderMap>,
161}
162impl<'a> Request<'a> {
163 pub fn builder() -> RequestBuilder<'a> {
165 RequestBuilder::default()
166 }
167}
168
169impl<'a> RequestBuilder<'a> {
170 pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
172 where
173 K: Into<HeaderName>,
174 V: Into<HeaderValue>,
175 {
176 self._headers
177 .get_or_insert(None)
178 .get_or_insert_with(HeaderMap::new)
179 .insert(header_name.into(), header_value.into());
180 self
181 }
182
183 pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
185 where
186 I: Iterator<Item = T>,
187 T: Into<(Option<HeaderName>, HeaderValue)>,
188 {
189 self._headers
190 .get_or_insert(None)
191 .get_or_insert_with(HeaderMap::new)
192 .extend(iter.map(Into::into));
193 self
194 }
195}
196
197impl RestEndpoint for Request<'_> {
198 fn method(&self) -> http::Method {
199 http::Method::PUT
200 }
201
202 fn endpoint(&self) -> Cow<'static, str> {
203 format!("lbaas/healthmonitors/{id}", id = self.id.as_ref(),).into()
204 }
205
206 fn parameters(&self) -> QueryParams<'_> {
207 QueryParams::default()
208 }
209
210 fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
211 let mut params = JsonBodyParams::default();
212
213 params.push("healthmonitor", serde_json::to_value(&self.healthmonitor)?);
214
215 params.into_body()
216 }
217
218 fn service_type(&self) -> ServiceType {
219 ServiceType::LoadBalancer
220 }
221
222 fn response_key(&self) -> Option<Cow<'static, str>> {
223 Some("healthmonitor".into())
224 }
225
226 fn request_headers(&self) -> Option<&HeaderMap> {
228 self._headers.as_ref()
229 }
230
231 fn api_version(&self) -> Option<ApiVersion> {
233 Some(ApiVersion::new(2, 0))
234 }
235}
236
237#[cfg(test)]
238mod tests {
239 use super::*;
240 use http::{HeaderName, HeaderValue};
241 use httpmock::MockServer;
242 #[cfg(feature = "sync")]
243 use openstack_sdk_core::api::Query;
244 use openstack_sdk_core::test::client::FakeOpenStackClient;
245 use openstack_sdk_core::types::ServiceType;
246 use serde_json::json;
247
248 #[test]
249 fn test_service_type() {
250 assert_eq!(
251 Request::builder()
252 .healthmonitor(HealthmonitorBuilder::default().build().unwrap())
253 .build()
254 .unwrap()
255 .service_type(),
256 ServiceType::LoadBalancer
257 );
258 }
259
260 #[test]
261 fn test_response_key() {
262 assert_eq!(
263 Request::builder()
264 .healthmonitor(HealthmonitorBuilder::default().build().unwrap())
265 .build()
266 .unwrap()
267 .response_key()
268 .unwrap(),
269 "healthmonitor"
270 );
271 }
272
273 #[cfg(feature = "sync")]
274 #[test]
275 fn endpoint() {
276 let server = MockServer::start();
277 let client = FakeOpenStackClient::new(server.base_url());
278 let mock = server.mock(|when, then| {
279 when.method(httpmock::Method::PUT)
280 .path(format!("/lbaas/healthmonitors/{id}", id = "id",));
281
282 then.status(200)
283 .header("content-type", "application/json")
284 .json_body(json!({ "healthmonitor": {} }));
285 });
286
287 let endpoint = Request::builder()
288 .id("id")
289 .healthmonitor(HealthmonitorBuilder::default().build().unwrap())
290 .build()
291 .unwrap();
292 let _: serde_json::Value = endpoint.query(&client).unwrap();
293 mock.assert();
294 }
295
296 #[cfg(feature = "sync")]
297 #[test]
298 fn endpoint_headers() {
299 let server = MockServer::start();
300 let client = FakeOpenStackClient::new(server.base_url());
301 let mock = server.mock(|when, then| {
302 when.method(httpmock::Method::PUT)
303 .path(format!("/lbaas/healthmonitors/{id}", id = "id",))
304 .header("foo", "bar")
305 .header("not_foo", "not_bar");
306 then.status(200)
307 .header("content-type", "application/json")
308 .json_body(json!({ "healthmonitor": {} }));
309 });
310
311 let endpoint = Request::builder()
312 .id("id")
313 .healthmonitor(HealthmonitorBuilder::default().build().unwrap())
314 .headers(
315 [(
316 Some(HeaderName::from_static("foo")),
317 HeaderValue::from_static("bar"),
318 )]
319 .into_iter(),
320 )
321 .header(
322 HeaderName::from_static("not_foo"),
323 HeaderValue::from_static("not_bar"),
324 )
325 .build()
326 .unwrap();
327 let _: serde_json::Value = endpoint.query(&client).unwrap();
328 mock.assert();
329 }
330}