openstack_cli_compute/v2/server/
set_294.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 clap::ValueEnum;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::compute::v2::server::find;
34use openstack_sdk::api::compute::v2::server::set_294;
35use openstack_sdk::api::find;
36use openstack_types::compute::v2::server::response;
37
38#[derive(Args)]
45#[command(about = "Update Server (microversion = 2.94)")]
46pub struct ServerCommand {
47 #[command(flatten)]
49 query: QueryParameters,
50
51 #[command(flatten)]
53 path: PathParameters,
54
55 #[command(flatten)]
57 server: Server,
58}
59
60#[derive(Args)]
62struct QueryParameters {}
63
64#[derive(Args)]
66struct PathParameters {
67 #[arg(
69 help_heading = "Path parameters",
70 id = "path_param_id",
71 value_name = "ID"
72 )]
73 id: String,
74}
75
76#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
77enum OsDcfDiskConfig {
78 Auto,
79 Manual,
80}
81
82#[derive(Args, Clone)]
84struct Server {
85 #[arg(help_heading = "Body parameters", long)]
87 access_ipv4: Option<String>,
88
89 #[arg(help_heading = "Body parameters", long)]
91 access_ipv6: Option<String>,
92
93 #[arg(help_heading = "Body parameters", long)]
98 description: Option<String>,
99
100 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "description")]
102 no_description: bool,
103
104 #[arg(help_heading = "Body parameters", long)]
117 hostname: Option<String>,
118
119 #[arg(help_heading = "Body parameters", long)]
121 name: Option<String>,
122
123 #[arg(help_heading = "Body parameters", long)]
140 os_dcf_disk_config: Option<OsDcfDiskConfig>,
141}
142
143impl ServerCommand {
144 pub async fn take_action<C: CliArgs>(
146 &self,
147 parsed_args: &C,
148 client: &mut AsyncOpenStack,
149 ) -> Result<(), OpenStackCliError> {
150 info!("Set Server");
151
152 let op = OutputProcessor::from_args(parsed_args, Some("compute.server"), Some("set"));
153 op.validate_args(parsed_args)?;
154
155 let mut find_builder = find::Request::builder();
156
157 find_builder.id(&self.path.id);
158 find_builder.header(
159 http::header::HeaderName::from_static("openstack-api-version"),
160 http::header::HeaderValue::from_static("compute 2.94"),
161 );
162
163 let find_ep = find_builder
164 .build()
165 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
166 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
167
168 let mut ep_builder = set_294::Request::builder();
169 ep_builder.header(
170 http::header::HeaderName::from_static("openstack-api-version"),
171 http::header::HeaderValue::from_static("compute 2.94"),
172 );
173
174 let resource_id = find_data["id"]
175 .as_str()
176 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
177 .to_string();
178 ep_builder.id(resource_id.clone());
179
180 let args = &self.server;
183 let mut server_builder = set_294::ServerBuilder::default();
184 if let Some(val) = &args.os_dcf_disk_config {
185 let tmp = match val {
186 OsDcfDiskConfig::Auto => set_294::OsDcfDiskConfig::Auto,
187 OsDcfDiskConfig::Manual => set_294::OsDcfDiskConfig::Manual,
188 };
189 server_builder.os_dcf_disk_config(tmp);
190 }
191
192 if let Some(val) = &args.access_ipv4 {
193 server_builder.access_ipv4(val);
194 }
195
196 if let Some(val) = &args.access_ipv6 {
197 server_builder.access_ipv6(val);
198 }
199
200 if let Some(val) = &args.description {
201 server_builder.description(Some(val.into()));
202 } else if args.no_description {
203 server_builder.description(None);
204 }
205
206 if let Some(val) = &args.hostname {
207 server_builder.hostname(val);
208 }
209
210 if let Some(val) = &args.name {
211 server_builder.name(val);
212 }
213
214 ep_builder.server(
215 server_builder
216 .build()
217 .wrap_err("error preparing the request data")?,
218 );
219
220 let ep = ep_builder
221 .build()
222 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
223
224 let data: serde_json::Value = ep.query_async(client).await?;
225
226 op.output_single::<response::set_275::ServerResponse>(data.clone())?;
227 op.show_command_hint()?;
229 Ok(())
230 }
231}