openstack_sdk_load_balancer/v2/l7policy/rule/
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 CompareType {
39 #[serde(rename = "CONTAINS")]
40 Contains,
41 #[serde(rename = "ENDS_WITH")]
42 EndsWith,
43 #[serde(rename = "EQUAL_TO")]
44 EqualTo,
45 #[serde(rename = "REGEX")]
46 Regex,
47 #[serde(rename = "STARTS_WITH")]
48 StartsWith,
49}
50
51#[derive(Debug, Deserialize, Clone, Serialize)]
52pub enum Type {
53 #[serde(rename = "COOKIE")]
54 Cookie,
55 #[serde(rename = "FILE_TYPE")]
56 FileType,
57 #[serde(rename = "HEADER")]
58 Header,
59 #[serde(rename = "HOST_NAME")]
60 HostName,
61 #[serde(rename = "PATH")]
62 Path,
63 #[serde(rename = "SSL_CONN_HAS_CERT")]
64 SslConnHasCert,
65 #[serde(rename = "SSL_DN_FIELD")]
66 SslDnField,
67 #[serde(rename = "SSL_VERIFY_RESULT")]
68 SslVerifyResult,
69}
70
71#[derive(Builder, Debug, Deserialize, Clone, Serialize)]
73#[builder(setter(strip_option))]
74pub struct Rule<'a> {
75 #[serde(skip_serializing_if = "Option::is_none")]
78 #[builder(default, setter(into))]
79 pub(crate) admin_state_up: Option<bool>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
84 #[builder(default)]
85 pub(crate) compare_type: Option<CompareType>,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
90 #[builder(default, setter(into))]
91 pub(crate) invert: Option<bool>,
92
93 #[serde(skip_serializing_if = "Option::is_none")]
96 #[builder(default, setter(into))]
97 pub(crate) key: Option<Cow<'a, str>>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
103 #[builder(default, setter(into))]
104 pub(crate) tags: Option<Vec<Cow<'a, str>>>,
105
106 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
109 #[builder(default)]
110 pub(crate) _type: Option<Type>,
111
112 #[serde(skip_serializing_if = "Option::is_none")]
115 #[builder(default, setter(into))]
116 pub(crate) value: Option<Cow<'a, str>>,
117}
118
119#[derive(Builder, Debug, Clone)]
120#[builder(setter(strip_option))]
121pub struct Request<'a> {
122 #[builder(setter(into))]
124 pub(crate) rule: Rule<'a>,
125
126 #[builder(default, setter(into))]
129 id: Cow<'a, str>,
130
131 #[builder(default, setter(into))]
134 l7policy_id: Cow<'a, str>,
135
136 #[builder(setter(name = "_headers"), default, private)]
137 _headers: Option<HeaderMap>,
138}
139impl<'a> Request<'a> {
140 pub fn builder() -> RequestBuilder<'a> {
142 RequestBuilder::default()
143 }
144}
145
146impl<'a> RequestBuilder<'a> {
147 pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
149 where
150 K: Into<HeaderName>,
151 V: Into<HeaderValue>,
152 {
153 self._headers
154 .get_or_insert(None)
155 .get_or_insert_with(HeaderMap::new)
156 .insert(header_name.into(), header_value.into());
157 self
158 }
159
160 pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
162 where
163 I: Iterator<Item = T>,
164 T: Into<(Option<HeaderName>, HeaderValue)>,
165 {
166 self._headers
167 .get_or_insert(None)
168 .get_or_insert_with(HeaderMap::new)
169 .extend(iter.map(Into::into));
170 self
171 }
172}
173
174impl RestEndpoint for Request<'_> {
175 fn method(&self) -> http::Method {
176 http::Method::PUT
177 }
178
179 fn endpoint(&self) -> Cow<'static, str> {
180 format!(
181 "lbaas/l7policies/{l7policy_id}/rules/{id}",
182 l7policy_id = self.l7policy_id.as_ref(),
183 id = self.id.as_ref(),
184 )
185 .into()
186 }
187
188 fn parameters(&self) -> QueryParams<'_> {
189 QueryParams::default()
190 }
191
192 fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
193 let mut params = JsonBodyParams::default();
194
195 params.push("rule", serde_json::to_value(&self.rule)?);
196
197 params.into_body()
198 }
199
200 fn service_type(&self) -> ServiceType {
201 ServiceType::LoadBalancer
202 }
203
204 fn response_key(&self) -> Option<Cow<'static, str>> {
205 Some("rule".into())
206 }
207
208 fn request_headers(&self) -> Option<&HeaderMap> {
210 self._headers.as_ref()
211 }
212
213 fn api_version(&self) -> Option<ApiVersion> {
215 Some(ApiVersion::new(2, 0))
216 }
217}
218
219#[cfg(test)]
220mod tests {
221 use super::*;
222 use http::{HeaderName, HeaderValue};
223 use httpmock::MockServer;
224 #[cfg(feature = "sync")]
225 use openstack_sdk_core::api::Query;
226 use openstack_sdk_core::test::client::FakeOpenStackClient;
227 use openstack_sdk_core::types::ServiceType;
228 use serde_json::json;
229
230 #[test]
231 fn test_service_type() {
232 assert_eq!(
233 Request::builder()
234 .rule(RuleBuilder::default().build().unwrap())
235 .build()
236 .unwrap()
237 .service_type(),
238 ServiceType::LoadBalancer
239 );
240 }
241
242 #[test]
243 fn test_response_key() {
244 assert_eq!(
245 Request::builder()
246 .rule(RuleBuilder::default().build().unwrap())
247 .build()
248 .unwrap()
249 .response_key()
250 .unwrap(),
251 "rule"
252 );
253 }
254
255 #[cfg(feature = "sync")]
256 #[test]
257 fn endpoint() {
258 let server = MockServer::start();
259 let client = FakeOpenStackClient::new(server.base_url());
260 let mock = server.mock(|when, then| {
261 when.method(httpmock::Method::PUT).path(format!(
262 "/lbaas/l7policies/{l7policy_id}/rules/{id}",
263 l7policy_id = "l7policy_id",
264 id = "id",
265 ));
266
267 then.status(200)
268 .header("content-type", "application/json")
269 .json_body(json!({ "rule": {} }));
270 });
271
272 let endpoint = Request::builder()
273 .l7policy_id("l7policy_id")
274 .id("id")
275 .rule(RuleBuilder::default().build().unwrap())
276 .build()
277 .unwrap();
278 let _: serde_json::Value = endpoint.query(&client).unwrap();
279 mock.assert();
280 }
281
282 #[cfg(feature = "sync")]
283 #[test]
284 fn endpoint_headers() {
285 let server = MockServer::start();
286 let client = FakeOpenStackClient::new(server.base_url());
287 let mock = server.mock(|when, then| {
288 when.method(httpmock::Method::PUT)
289 .path(format!(
290 "/lbaas/l7policies/{l7policy_id}/rules/{id}",
291 l7policy_id = "l7policy_id",
292 id = "id",
293 ))
294 .header("foo", "bar")
295 .header("not_foo", "not_bar");
296 then.status(200)
297 .header("content-type", "application/json")
298 .json_body(json!({ "rule": {} }));
299 });
300
301 let endpoint = Request::builder()
302 .l7policy_id("l7policy_id")
303 .id("id")
304 .rule(RuleBuilder::default().build().unwrap())
305 .headers(
306 [(
307 Some(HeaderName::from_static("foo")),
308 HeaderValue::from_static("bar"),
309 )]
310 .into_iter(),
311 )
312 .header(
313 HeaderName::from_static("not_foo"),
314 HeaderValue::from_static("not_bar"),
315 )
316 .build()
317 .unwrap();
318 let _: serde_json::Value = endpoint.query(&client).unwrap();
319 mock.assert();
320 }
321}