openstack_cli_network/v2/security_group_rule/
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::security_group_rule::create;
34use openstack_types::network::v2::security_group_rule::response;
35
36#[derive(Args)]
42#[command(about = "Create security group rule")]
43pub struct SecurityGroupRuleCommand {
44 #[command(flatten)]
46 query: QueryParameters,
47
48 #[command(flatten)]
50 path: PathParameters,
51
52 #[command(flatten)]
54 security_group_rule: SecurityGroupRule,
55}
56
57#[derive(Args)]
59struct QueryParameters {}
60
61#[derive(Args)]
63struct PathParameters {}
64
65#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
66enum Direction {
67 Egress,
68 Ingress,
69}
70
71#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
72enum Ethertype {
73 Ipv4,
74 Ipv6,
75}
76
77#[derive(Args, Clone)]
79struct SecurityGroupRule {
80 #[arg(help_heading = "Body parameters", long)]
83 description: Option<String>,
84
85 #[arg(help_heading = "Body parameters", long)]
88 direction: Option<Direction>,
89
90 #[arg(help_heading = "Body parameters", long)]
93 ethertype: Option<Ethertype>,
94
95 #[arg(help_heading = "Body parameters", long)]
100 port_range_max: Option<Option<i32>>,
101
102 #[arg(help_heading = "Body parameters", long)]
107 port_range_min: Option<Option<i32>>,
108
109 #[arg(help_heading = "Body parameters", long)]
121 protocol: Option<String>,
122
123 #[arg(help_heading = "Body parameters", long)]
124 remote_address_group_id: Option<String>,
125
126 #[arg(help_heading = "Body parameters", long)]
130 remote_group_id: Option<String>,
131
132 #[arg(help_heading = "Body parameters", long)]
134 remote_ip_prefix: Option<String>,
135
136 #[arg(help_heading = "Body parameters", long)]
138 security_group_id: Option<String>,
139
140 #[arg(help_heading = "Body parameters", long)]
141 tenant_id: Option<String>,
142}
143
144impl SecurityGroupRuleCommand {
145 pub async fn take_action<C: CliArgs>(
147 &self,
148 parsed_args: &C,
149 client: &mut AsyncOpenStack,
150 ) -> Result<(), OpenStackCliError> {
151 info!("Create SecurityGroupRule");
152
153 let op = OutputProcessor::from_args(
154 parsed_args,
155 Some("network.security_group_rule"),
156 Some("create"),
157 );
158 op.validate_args(parsed_args)?;
159
160 let mut ep_builder = create::Request::builder();
161
162 let args = &self.security_group_rule;
165 let mut security_group_rule_builder = create::SecurityGroupRuleBuilder::default();
166 if let Some(val) = &args.description {
167 security_group_rule_builder.description(val);
168 }
169
170 if let Some(val) = &args.direction {
171 let tmp = match val {
172 Direction::Egress => create::Direction::Egress,
173 Direction::Ingress => create::Direction::Ingress,
174 };
175 security_group_rule_builder.direction(tmp);
176 }
177
178 if let Some(val) = &args.ethertype {
179 let tmp = match val {
180 Ethertype::Ipv4 => create::Ethertype::Ipv4,
181 Ethertype::Ipv6 => create::Ethertype::Ipv6,
182 };
183 security_group_rule_builder.ethertype(tmp);
184 }
185
186 if let Some(val) = &args.port_range_max {
187 security_group_rule_builder.port_range_max(*val);
188 }
189
190 if let Some(val) = &args.port_range_min {
191 security_group_rule_builder.port_range_min(*val);
192 }
193
194 if let Some(val) = &args.protocol {
195 security_group_rule_builder.protocol(val);
196 }
197
198 if let Some(val) = &args.remote_address_group_id {
199 security_group_rule_builder.remote_address_group_id(val);
200 }
201
202 if let Some(val) = &args.remote_group_id {
203 security_group_rule_builder.remote_group_id(val);
204 }
205
206 if let Some(val) = &args.remote_ip_prefix {
207 security_group_rule_builder.remote_ip_prefix(val);
208 }
209
210 if let Some(val) = &args.security_group_id {
211 security_group_rule_builder.security_group_id(val);
212 }
213
214 if let Some(val) = &args.tenant_id {
215 security_group_rule_builder.tenant_id(val);
216 }
217
218 ep_builder.security_group_rule(
219 security_group_rule_builder
220 .build()
221 .wrap_err("error preparing the request data")?,
222 );
223
224 let ep = ep_builder
225 .build()
226 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
227
228 let data: serde_json::Value = ep.query_async(client).await?;
229
230 op.output_single::<response::create::SecurityGroupRuleResponse>(data.clone())?;
231 op.show_command_hint()?;
233 Ok(())
234 }
235}