openstack_cli_network/v2/agent/
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::agent::list;
32use openstack_sdk::api::{Pagination, paged};
33use openstack_types::network::v2::agent::response;
34
35#[derive(Args)]
54#[command(about = "List all agents")]
55pub struct AgentsCommand {
56 #[command(flatten)]
58 query: QueryParameters,
59
60 #[command(flatten)]
62 path: PathParameters,
63
64 #[arg(long, default_value_t = 10000)]
66 max_items: usize,
67}
68
69#[derive(Args)]
71struct QueryParameters {
72 #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
74 admin_state_up: Option<bool>,
75
76 #[arg(help_heading = "Query parameters", long)]
78 agent_type: Option<String>,
79
80 #[arg(help_heading = "Query parameters", long)]
82 alive: Option<String>,
83
84 #[arg(help_heading = "Query parameters", long)]
86 availability_zone: Option<String>,
87
88 #[arg(help_heading = "Query parameters", long)]
90 binary: Option<String>,
91
92 #[arg(help_heading = "Query parameters", long)]
94 description: Option<String>,
95
96 #[arg(help_heading = "Query parameters", long)]
98 host: Option<String>,
99
100 #[arg(help_heading = "Query parameters", long)]
102 id: Option<String>,
103
104 #[arg(
109 help_heading = "Query parameters",
110 long("page-size"),
111 visible_alias("limit")
112 )]
113 limit: Option<u32>,
114
115 #[arg(help_heading = "Query parameters", long)]
119 marker: Option<String>,
120
121 #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)]
123 page_reverse: Option<bool>,
124
125 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
128 sort_dir: Option<Vec<String>>,
129
130 #[arg(action=clap::ArgAction::Append, help_heading = "Query parameters", long)]
133 sort_key: Option<Vec<String>>,
134
135 #[arg(help_heading = "Query parameters", long)]
137 topic: Option<String>,
138}
139
140#[derive(Args)]
142struct PathParameters {}
143
144impl AgentsCommand {
145 pub async fn take_action<C: CliArgs>(
147 &self,
148 parsed_args: &C,
149 client: &mut AsyncOpenStack,
150 ) -> Result<(), OpenStackCliError> {
151 info!("List Agents");
152
153 let op = OutputProcessor::from_args(parsed_args, Some("network.agent"), Some("list"));
154 op.validate_args(parsed_args)?;
155
156 let mut ep_builder = list::Request::builder();
157
158 if let Some(val) = &self.query.admin_state_up {
160 ep_builder.admin_state_up(*val);
161 }
162 if let Some(val) = &self.query.agent_type {
163 ep_builder.agent_type(val);
164 }
165 if let Some(val) = &self.query.alive {
166 ep_builder.alive(val);
167 }
168 if let Some(val) = &self.query.availability_zone {
169 ep_builder.availability_zone(val);
170 }
171 if let Some(val) = &self.query.binary {
172 ep_builder.binary(val);
173 }
174 if let Some(val) = &self.query.description {
175 ep_builder.description(val);
176 }
177 if let Some(val) = &self.query.host {
178 ep_builder.host(val);
179 }
180 if let Some(val) = &self.query.id {
181 ep_builder.id(val);
182 }
183 if let Some(val) = &self.query.topic {
184 ep_builder.topic(val);
185 }
186 if let Some(val) = &self.query.limit {
187 ep_builder.limit(*val);
188 }
189 if let Some(val) = &self.query.marker {
190 ep_builder.marker(val);
191 }
192 if let Some(val) = &self.query.page_reverse {
193 ep_builder.page_reverse(*val);
194 }
195 if let Some(val) = &self.query.sort_dir {
196 ep_builder.sort_dir(val.iter());
197 }
198 if let Some(val) = &self.query.sort_key {
199 ep_builder.sort_key(val.iter());
200 }
201
202 let ep = ep_builder
203 .build()
204 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
205
206 let data: Vec<serde_json::Value> = paged(ep, Pagination::Limit(self.max_items))
207 .query_async(client)
208 .await?;
209
210 op.output_list::<response::list::AgentResponse>(data.clone())?;
211 op.show_command_hint()?;
213 Ok(())
214 }
215}