openstack_cli_load_balancer/v2/l7policy/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::load_balancer::v2::l7policy::rule::create;
34use openstack_types::load_balancer::v2::l7policy::rule::response;
35
36#[derive(Args)]
63#[command(about = "Create an L7 Rule")]
64pub struct RuleCommand {
65 #[command(flatten)]
67 query: QueryParameters,
68
69 #[command(flatten)]
71 path: PathParameters,
72
73 #[command(flatten)]
75 rule: Rule,
76}
77
78#[derive(Args)]
80struct QueryParameters {}
81
82#[derive(Args)]
84struct PathParameters {
85 #[arg(
88 help_heading = "Path parameters",
89 id = "path_param_l7policy_id",
90 value_name = "L7POLICY_ID"
91 )]
92 l7policy_id: String,
93}
94
95#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
96enum CompareType {
97 Contains,
98 EndsWith,
99 EqualTo,
100 Regex,
101 StartsWith,
102}
103
104#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
105enum Type {
106 Cookie,
107 FileType,
108 Header,
109 HostName,
110 Path,
111 SslConnHasCert,
112 SslDnField,
113 SslVerifyResult,
114}
115
116#[derive(Args, Clone)]
118struct Rule {
119 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
122 admin_state_up: Option<bool>,
123
124 #[arg(help_heading = "Body parameters", long)]
127 compare_type: CompareType,
128
129 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
132 invert: Option<bool>,
133
134 #[arg(help_heading = "Body parameters", long)]
137 key: Option<String>,
138
139 #[arg(help_heading = "Body parameters", long)]
141 project_id: Option<String>,
142
143 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
149 tags: Option<Vec<String>>,
150
151 #[arg(help_heading = "Body parameters", long)]
152 tenant_id: Option<String>,
153
154 #[arg(help_heading = "Body parameters", long)]
157 _type: Type,
158
159 #[arg(help_heading = "Body parameters", long)]
162 value: String,
163}
164
165impl RuleCommand {
166 pub async fn take_action<C: CliArgs>(
168 &self,
169 parsed_args: &C,
170 client: &mut AsyncOpenStack,
171 ) -> Result<(), OpenStackCliError> {
172 info!("Create Rule");
173
174 let op = OutputProcessor::from_args(
175 parsed_args,
176 Some("load-balancer.l7policy/rule"),
177 Some("create"),
178 );
179 op.validate_args(parsed_args)?;
180
181 let mut ep_builder = create::Request::builder();
182
183 ep_builder.l7policy_id(&self.path.l7policy_id);
184
185 let args = &self.rule;
188 let mut rule_builder = create::RuleBuilder::default();
189 if let Some(val) = &args.admin_state_up {
190 rule_builder.admin_state_up(*val);
191 }
192
193 let tmp = match &args.compare_type {
194 CompareType::Contains => create::CompareType::Contains,
195 CompareType::EndsWith => create::CompareType::EndsWith,
196 CompareType::EqualTo => create::CompareType::EqualTo,
197 CompareType::Regex => create::CompareType::Regex,
198 CompareType::StartsWith => create::CompareType::StartsWith,
199 };
200 rule_builder.compare_type(tmp);
201
202 if let Some(val) = &args.invert {
203 rule_builder.invert(*val);
204 }
205
206 if let Some(val) = &args.key {
207 rule_builder.key(val);
208 }
209
210 if let Some(val) = &args.project_id {
211 rule_builder.project_id(val);
212 }
213
214 if let Some(val) = &args.tags {
215 rule_builder.tags(val.iter().map(Into::into).collect::<Vec<_>>());
216 }
217
218 if let Some(val) = &args.tenant_id {
219 rule_builder.tenant_id(val);
220 }
221
222 let tmp = match &args._type {
223 Type::Cookie => create::Type::Cookie,
224 Type::FileType => create::Type::FileType,
225 Type::Header => create::Type::Header,
226 Type::HostName => create::Type::HostName,
227 Type::Path => create::Type::Path,
228 Type::SslConnHasCert => create::Type::SslConnHasCert,
229 Type::SslDnField => create::Type::SslDnField,
230 Type::SslVerifyResult => create::Type::SslVerifyResult,
231 };
232 rule_builder._type(tmp);
233
234 rule_builder.value(&args.value);
235
236 ep_builder.rule(
237 rule_builder
238 .build()
239 .wrap_err("error preparing the request data")?,
240 );
241
242 let ep = ep_builder
243 .build()
244 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
245
246 let data: serde_json::Value = ep.query_async(client).await?;
247
248 op.output_single::<response::create::RuleResponse>(data.clone())?;
249 op.show_command_hint()?;
251 Ok(())
252 }
253}