openstack_cli_network/v2/vpn/endpoint_group/
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::vpn::endpoint_group::create;
34use openstack_types::network::v2::vpn::endpoint_group::response;
35
36#[derive(Args)]
45#[command(about = "Create VPN endpoint group")]
46pub struct EndpointGroupCommand {
47 #[command(flatten)]
49 query: QueryParameters,
50
51 #[command(flatten)]
53 path: PathParameters,
54
55 #[command(flatten)]
56 endpoint_group: EndpointGroup,
57}
58
59#[derive(Args)]
61struct QueryParameters {}
62
63#[derive(Args)]
65struct PathParameters {}
66
67#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
68enum Type {
69 Cidr,
70 Network,
71 Router,
72 Subnet,
73 Vlan,
74}
75
76#[derive(Args, Clone)]
78struct EndpointGroup {
79 #[arg(help_heading = "Body parameters", long)]
82 description: Option<String>,
83
84 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
89 endpoints: Option<Vec<String>>,
90
91 #[arg(help_heading = "Body parameters", long)]
93 name: Option<String>,
94
95 #[arg(help_heading = "Body parameters", long)]
97 tenant_id: Option<String>,
98
99 #[arg(help_heading = "Body parameters", long)]
103 _type: Option<Type>,
104}
105
106impl EndpointGroupCommand {
107 pub async fn take_action<C: CliArgs>(
109 &self,
110 parsed_args: &C,
111 client: &mut AsyncOpenStack,
112 ) -> Result<(), OpenStackCliError> {
113 info!("Create EndpointGroup");
114
115 let op = OutputProcessor::from_args(
116 parsed_args,
117 Some("network.vpn/endpoint_group"),
118 Some("create"),
119 );
120 op.validate_args(parsed_args)?;
121
122 let mut ep_builder = create::Request::builder();
123
124 let args = &self.endpoint_group;
127 let mut endpoint_group_builder = create::EndpointGroupBuilder::default();
128 if let Some(val) = &args.description {
129 endpoint_group_builder.description(val);
130 }
131
132 if let Some(val) = &args.endpoints {
133 endpoint_group_builder.endpoints(val.iter().map(Into::into).collect::<Vec<_>>());
134 }
135
136 if let Some(val) = &args.name {
137 endpoint_group_builder.name(val);
138 }
139
140 if let Some(val) = &args.tenant_id {
141 endpoint_group_builder.tenant_id(val);
142 }
143
144 if let Some(val) = &args._type {
145 let tmp = match val {
146 Type::Cidr => create::Type::Cidr,
147 Type::Network => create::Type::Network,
148 Type::Router => create::Type::Router,
149 Type::Subnet => create::Type::Subnet,
150 Type::Vlan => create::Type::Vlan,
151 };
152 endpoint_group_builder._type(tmp);
153 }
154
155 ep_builder.endpoint_group(
156 endpoint_group_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::EndpointGroupResponse>(data.clone())?;
168 op.show_command_hint()?;
170 Ok(())
171 }
172}