openstack_cli_network/v2/security_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 openstack_sdk::api::QueryAsync;
32use openstack_sdk::api::network::v2::security_group::create;
33use openstack_types::network::v2::security_group::response;
34
35#[derive(Args)]
44#[command(about = "Create security group")]
45pub struct SecurityGroupCommand {
46 #[command(flatten)]
48 query: QueryParameters,
49
50 #[command(flatten)]
52 path: PathParameters,
53
54 #[command(flatten)]
56 security_group: SecurityGroup,
57}
58
59#[derive(Args)]
61struct QueryParameters {}
62
63#[derive(Args)]
65struct PathParameters {}
66#[derive(Args, Clone)]
68struct SecurityGroup {
69 #[arg(help_heading = "Body parameters", long)]
72 description: Option<String>,
73
74 #[arg(help_heading = "Body parameters", long)]
76 name: Option<String>,
77
78 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
80 stateful: Option<bool>,
81
82 #[arg(help_heading = "Body parameters", long)]
84 tenant_id: Option<String>,
85}
86
87impl SecurityGroupCommand {
88 pub async fn take_action<C: CliArgs>(
90 &self,
91 parsed_args: &C,
92 client: &mut AsyncOpenStack,
93 ) -> Result<(), OpenStackCliError> {
94 info!("Create SecurityGroup");
95
96 let op =
97 OutputProcessor::from_args(parsed_args, Some("network.security_group"), Some("create"));
98 op.validate_args(parsed_args)?;
99
100 let mut ep_builder = create::Request::builder();
101
102 let args = &self.security_group;
105 let mut security_group_builder = create::SecurityGroupBuilder::default();
106 if let Some(val) = &args.description {
107 security_group_builder.description(val);
108 }
109
110 if let Some(val) = &args.name {
111 security_group_builder.name(val);
112 }
113
114 if let Some(val) = &args.stateful {
115 security_group_builder.stateful(*val);
116 }
117
118 if let Some(val) = &args.tenant_id {
119 security_group_builder.tenant_id(val);
120 }
121
122 ep_builder.security_group(
123 security_group_builder
124 .build()
125 .wrap_err("error preparing the request data")?,
126 );
127
128 let ep = ep_builder
129 .build()
130 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
131
132 let data: serde_json::Value = ep.query_async(client).await?;
133
134 op.output_single::<response::create::SecurityGroupResponse>(data.clone())?;
135 op.show_command_hint()?;
137 Ok(())
138 }
139}