openstack_cli_block_storage/v3/backup/
create_351.rs1use clap::Args;
23use eyre::WrapErr;
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_cli_core::common::parse_key_val;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::block_storage::v3::backup::create_351;
34use openstack_types::block_storage::v3::backup::response;
35
36#[derive(Args)]
38pub struct BackupCommand {
39 #[command(flatten)]
41 query: QueryParameters,
42
43 #[command(flatten)]
45 path: PathParameters,
46
47 #[command(flatten)]
49 backup: Backup,
50}
51
52#[derive(Args)]
54struct QueryParameters {}
55
56#[derive(Args)]
58struct PathParameters {}
59#[derive(Args, Clone)]
61struct Backup {
62 #[arg(help_heading = "Body parameters", long)]
66 availability_zone: Option<String>,
67
68 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "availability_zone")]
70 no_availability_zone: bool,
71
72 #[arg(help_heading = "Body parameters", long)]
74 container: Option<String>,
75
76 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "container")]
78 no_container: bool,
79
80 #[arg(help_heading = "Body parameters", long)]
82 description: Option<String>,
83
84 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "description")]
86 no_description: bool,
87
88 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
91 force: Option<bool>,
92
93 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
96 incremental: Option<bool>,
97
98 #[arg(help_heading = "Body parameters", long, value_name="key=value", value_parser=parse_key_val::<String, String>)]
102 metadata: Option<Vec<(String, String)>>,
103
104 #[arg(help_heading = "Body parameters", long)]
106 name: Option<String>,
107
108 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "name")]
110 no_name: bool,
111
112 #[arg(help_heading = "Body parameters", long)]
114 snapshot_id: Option<String>,
115
116 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "snapshot_id")]
118 no_snapshot_id: bool,
119
120 #[arg(help_heading = "Body parameters", long)]
122 volume_id: String,
123}
124
125impl BackupCommand {
126 pub async fn take_action<C: CliArgs>(
128 &self,
129 parsed_args: &C,
130 client: &mut AsyncOpenStack,
131 ) -> Result<(), OpenStackCliError> {
132 info!("Create Backup");
133
134 let op =
135 OutputProcessor::from_args(parsed_args, Some("block-storage.backup"), Some("create"));
136 op.validate_args(parsed_args)?;
137
138 let mut ep_builder = create_351::Request::builder();
139 ep_builder.header(
140 http::header::HeaderName::from_static("openstack-api-version"),
141 http::header::HeaderValue::from_static("volume 3.51"),
142 );
143
144 let args = &self.backup;
147 let mut backup_builder = create_351::BackupBuilder::default();
148 if let Some(val) = &args.availability_zone {
149 backup_builder.availability_zone(Some(val.into()));
150 } else if args.no_availability_zone {
151 backup_builder.availability_zone(None);
152 }
153
154 if let Some(val) = &args.container {
155 backup_builder.container(Some(val.into()));
156 } else if args.no_container {
157 backup_builder.container(None);
158 }
159
160 if let Some(val) = &args.description {
161 backup_builder.description(Some(val.into()));
162 } else if args.no_description {
163 backup_builder.description(None);
164 }
165
166 if let Some(val) = &args.force {
167 backup_builder.force(*val);
168 }
169
170 if let Some(val) = &args.incremental {
171 backup_builder.incremental(*val);
172 }
173
174 if let Some(val) = &args.metadata {
175 backup_builder.metadata(val.iter().cloned());
176 }
177
178 if let Some(val) = &args.name {
179 backup_builder.name(Some(val.into()));
180 } else if args.no_name {
181 backup_builder.name(None);
182 }
183
184 if let Some(val) = &args.snapshot_id {
185 backup_builder.snapshot_id(Some(val.into()));
186 } else if args.no_snapshot_id {
187 backup_builder.snapshot_id(None);
188 }
189
190 backup_builder.volume_id(&args.volume_id);
191
192 ep_builder.backup(
193 backup_builder
194 .build()
195 .wrap_err("error preparing the request data")?,
196 );
197
198 let ep = ep_builder
199 .build()
200 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
201
202 let data: serde_json::Value = ep.query_async(client).await?;
203
204 op.output_single::<response::create::BackupResponse>(data.clone())?;
205 op.show_command_hint()?;
207 Ok(())
208 }
209}