openstack_cli_compute/v2/server/
set_21.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_21;
35use openstack_sdk::api::find;
36use openstack_types::compute::v2::server::response;
37
38#[derive(Args)]
45#[command(about = "Update Server (microversion = 2.1)")]
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)]
95 name: Option<String>,
96
97 #[arg(help_heading = "Body parameters", long)]
114 os_dcf_disk_config: Option<OsDcfDiskConfig>,
115}
116
117impl ServerCommand {
118 pub async fn take_action<C: CliArgs>(
120 &self,
121 parsed_args: &C,
122 client: &mut AsyncOpenStack,
123 ) -> Result<(), OpenStackCliError> {
124 info!("Set Server");
125
126 let op = OutputProcessor::from_args(parsed_args, Some("compute.server"), Some("set"));
127 op.validate_args(parsed_args)?;
128
129 let mut find_builder = find::Request::builder();
130
131 find_builder.id(&self.path.id);
132 find_builder.header(
133 http::header::HeaderName::from_static("openstack-api-version"),
134 http::header::HeaderValue::from_static("compute 2.1"),
135 );
136
137 let find_ep = find_builder
138 .build()
139 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
140 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
141
142 let mut ep_builder = set_21::Request::builder();
143 ep_builder.header(
144 http::header::HeaderName::from_static("openstack-api-version"),
145 http::header::HeaderValue::from_static("compute 2.1"),
146 );
147
148 let resource_id = find_data["id"]
149 .as_str()
150 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
151 .to_string();
152 ep_builder.id(resource_id.clone());
153
154 let args = &self.server;
157 let mut server_builder = set_21::ServerBuilder::default();
158 if let Some(val) = &args.os_dcf_disk_config {
159 let tmp = match val {
160 OsDcfDiskConfig::Auto => set_21::OsDcfDiskConfig::Auto,
161 OsDcfDiskConfig::Manual => set_21::OsDcfDiskConfig::Manual,
162 };
163 server_builder.os_dcf_disk_config(tmp);
164 }
165
166 if let Some(val) = &args.access_ipv4 {
167 server_builder.access_ipv4(val);
168 }
169
170 if let Some(val) = &args.access_ipv6 {
171 server_builder.access_ipv6(val);
172 }
173
174 if let Some(val) = &args.name {
175 server_builder.name(val);
176 }
177
178 ep_builder.server(
179 server_builder
180 .build()
181 .wrap_err("error preparing the request data")?,
182 );
183
184 let ep = ep_builder
185 .build()
186 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
187
188 let data: serde_json::Value = ep.query_async(client).await?;
189
190 op.output_single::<response::set_20::ServerResponse>(data.clone())?;
191 op.show_command_hint()?;
193 Ok(())
194 }
195}