openstack_cli_network/v2/router/conntrack_helper/
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::router::conntrack_helper::create;
34use openstack_types::network::v2::router::conntrack_helper::response;
35
36#[derive(Args)]
42#[command(about = "Create conntrack helper")]
43pub struct ConntrackHelperCommand {
44 #[command(flatten)]
46 query: QueryParameters,
47
48 #[command(flatten)]
50 path: PathParameters,
51
52 #[command(flatten)]
54 conntrack_helper: ConntrackHelper,
55}
56
57#[derive(Args)]
59struct QueryParameters {}
60
61#[derive(Args)]
63struct PathParameters {
64 #[arg(
67 help_heading = "Path parameters",
68 id = "path_param_router_id",
69 value_name = "ROUTER_ID"
70 )]
71 router_id: String,
72}
73
74#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
75enum Protocol {
76 Dccp,
77 Icmp,
78 Ipv6Icmp,
79 Sctp,
80 Tcp,
81 Udp,
82}
83
84#[derive(Args, Clone)]
86struct ConntrackHelper {
87 #[arg(help_heading = "Body parameters", long)]
89 helper: Option<String>,
90
91 #[arg(help_heading = "Body parameters", long)]
93 port: Option<i32>,
94
95 #[arg(help_heading = "Body parameters", long)]
96 project_id: Option<String>,
97
98 #[arg(help_heading = "Body parameters", long)]
100 protocol: Option<Protocol>,
101}
102
103impl ConntrackHelperCommand {
104 pub async fn take_action<C: CliArgs>(
106 &self,
107 parsed_args: &C,
108 client: &mut AsyncOpenStack,
109 ) -> Result<(), OpenStackCliError> {
110 info!("Create ConntrackHelper");
111
112 let op = OutputProcessor::from_args(
113 parsed_args,
114 Some("network.router/conntrack_helper"),
115 Some("create"),
116 );
117 op.validate_args(parsed_args)?;
118
119 let mut ep_builder = create::Request::builder();
120
121 ep_builder.router_id(&self.path.router_id);
122
123 let args = &self.conntrack_helper;
126 let mut conntrack_helper_builder = create::ConntrackHelperBuilder::default();
127 if let Some(val) = &args.helper {
128 conntrack_helper_builder.helper(val);
129 }
130
131 if let Some(val) = &args.port {
132 conntrack_helper_builder.port(*val);
133 }
134
135 if let Some(val) = &args.project_id {
136 conntrack_helper_builder.project_id(val);
137 }
138
139 if let Some(val) = &args.protocol {
140 let tmp = match val {
141 Protocol::Dccp => create::Protocol::Dccp,
142 Protocol::Icmp => create::Protocol::Icmp,
143 Protocol::Ipv6Icmp => create::Protocol::Ipv6Icmp,
144 Protocol::Sctp => create::Protocol::Sctp,
145 Protocol::Tcp => create::Protocol::Tcp,
146 Protocol::Udp => create::Protocol::Udp,
147 };
148 conntrack_helper_builder.protocol(tmp);
149 }
150
151 ep_builder.conntrack_helper(
152 conntrack_helper_builder
153 .build()
154 .wrap_err("error preparing the request data")?,
155 );
156
157 let ep = ep_builder
158 .build()
159 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
160
161 let data: serde_json::Value = ep.query_async(client).await?;
162
163 op.output_single::<response::create::ConntrackHelperResponse>(data.clone())?;
164 op.show_command_hint()?;
166 Ok(())
167 }
168}