openstack_cli_block_storage/v3/quota_set/
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 eyre::eyre;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::block_storage::v3::quota_set::delete;
34use openstack_sdk::api::find_by_name;
35use openstack_sdk::api::identity::v3::project::find as find_project;
36use tracing::warn;
37
38#[derive(Args)]
40#[command(about = "Delete quota for a particular tenant")]
41pub struct QuotaSetCommand {
42 #[command(flatten)]
44 query: QueryParameters,
45
46 #[command(flatten)]
48 path: PathParameters,
49}
50
51#[derive(Args)]
53struct QueryParameters {}
54
55#[derive(Args)]
57struct PathParameters {
58 #[command(flatten)]
60 project: ProjectInput,
61}
62
63#[derive(Args)]
65#[group(required = true, multiple = false)]
66struct ProjectInput {
67 #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")]
69 project_name: Option<String>,
70 #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")]
72 project_id: Option<String>,
73 #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)]
75 current_project: bool,
76}
77
78impl QuotaSetCommand {
79 pub async fn take_action<C: CliArgs>(
81 &self,
82 parsed_args: &C,
83 client: &mut AsyncOpenStack,
84 ) -> Result<(), OpenStackCliError> {
85 info!("Delete QuotaSet");
86
87 let op = OutputProcessor::from_args(
88 parsed_args,
89 Some("block-storage.quota_set"),
90 Some("delete"),
91 );
92 op.validate_args(parsed_args)?;
93
94 let mut ep_builder = delete::Request::builder();
95
96 if let Some(id) = &self.path.project.project_id {
98 ep_builder.project_id(id);
100 } else if let Some(name) = &self.path.project.project_name {
101 let mut sub_find_builder = find_project::Request::builder();
103 warn!(
104 "Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."
105 );
106
107 sub_find_builder.id(name);
108 let find_ep = sub_find_builder
109 .build()
110 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
111 let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?;
112 match find_data.get("id") {
114 Some(val) => match val.as_str() {
115 Some(id_str) => {
116 ep_builder.project_id(id_str.to_owned());
117 }
118 None => {
119 return Err(OpenStackCliError::ResourceAttributeNotString(
120 serde_json::to_string(&val)?,
121 ));
122 }
123 },
124 None => {
125 return Err(OpenStackCliError::ResourceAttributeMissing(
126 "id".to_string(),
127 ));
128 }
129 };
130 } else if self.path.project.current_project {
131 let token = client
132 .get_auth_info()
133 .ok_or_eyre("Cannot determine current authentication information")?
134 .token;
135 if let Some(project) = token.project {
136 ep_builder.project_id(
137 project
138 .id
139 .ok_or_eyre("Project ID is missing in the project auth info")?,
140 );
141 } else {
142 return Err(eyre!("Current project information can not be identified").into());
143 }
144 }
145
146 let ep = ep_builder
147 .build()
148 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
149 openstack_sdk::api::ignore(ep).query_async(client).await?;
150 op.show_command_hint()?;
152 Ok(())
153 }
154}