openstack_cli_network/v2/floatingip/
list.rs1use clap::Args;
23use tracing::info;
24
25use openstack_cli_core::cli::CliArgs;
26use openstack_cli_core::error::OpenStackCliError;
27use openstack_cli_core::output::OutputProcessor;
28use openstack_sdk::AsyncOpenStack;
29
30use openstack_sdk::api::QueryAsync;
31use openstack_sdk::api::network::v2::floatingip::list;
32use openstack_sdk::api::{Pagination, paged};
33use openstack_types::network::v2::floatingip::response;
34
35#[derive(Args)]
59#[command(about = "List floating IPs")]
60pub struct FloatingipsCommand {
61 #[command(flatten)]
63 query: QueryParameters,
64
65 #[command(flatten)]
67 path: PathParameters,
68
69 #[arg(long, default_value_t = 10000)]
71 max_items: usize,
72}
73
74#[derive(Args)]
76struct QueryParameters {
77 #[arg(help_heading = "Query parameters", long)]
79 description: Option<String>,
80
81 #[arg(help_heading = "Query parameters", long)]
83 fixed_ip_address: Option<String>,
84
85 #[arg(help_heading = "Query parameters", long)]
87 floating_ip_address: Option<String>,
88
89 #[arg(help_heading = "Query parameters", long)]
91 floating_network_id: Option<String>,
92
93 #[arg(help_heading = "Query parameters", long)]
95 id: Option<String>,
96
97 #[arg(
102 help_heading = "Query parameters",
103 long("page-size"),
104 visible_alias("limit")
105 )]
106 limit: Option<u32>,
107
108 #[arg(help_heading = "Query parameters", long)]
112 marker: Option<String>,
113
114 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
116 not_tags: Option<Vec<String>>,
117
118 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
120 not_tags_any: Option<Vec<String>>,
121
122 #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
124 page_reverse: Option<bool>,
125
126 #[arg(help_heading = "Query parameters", long)]
128 port_id: Option<String>,
129
130 #[arg(help_heading = "Query parameters", long)]
132 revision_number: Option<String>,
133
134 #[arg(help_heading = "Query parameters", long)]
136 router_id: Option<String>,
137
138 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
141 sort_dir: Option<Vec<String>>,
142
143 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
146 sort_key: Option<Vec<String>>,
147
148 #[arg(help_heading = "Query parameters", long)]
150 status: Option<String>,
151
152 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
154 tags: Option<Vec<String>>,
155
156 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
158 tags_any: Option<Vec<String>>,
159
160 #[arg(help_heading = "Query parameters", long)]
162 tenant_id: Option<String>,
163}
164
165#[derive(Args)]
167struct PathParameters {}
168
169impl FloatingipsCommand {
170 pub async fn take_action<C: CliArgs>(
172 &self,
173 parsed_args: &C,
174 client: &mut AsyncOpenStack,
175 ) -> Result<(), OpenStackCliError> {
176 info!("List Floatingips");
177
178 let op = OutputProcessor::from_args(parsed_args, Some("network.floatingip"), Some("list"));
179 op.validate_args(parsed_args)?;
180
181 let mut ep_builder = list::Request::builder();
182
183 if let Some(val) = &self.query.description {
185 ep_builder.description(val);
186 }
187 if let Some(val) = &self.query.fixed_ip_address {
188 ep_builder.fixed_ip_address(val);
189 }
190 if let Some(val) = &self.query.floating_ip_address {
191 ep_builder.floating_ip_address(val);
192 }
193 if let Some(val) = &self.query.floating_network_id {
194 ep_builder.floating_network_id(val);
195 }
196 if let Some(val) = &self.query.id {
197 ep_builder.id(val);
198 }
199 if let Some(val) = &self.query.not_tags {
200 ep_builder.not_tags(val.iter());
201 }
202 if let Some(val) = &self.query.not_tags_any {
203 ep_builder.not_tags_any(val.iter());
204 }
205 if let Some(val) = &self.query.port_id {
206 ep_builder.port_id(val);
207 }
208 if let Some(val) = &self.query.revision_number {
209 ep_builder.revision_number(val);
210 }
211 if let Some(val) = &self.query.router_id {
212 ep_builder.router_id(val);
213 }
214 if let Some(val) = &self.query.status {
215 ep_builder.status(val);
216 }
217 if let Some(val) = &self.query.tags {
218 ep_builder.tags(val.iter());
219 }
220 if let Some(val) = &self.query.tags_any {
221 ep_builder.tags_any(val.iter());
222 }
223 if let Some(val) = &self.query.tenant_id {
224 ep_builder.tenant_id(val);
225 }
226 if let Some(val) = &self.query.limit {
227 ep_builder.limit(*val);
228 }
229 if let Some(val) = &self.query.marker {
230 ep_builder.marker(val);
231 }
232 if let Some(val) = &self.query.page_reverse {
233 ep_builder.page_reverse(*val);
234 }
235 if let Some(val) = &self.query.sort_dir {
236 ep_builder.sort_dir(val.iter());
237 }
238 if let Some(val) = &self.query.sort_key {
239 ep_builder.sort_key(val.iter());
240 }
241
242 let ep = ep_builder
243 .build()
244 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
245
246 let data: Vec<serde_json::Value> = paged(ep, Pagination::Limit(self.max_items))
247 .query_async(client)
248 .await?;
249
250 op.output_list::<response::list::FloatingipResponse>(data.clone())?;
251 op.show_command_hint()?;
253 Ok(())
254 }
255}