openstack_sdk/api/network/v2/subnetpool/
list.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License at
4//
5//     http://www.apache.org/licenses/LICENSE-2.0
6//
7// Unless required by applicable law or agreed to in writing, software
8// distributed under the License is distributed on an "AS IS" BASIS,
9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10// See the License for the specific language governing permissions and
11// limitations under the License.
12//
13// SPDX-License-Identifier: Apache-2.0
14//
15// WARNING: This file is automatically generated from OpenAPI schema using
16// `openstack-codegenerator`.
17
18//! Lists subnet pools that the project has access to.
19//!
20//! Default policy settings return only the subnet pools owned by the project
21//! of the user submitting the request, unless the user has administrative
22//! role.
23//!
24//! Standard query parameters are supported on the URI. For more information,
25//! see [Filtering and Column Selection](#filtering).
26//!
27//! Use the `fields` query parameter to control which fields are returned in
28//! the response body. For more information, see [Fields](#fields).
29//!
30//! Pagination query parameters are supported if Neutron configuration supports
31//! it by overriding `allow_pagination=false`. For more information, see
32//! [Pagination](#pagination).
33//!
34//! Sorting query parameters are supported if Neutron configuration supports it
35//! with `allow_sorting=true`. For more information, see [Sorting](#sorting).
36//!
37//! Normal response codes: 200
38//!
39//! Error response codes: 401
40//!
41use derive_builder::Builder;
42use http::{HeaderMap, HeaderName, HeaderValue};
43
44use crate::api::rest_endpoint_prelude::*;
45
46use crate::api::common::CommaSeparatedList;
47use std::borrow::Cow;
48
49use crate::api::Pageable;
50#[derive(Builder, Debug, Clone)]
51#[builder(setter(strip_option))]
52pub struct Request<'a> {
53    /// address_scope_id query parameter for /v2.0/subnetpools API
54    #[builder(default, setter(into))]
55    address_scope_id: Option<Cow<'a, str>>,
56
57    /// default_prefixlen query parameter for /v2.0/subnetpools API
58    #[builder(default)]
59    default_prefixlen: Option<u32>,
60
61    /// default_quota query parameter for /v2.0/subnetpools API
62    #[builder(default)]
63    default_quota: Option<u32>,
64
65    /// description query parameter for /v2.0/subnetpools API
66    #[builder(default, setter(into))]
67    description: Option<Cow<'a, str>>,
68
69    /// id query parameter for /v2.0/subnetpools API
70    #[builder(default, setter(into))]
71    id: Option<Cow<'a, str>>,
72
73    /// ip_version query parameter for /v2.0/subnetpools API
74    #[builder(default, setter(into))]
75    ip_version: Option<Cow<'a, str>>,
76
77    /// is_default query parameter for /v2.0/subnetpools API
78    #[builder(default)]
79    is_default: Option<bool>,
80
81    /// Requests a page size of items. Returns a number of items up to a limit
82    /// value. Use the limit parameter to make an initial limited request and
83    /// use the ID of the last-seen item from the response as the marker
84    /// parameter value in a subsequent limited request.
85    #[builder(default)]
86    limit: Option<u32>,
87
88    /// The ID of the last-seen item. Use the limit parameter to make an
89    /// initial limited request and use the ID of the last-seen item from the
90    /// response as the marker parameter value in a subsequent limited request.
91    #[builder(default, setter(into))]
92    marker: Option<Cow<'a, str>>,
93
94    /// max_prefixlen query parameter for /v2.0/subnetpools API
95    #[builder(default)]
96    max_prefixlen: Option<u32>,
97
98    /// min_prefixlen query parameter for /v2.0/subnetpools API
99    #[builder(default)]
100    min_prefixlen: Option<u32>,
101
102    /// name query parameter for /v2.0/subnetpools API
103    #[builder(default, setter(into))]
104    name: Option<Cow<'a, str>>,
105
106    /// not-tags query parameter for /v2.0/subnetpools API
107    #[builder(default, private, setter(name = "_not_tags"))]
108    not_tags: Option<CommaSeparatedList<Cow<'a, str>>>,
109
110    /// not-tags-any query parameter for /v2.0/subnetpools API
111    #[builder(default, private, setter(name = "_not_tags_any"))]
112    not_tags_any: Option<CommaSeparatedList<Cow<'a, str>>>,
113
114    /// Reverse the page direction
115    #[builder(default)]
116    page_reverse: Option<bool>,
117
118    /// revision_number query parameter for /v2.0/subnetpools API
119    #[builder(default, setter(into))]
120    revision_number: Option<Cow<'a, str>>,
121
122    /// shared query parameter for /v2.0/subnetpools API
123    #[builder(default)]
124    shared: Option<bool>,
125
126    /// Sort direction. This is an optional feature and may be silently ignored
127    /// by the server.
128    #[builder(default, private, setter(name = "_sort_dir"))]
129    sort_dir: Option<Vec<Cow<'a, str>>>,
130
131    /// Sort results by the attribute. This is an optional feature and may be
132    /// silently ignored by the server.
133    #[builder(default, private, setter(name = "_sort_key"))]
134    sort_key: Option<Vec<Cow<'a, str>>>,
135
136    /// tags query parameter for /v2.0/subnetpools API
137    #[builder(default, private, setter(name = "_tags"))]
138    tags: Option<CommaSeparatedList<Cow<'a, str>>>,
139
140    /// tags-any query parameter for /v2.0/subnetpools API
141    #[builder(default, private, setter(name = "_tags_any"))]
142    tags_any: Option<CommaSeparatedList<Cow<'a, str>>>,
143
144    /// tenant_id query parameter for /v2.0/subnetpools API
145    #[builder(default, setter(into))]
146    tenant_id: Option<Cow<'a, str>>,
147
148    #[builder(setter(name = "_headers"), default, private)]
149    _headers: Option<HeaderMap>,
150}
151impl<'a> Request<'a> {
152    /// Create a builder for the endpoint.
153    pub fn builder() -> RequestBuilder<'a> {
154        RequestBuilder::default()
155    }
156}
157
158impl<'a> RequestBuilder<'a> {
159    /// Sort direction. This is an optional feature and may be silently ignored
160    /// by the server.
161    pub fn sort_dir<I, T>(&mut self, iter: I) -> &mut Self
162    where
163        I: Iterator<Item = T>,
164        T: Into<Cow<'a, str>>,
165    {
166        self.sort_dir
167            .get_or_insert(None)
168            .get_or_insert_with(Vec::new)
169            .extend(iter.map(Into::into));
170        self
171    }
172
173    /// Sort results by the attribute. This is an optional feature and may be
174    /// silently ignored by the server.
175    pub fn sort_key<I, T>(&mut self, iter: I) -> &mut Self
176    where
177        I: Iterator<Item = T>,
178        T: Into<Cow<'a, str>>,
179    {
180        self.sort_key
181            .get_or_insert(None)
182            .get_or_insert_with(Vec::new)
183            .extend(iter.map(Into::into));
184        self
185    }
186
187    /// not-tags query parameter for /v2.0/subnetpools API
188    pub fn not_tags<I, T>(&mut self, iter: I) -> &mut Self
189    where
190        I: Iterator<Item = T>,
191        T: Into<Cow<'a, str>>,
192    {
193        self.not_tags
194            .get_or_insert(None)
195            .get_or_insert_with(CommaSeparatedList::new)
196            .extend(iter.map(Into::into));
197        self
198    }
199
200    /// not-tags-any query parameter for /v2.0/subnetpools API
201    pub fn not_tags_any<I, T>(&mut self, iter: I) -> &mut Self
202    where
203        I: Iterator<Item = T>,
204        T: Into<Cow<'a, str>>,
205    {
206        self.not_tags_any
207            .get_or_insert(None)
208            .get_or_insert_with(CommaSeparatedList::new)
209            .extend(iter.map(Into::into));
210        self
211    }
212
213    /// tags query parameter for /v2.0/subnetpools API
214    pub fn tags<I, T>(&mut self, iter: I) -> &mut Self
215    where
216        I: Iterator<Item = T>,
217        T: Into<Cow<'a, str>>,
218    {
219        self.tags
220            .get_or_insert(None)
221            .get_or_insert_with(CommaSeparatedList::new)
222            .extend(iter.map(Into::into));
223        self
224    }
225
226    /// tags-any query parameter for /v2.0/subnetpools API
227    pub fn tags_any<I, T>(&mut self, iter: I) -> &mut Self
228    where
229        I: Iterator<Item = T>,
230        T: Into<Cow<'a, str>>,
231    {
232        self.tags_any
233            .get_or_insert(None)
234            .get_or_insert_with(CommaSeparatedList::new)
235            .extend(iter.map(Into::into));
236        self
237    }
238
239    /// Add a single header to the Subnetpool.
240    pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
241    where
242        K: Into<HeaderName>,
243        V: Into<HeaderValue>,
244    {
245        self._headers
246            .get_or_insert(None)
247            .get_or_insert_with(HeaderMap::new)
248            .insert(header_name.into(), header_value.into());
249        self
250    }
251
252    /// Add multiple headers.
253    pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
254    where
255        I: Iterator<Item = T>,
256        T: Into<(Option<HeaderName>, HeaderValue)>,
257    {
258        self._headers
259            .get_or_insert(None)
260            .get_or_insert_with(HeaderMap::new)
261            .extend(iter.map(Into::into));
262        self
263    }
264}
265
266impl RestEndpoint for Request<'_> {
267    fn method(&self) -> http::Method {
268        http::Method::GET
269    }
270
271    fn endpoint(&self) -> Cow<'static, str> {
272        "subnetpools".to_string().into()
273    }
274
275    fn parameters(&self) -> QueryParams<'_> {
276        let mut params = QueryParams::default();
277        params.push_opt("limit", self.limit);
278        params.push_opt("marker", self.marker.as_ref());
279        params.push_opt("page_reverse", self.page_reverse);
280        if let Some(val) = &self.sort_dir {
281            params.extend(val.iter().map(|value| ("sort_dir", value)));
282        }
283        if let Some(val) = &self.sort_key {
284            params.extend(val.iter().map(|value| ("sort_key", value)));
285        }
286        params.push_opt("address_scope_id", self.address_scope_id.as_ref());
287        params.push_opt("default_prefixlen", self.default_prefixlen);
288        params.push_opt("default_quota", self.default_quota);
289        params.push_opt("description", self.description.as_ref());
290        params.push_opt("id", self.id.as_ref());
291        params.push_opt("ip_version", self.ip_version.as_ref());
292        params.push_opt("is_default", self.is_default);
293        params.push_opt("max_prefixlen", self.max_prefixlen);
294        params.push_opt("min_prefixlen", self.min_prefixlen);
295        params.push_opt("name", self.name.as_ref());
296        params.push_opt("not-tags", self.not_tags.as_ref());
297        params.push_opt("not-tags-any", self.not_tags_any.as_ref());
298        params.push_opt("revision_number", self.revision_number.as_ref());
299        params.push_opt("shared", self.shared);
300        params.push_opt("tags", self.tags.as_ref());
301        params.push_opt("tags-any", self.tags_any.as_ref());
302        params.push_opt("tenant_id", self.tenant_id.as_ref());
303
304        params
305    }
306
307    fn service_type(&self) -> ServiceType {
308        ServiceType::Network
309    }
310
311    fn response_key(&self) -> Option<Cow<'static, str>> {
312        Some("subnetpools".into())
313    }
314
315    /// Returns headers to be set into the request
316    fn request_headers(&self) -> Option<&HeaderMap> {
317        self._headers.as_ref()
318    }
319
320    /// Returns required API version
321    fn api_version(&self) -> Option<ApiVersion> {
322        Some(ApiVersion::new(2, 0))
323    }
324}
325impl Pageable for Request<'_> {}
326
327#[cfg(test)]
328mod tests {
329    use super::*;
330    #[cfg(feature = "sync")]
331    use crate::api::Query;
332    use crate::test::client::FakeOpenStackClient;
333    use crate::types::ServiceType;
334    use http::{HeaderName, HeaderValue};
335    use httpmock::MockServer;
336    use serde_json::json;
337
338    #[test]
339    fn test_service_type() {
340        assert_eq!(
341            Request::builder().build().unwrap().service_type(),
342            ServiceType::Network
343        );
344    }
345
346    #[test]
347    fn test_response_key() {
348        assert_eq!(
349            Request::builder().build().unwrap().response_key().unwrap(),
350            "subnetpools"
351        );
352    }
353
354    #[cfg(feature = "sync")]
355    #[test]
356    fn endpoint() {
357        let server = MockServer::start();
358        let client = FakeOpenStackClient::new(server.base_url());
359        let mock = server.mock(|when, then| {
360            when.method(httpmock::Method::GET)
361                .path("/subnetpools".to_string());
362
363            then.status(200)
364                .header("content-type", "application/json")
365                .json_body(json!({ "subnetpools": {} }));
366        });
367
368        let endpoint = Request::builder().build().unwrap();
369        let _: serde_json::Value = endpoint.query(&client).unwrap();
370        mock.assert();
371    }
372
373    #[cfg(feature = "sync")]
374    #[test]
375    fn endpoint_headers() {
376        let server = MockServer::start();
377        let client = FakeOpenStackClient::new(server.base_url());
378        let mock = server.mock(|when, then| {
379            when.method(httpmock::Method::GET)
380                .path("/subnetpools".to_string())
381                .header("foo", "bar")
382                .header("not_foo", "not_bar");
383            then.status(200)
384                .header("content-type", "application/json")
385                .json_body(json!({ "subnetpools": {} }));
386        });
387
388        let endpoint = Request::builder()
389            .headers(
390                [(
391                    Some(HeaderName::from_static("foo")),
392                    HeaderValue::from_static("bar"),
393                )]
394                .into_iter(),
395            )
396            .header(
397                HeaderName::from_static("not_foo"),
398                HeaderValue::from_static("not_bar"),
399            )
400            .build()
401            .unwrap();
402        let _: serde_json::Value = endpoint.query(&client).unwrap();
403        mock.assert();
404    }
405}