openstack_cli_compute/v2/keypair/
delete.rs1use clap::Args;
23use eyre::OptionExt;
24use tracing::info;
25
26use openstack_cli_core::cli::CliArgs;
27use openstack_cli_core::error::OpenStackCliError;
28use openstack_cli_core::output::OutputProcessor;
29use openstack_sdk::AsyncOpenStack;
30
31use openstack_sdk::api::QueryAsync;
32use openstack_sdk::api::compute::v2::keypair::delete;
33use openstack_sdk::api::find_by_name;
34use openstack_sdk::api::identity::v3::user::find as find_user;
35use tracing::warn;
36
37#[derive(Args)]
43#[command(about = "Delete Keypair")]
44pub struct KeypairCommand {
45 #[command(flatten)]
47 query: QueryParameters,
48
49 #[command(flatten)]
51 path: PathParameters,
52}
53
54#[derive(Args)]
56struct QueryParameters {
57 #[command(flatten)]
59 user: UserInput,
60}
61
62#[derive(Args)]
64#[group(required = false, multiple = false)]
65struct UserInput {
66 #[arg(long, help_heading = "Path parameters", value_name = "USER_NAME")]
68 user_name: Option<String>,
69 #[arg(long, help_heading = "Path parameters", value_name = "USER_ID")]
71 user_id: Option<String>,
72 #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)]
74 current_user: bool,
75}
76
77#[derive(Args)]
79struct PathParameters {
80 #[arg(
82 help_heading = "Path parameters",
83 id = "path_param_id",
84 value_name = "ID"
85 )]
86 id: String,
87}
88
89impl KeypairCommand {
90 pub async fn take_action<C: CliArgs>(
92 &self,
93 parsed_args: &C,
94 client: &mut AsyncOpenStack,
95 ) -> Result<(), OpenStackCliError> {
96 info!("Delete Keypair");
97
98 let op = OutputProcessor::from_args(parsed_args, Some("compute.keypair"), Some("delete"));
99 op.validate_args(parsed_args)?;
100
101 let mut ep_builder = delete::Request::builder();
102
103 ep_builder.id(&self.path.id);
104 if let Some(id) = &self.query.user.user_id {
106 ep_builder.user_id(id);
108 } else if let Some(name) = &self.query.user.user_name {
109 let mut sub_find_builder = find_user::Request::builder();
111 warn!(
112 "Querying user by name (because of `--user-name` parameter passed) may not be definite. This may fail in which case parameter `--user-id` should be used instead."
113 );
114
115 sub_find_builder.id(name);
116 let find_ep = sub_find_builder
117 .build()
118 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
119 let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?;
120 match find_data.get("id") {
122 Some(val) => match val.as_str() {
123 Some(id_str) => {
124 ep_builder.user_id(id_str.to_owned());
125 }
126 None => {
127 return Err(OpenStackCliError::ResourceAttributeNotString(
128 serde_json::to_string(&val)?,
129 ));
130 }
131 },
132 None => {
133 return Err(OpenStackCliError::ResourceAttributeMissing(
134 "id".to_string(),
135 ));
136 }
137 };
138 } else if self.query.user.current_user {
139 ep_builder.user_id(
140 client
141 .get_auth_info()
142 .ok_or_eyre("Cannot determine current authentication information")?
143 .token
144 .user
145 .id,
146 );
147 }
148
149 let ep = ep_builder
150 .build()
151 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
152 openstack_sdk::api::ignore(ep).query_async(client).await?;
153 op.show_command_hint()?;
155 Ok(())
156 }
157}