openstack_cli_network/v2/port/
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::port::list;
32use openstack_sdk::api::{Pagination, paged};
33use openstack_types::network::v2::port::response;
34
35#[derive(Args)]
64#[command(about = "List ports")]
65pub struct PortsCommand {
66 #[command(flatten)]
68 query: QueryParameters,
69
70 #[command(flatten)]
72 path: PathParameters,
73
74 #[arg(long, default_value_t = 10000)]
76 max_items: usize,
77}
78
79#[derive(Args)]
81struct QueryParameters {
82 #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
84 admin_state_up: Option<bool>,
85
86 #[arg(help_heading = "Query parameters", long)]
88 binding_host_id: Option<String>,
89
90 #[arg(help_heading = "Query parameters", long)]
92 description: Option<String>,
93
94 #[arg(help_heading = "Query parameters", long)]
96 device_id: Option<String>,
97
98 #[arg(help_heading = "Query parameters", long)]
100 device_owner: Option<String>,
101
102 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
104 fixed_ips: Option<Vec<String>>,
105
106 #[arg(help_heading = "Query parameters", long)]
108 id: Option<String>,
109
110 #[arg(help_heading = "Query parameters", long)]
112 ip_allocation: Option<String>,
113
114 #[arg(
119 help_heading = "Query parameters",
120 long("page-size"),
121 visible_alias("limit")
122 )]
123 limit: Option<u32>,
124
125 #[arg(help_heading = "Query parameters", long)]
127 mac_address: Option<String>,
128
129 #[arg(help_heading = "Query parameters", long)]
133 marker: Option<String>,
134
135 #[arg(help_heading = "Query parameters", long)]
137 name: Option<String>,
138
139 #[arg(help_heading = "Query parameters", long)]
141 network_id: Option<String>,
142
143 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
145 not_tags: Option<Vec<String>>,
146
147 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
149 not_tags_any: Option<Vec<String>>,
150
151 #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
153 page_reverse: Option<bool>,
154
155 #[arg(help_heading = "Query parameters", long)]
157 revision_number: Option<String>,
158
159 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
161 security_groups: Option<Vec<String>>,
162
163 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
166 sort_dir: Option<Vec<String>>,
167
168 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
171 sort_key: Option<Vec<String>>,
172
173 #[arg(help_heading = "Query parameters", long)]
175 status: Option<String>,
176
177 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
179 tags: Option<Vec<String>>,
180
181 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
183 tags_any: Option<Vec<String>>,
184
185 #[arg(help_heading = "Query parameters", long)]
187 tenant_id: Option<String>,
188}
189
190#[derive(Args)]
192struct PathParameters {}
193
194impl PortsCommand {
195 pub async fn take_action<C: CliArgs>(
197 &self,
198 parsed_args: &C,
199 client: &mut AsyncOpenStack,
200 ) -> Result<(), OpenStackCliError> {
201 info!("List Ports");
202
203 let op = OutputProcessor::from_args(parsed_args, Some("network.port"), Some("list"));
204 op.validate_args(parsed_args)?;
205
206 let mut ep_builder = list::Request::builder();
207
208 if let Some(val) = &self.query.limit {
210 ep_builder.limit(*val);
211 }
212 if let Some(val) = &self.query.marker {
213 ep_builder.marker(val);
214 }
215 if let Some(val) = &self.query.page_reverse {
216 ep_builder.page_reverse(*val);
217 }
218 if let Some(val) = &self.query.admin_state_up {
219 ep_builder.admin_state_up(*val);
220 }
221 if let Some(val) = &self.query.binding_host_id {
222 ep_builder.binding_host_id(val);
223 }
224 if let Some(val) = &self.query.description {
225 ep_builder.description(val);
226 }
227 if let Some(val) = &self.query.device_id {
228 ep_builder.device_id(val);
229 }
230 if let Some(val) = &self.query.device_owner {
231 ep_builder.device_owner(val);
232 }
233 if let Some(val) = &self.query.fixed_ips {
234 ep_builder.fixed_ips(val.iter());
235 }
236 if let Some(val) = &self.query.id {
237 ep_builder.id(val);
238 }
239 if let Some(val) = &self.query.ip_allocation {
240 ep_builder.ip_allocation(val);
241 }
242 if let Some(val) = &self.query.mac_address {
243 ep_builder.mac_address(val);
244 }
245 if let Some(val) = &self.query.name {
246 ep_builder.name(val);
247 }
248 if let Some(val) = &self.query.network_id {
249 ep_builder.network_id(val);
250 }
251 if let Some(val) = &self.query.not_tags {
252 ep_builder.not_tags(val.iter());
253 }
254 if let Some(val) = &self.query.not_tags_any {
255 ep_builder.not_tags_any(val.iter());
256 }
257 if let Some(val) = &self.query.revision_number {
258 ep_builder.revision_number(val);
259 }
260 if let Some(val) = &self.query.security_groups {
261 ep_builder.security_groups(val.iter());
262 }
263 if let Some(val) = &self.query.status {
264 ep_builder.status(val);
265 }
266 if let Some(val) = &self.query.tags {
267 ep_builder.tags(val.iter());
268 }
269 if let Some(val) = &self.query.tags_any {
270 ep_builder.tags_any(val.iter());
271 }
272 if let Some(val) = &self.query.tenant_id {
273 ep_builder.tenant_id(val);
274 }
275 if let Some(val) = &self.query.sort_dir {
276 ep_builder.sort_dir(val.iter());
277 }
278 if let Some(val) = &self.query.sort_key {
279 ep_builder.sort_key(val.iter());
280 }
281
282 let ep = ep_builder
283 .build()
284 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
285
286 let data: Vec<serde_json::Value> = paged(ep, Pagination::Limit(self.max_items))
287 .query_async(client)
288 .await?;
289
290 op.output_list::<response::list::PortResponse>(data.clone())?;
291 op.show_command_hint()?;
293 Ok(())
294 }
295}