openstack_cli_network/v2/network/
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::network::create;
33use openstack_types::network::v2::network::response;
34use serde_json::Value;
35
36#[derive(Args)]
46#[command(about = "Create network")]
47pub struct NetworkCommand {
48 #[command(flatten)]
50 query: QueryParameters,
51
52 #[command(flatten)]
54 path: PathParameters,
55
56 #[command(flatten)]
58 network: Network,
59}
60
61#[derive(Args)]
63struct QueryParameters {}
64
65#[derive(Args)]
67struct PathParameters {}
68#[derive(Args, Clone)]
70struct Network {
71 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
74 admin_state_up: Option<bool>,
75
76 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
80 availability_zone_hints: Option<Vec<String>>,
81
82 #[arg(help_heading = "Body parameters", long)]
85 description: Option<String>,
86
87 #[arg(help_heading = "Body parameters", long)]
89 dns_domain: Option<String>,
90
91 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
92 ha: Option<bool>,
93
94 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
96 is_default: Option<bool>,
97
98 #[arg(help_heading = "Body parameters", long)]
101 mtu: Option<u32>,
102
103 #[arg(help_heading = "Body parameters", long)]
105 name: Option<String>,
106
107 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
111 port_security_enabled: Option<bool>,
112
113 #[arg(help_heading = "Body parameters", long)]
117 provider_network_type: Option<String>,
118
119 #[arg(help_heading = "Body parameters", long)]
125 provider_physical_network: Option<String>,
126
127 #[arg(help_heading = "Body parameters", long)]
132 provider_segmentation_id: Option<String>,
133
134 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
135 qinq: Option<bool>,
136
137 #[arg(help_heading = "Body parameters", long)]
139 qos_policy_id: Option<String>,
140
141 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "qos_policy_id")]
143 no_qos_policy_id: bool,
144
145 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
148 router_external: Option<bool>,
149
150 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
154 segments: Option<Vec<Value>>,
155
156 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
159 shared: Option<bool>,
160
161 #[arg(help_heading = "Body parameters", long)]
165 tenant_id: Option<String>,
166
167 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
170 vlan_transparent: Option<bool>,
171}
172
173impl NetworkCommand {
174 pub async fn take_action<C: CliArgs>(
176 &self,
177 parsed_args: &C,
178 client: &mut AsyncOpenStack,
179 ) -> Result<(), OpenStackCliError> {
180 info!("Create Network");
181
182 let op = OutputProcessor::from_args(parsed_args, Some("network.network"), Some("create"));
183 op.validate_args(parsed_args)?;
184
185 let mut ep_builder = create::Request::builder();
186
187 let args = &self.network;
190 let mut network_builder = create::NetworkBuilder::default();
191 if let Some(val) = &args.admin_state_up {
192 network_builder.admin_state_up(*val);
193 }
194
195 if let Some(val) = &args.availability_zone_hints {
196 network_builder.availability_zone_hints(val.iter().map(Into::into).collect::<Vec<_>>());
197 }
198
199 if let Some(val) = &args.description {
200 network_builder.description(val);
201 }
202
203 if let Some(val) = &args.dns_domain {
204 network_builder.dns_domain(val);
205 }
206
207 if let Some(val) = &args.ha {
208 network_builder.ha(*val);
209 }
210
211 if let Some(val) = &args.is_default {
212 network_builder.is_default(*val);
213 }
214
215 if let Some(val) = &args.mtu {
216 network_builder.mtu(*val);
217 }
218
219 if let Some(val) = &args.name {
220 network_builder.name(val);
221 }
222
223 if let Some(val) = &args.port_security_enabled {
224 network_builder.port_security_enabled(*val);
225 }
226
227 if let Some(val) = &args.provider_network_type {
228 network_builder.provider_network_type(val);
229 }
230
231 if let Some(val) = &args.provider_physical_network {
232 network_builder.provider_physical_network(val);
233 }
234
235 if let Some(val) = &args.provider_segmentation_id {
236 network_builder.provider_segmentation_id(val);
237 }
238
239 if let Some(val) = &args.qinq {
240 network_builder.qinq(*val);
241 }
242
243 if let Some(val) = &args.qos_policy_id {
244 network_builder.qos_policy_id(Some(val.into()));
245 } else if args.no_qos_policy_id {
246 network_builder.qos_policy_id(None);
247 }
248
249 if let Some(val) = &args.router_external {
250 network_builder.router_external(*val);
251 }
252
253 if let Some(val) = &args.segments {
254 let segments_builder: Vec<create::Segments> = val
255 .iter()
256 .flat_map(|v| serde_json::from_value::<create::Segments>(v.to_owned()))
257 .collect::<Vec<create::Segments>>();
258 network_builder.segments(segments_builder);
259 }
260
261 if let Some(val) = &args.shared {
262 network_builder.shared(*val);
263 }
264
265 if let Some(val) = &args.tenant_id {
266 network_builder.tenant_id(val);
267 }
268
269 if let Some(val) = &args.vlan_transparent {
270 network_builder.vlan_transparent(*val);
271 }
272
273 ep_builder.network(
274 network_builder
275 .build()
276 .wrap_err("error preparing the request data")?,
277 );
278
279 let ep = ep_builder
280 .build()
281 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
282
283 let data: serde_json::Value = ep.query_async(client).await?;
284
285 op.output_single::<response::create::NetworkResponse>(data.clone())?;
286 op.show_command_hint()?;
288 Ok(())
289 }
290}