openstack_cli_network/v2/network_segment_range/
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 clap::ValueEnum;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::network::v2::network_segment_range::create;
34use openstack_types::network::v2::network_segment_range::response;
35
36#[derive(Args)]
38pub struct NetworkSegmentRangeCommand {
39 #[command(flatten)]
41 query: QueryParameters,
42
43 #[command(flatten)]
45 path: PathParameters,
46
47 #[command(flatten)]
48 network_segment_range: NetworkSegmentRange,
49}
50
51#[derive(Args)]
53struct QueryParameters {}
54
55#[derive(Args)]
57struct PathParameters {}
58
59#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
60enum NetworkType {
61 Geneve,
62 Gre,
63 Vlan,
64 Vxlan,
65}
66
67#[derive(Args, Clone)]
69struct NetworkSegmentRange {
70 #[arg(help_heading = "Body parameters", long)]
71 description: Option<String>,
72
73 #[arg(help_heading = "Body parameters", long)]
74 maximum: Option<i32>,
75
76 #[arg(help_heading = "Body parameters", long)]
77 minimum: Option<i32>,
78
79 #[arg(help_heading = "Body parameters", long)]
80 name: Option<String>,
81
82 #[arg(help_heading = "Body parameters", long)]
83 network_type: Option<NetworkType>,
84
85 #[arg(help_heading = "Body parameters", long)]
86 physical_network: Option<String>,
87
88 #[arg(help_heading = "Body parameters", long)]
89 project_id: Option<String>,
90
91 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
92 shared: Option<bool>,
93}
94
95impl NetworkSegmentRangeCommand {
96 pub async fn take_action<C: CliArgs>(
98 &self,
99 parsed_args: &C,
100 client: &mut AsyncOpenStack,
101 ) -> Result<(), OpenStackCliError> {
102 info!("Create NetworkSegmentRange");
103
104 let op = OutputProcessor::from_args(
105 parsed_args,
106 Some("network.network_segment_range"),
107 Some("create"),
108 );
109 op.validate_args(parsed_args)?;
110
111 let mut ep_builder = create::Request::builder();
112
113 let args = &self.network_segment_range;
116 let mut network_segment_range_builder = create::NetworkSegmentRangeBuilder::default();
117 if let Some(val) = &args.description {
118 network_segment_range_builder.description(val);
119 }
120
121 if let Some(val) = &args.maximum {
122 network_segment_range_builder.maximum(*val);
123 }
124
125 if let Some(val) = &args.minimum {
126 network_segment_range_builder.minimum(*val);
127 }
128
129 if let Some(val) = &args.name {
130 network_segment_range_builder.name(val);
131 }
132
133 if let Some(val) = &args.network_type {
134 let tmp = match val {
135 NetworkType::Geneve => create::NetworkType::Geneve,
136 NetworkType::Gre => create::NetworkType::Gre,
137 NetworkType::Vlan => create::NetworkType::Vlan,
138 NetworkType::Vxlan => create::NetworkType::Vxlan,
139 };
140 network_segment_range_builder.network_type(tmp);
141 }
142
143 if let Some(val) = &args.physical_network {
144 network_segment_range_builder.physical_network(val);
145 }
146
147 if let Some(val) = &args.project_id {
148 network_segment_range_builder.project_id(val);
149 }
150
151 if let Some(val) = &args.shared {
152 network_segment_range_builder.shared(*val);
153 }
154
155 ep_builder.network_segment_range(
156 network_segment_range_builder
157 .build()
158 .wrap_err("error preparing the request data")?,
159 );
160
161 let ep = ep_builder
162 .build()
163 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
164
165 let data: serde_json::Value = ep.query_async(client).await?;
166
167 op.output_single::<response::create::NetworkSegmentRangeResponse>(data.clone())?;
168 op.show_command_hint()?;
170 Ok(())
171 }
172}