openstack_cli_network/v2/router/
create.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_sdk::api::QueryAsync;
32use openstack_sdk::api::network::v2::router::create;
33use openstack_types::network::v2::router::response;
34use serde_json::Value;
35
36#[derive(Args)]
51#[command(about = "Create router")]
52pub struct RouterCommand {
53 #[command(flatten)]
55 query: QueryParameters,
56
57 #[command(flatten)]
59 path: PathParameters,
60
61 #[command(flatten)]
63 router: Router,
64}
65
66#[derive(Args)]
68struct QueryParameters {}
69
70#[derive(Args)]
72struct PathParameters {}
73#[derive(Args, Clone)]
75#[group(required = false, multiple = true)]
76struct ExternalGatewayInfo {
77 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
78 enable_snat: Option<bool>,
79
80 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
82 external_fixed_ips: Option<Vec<Value>>,
83
84 #[arg(help_heading = "Body parameters", long, required = false)]
85 network_id: String,
86
87 #[arg(help_heading = "Body parameters", long)]
88 qos_policy_id: Option<String>,
89}
90
91#[derive(Args, Clone)]
93struct Router {
94 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
97 admin_state_up: Option<bool>,
98
99 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
104 availability_zone_hints: Option<Vec<String>>,
105
106 #[arg(help_heading = "Body parameters", long)]
109 description: Option<String>,
110
111 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
114 distributed: Option<Option<bool>>,
115
116 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
121 enable_ndp_proxy: Option<Option<bool>>,
122
123 #[command(flatten)]
128 external_gateway_info: Option<ExternalGatewayInfo>,
129
130 #[arg(help_heading = "Body parameters", long)]
132 flavor_id: Option<String>,
133
134 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
137 ha: Option<Option<bool>>,
138
139 #[arg(help_heading = "Body parameters", long)]
141 name: Option<String>,
142
143 #[arg(help_heading = "Body parameters", long)]
147 tenant_id: Option<String>,
148}
149
150impl RouterCommand {
151 pub async fn take_action<C: CliArgs>(
153 &self,
154 parsed_args: &C,
155 client: &mut AsyncOpenStack,
156 ) -> Result<(), OpenStackCliError> {
157 info!("Create Router");
158
159 let op = OutputProcessor::from_args(parsed_args, Some("network.router"), Some("create"));
160 op.validate_args(parsed_args)?;
161
162 let mut ep_builder = create::Request::builder();
163
164 let args = &self.router;
167 let mut router_builder = create::RouterBuilder::default();
168 if let Some(val) = &args.admin_state_up {
169 router_builder.admin_state_up(*val);
170 }
171
172 if let Some(val) = &args.availability_zone_hints {
173 router_builder.availability_zone_hints(val.iter().map(Into::into).collect::<Vec<_>>());
174 }
175
176 if let Some(val) = &args.description {
177 router_builder.description(val);
178 }
179
180 if let Some(val) = &args.distributed {
181 router_builder.distributed(*val);
182 }
183
184 if let Some(val) = &args.enable_ndp_proxy {
185 router_builder.enable_ndp_proxy(*val);
186 }
187
188 if let Some(val) = &args.external_gateway_info {
189 let mut external_gateway_info_builder = create::ExternalGatewayInfoBuilder::default();
190 if let Some(val) = &val.enable_snat {
191 external_gateway_info_builder.enable_snat(*val);
192 }
193 if let Some(val) = &val.external_fixed_ips {
194 let external_fixed_ips_builder: Vec<create::ExternalFixedIps> = val
195 .iter()
196 .flat_map(|v| serde_json::from_value::<create::ExternalFixedIps>(v.to_owned()))
197 .collect::<Vec<create::ExternalFixedIps>>();
198 external_gateway_info_builder.external_fixed_ips(external_fixed_ips_builder);
199 }
200
201 external_gateway_info_builder.network_id(&val.network_id);
202 if let Some(val) = &val.qos_policy_id {
203 external_gateway_info_builder.qos_policy_id(Some(val.into()));
204 }
205 router_builder.external_gateway_info(
206 external_gateway_info_builder
207 .build()
208 .wrap_err("error preparing the request data")?,
209 );
210 }
211
212 if let Some(val) = &args.flavor_id {
213 router_builder.flavor_id(val);
214 }
215
216 if let Some(val) = &args.ha {
217 router_builder.ha(*val);
218 }
219
220 if let Some(val) = &args.name {
221 router_builder.name(val);
222 }
223
224 if let Some(val) = &args.tenant_id {
225 router_builder.tenant_id(val);
226 }
227
228 ep_builder.router(
229 router_builder
230 .build()
231 .wrap_err("error preparing the request data")?,
232 );
233
234 let ep = ep_builder
235 .build()
236 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
237
238 let data: serde_json::Value = ep.query_async(client).await?;
239
240 op.output_single::<response::create::RouterResponse>(data.clone())?;
241 op.show_command_hint()?;
243 Ok(())
244 }
245}