Skip to main content

web_arena_indigo/
firewall.rs

1//! Firewall APIs.
2
3use crate::http::HttpClient;
4use crate::serde_util::{u32_as_string, u32_lenient, u32_vec_as_strings};
5use crate::{WebArenaIndigoApi, WebArenaIndigoApiError};
6use serde::{Deserialize, Serialize};
7use serde_json::json;
8
9pub struct FirewallApi<'a> {
10    indigo: &'a WebArenaIndigoApi,
11}
12
13impl<'a> FirewallApi<'a> {
14    pub(crate) fn new(api: &'a WebArenaIndigoApi) -> Self {
15        FirewallApi { indigo: api }
16    }
17
18    /// `POST /webarenaIndigo/v1/nw/createfirewall`
19    pub async fn create_firewall(
20        &self,
21        request: CreateFirewallRequest,
22    ) -> Result<FirewallTemplateResponse, WebArenaIndigoApiError> {
23        HttpClient::post(
24            self.indigo.throttle(),
25            self.indigo.access_token(),
26            &self.indigo.endpoint("/webarenaIndigo/v1/nw/createfirewall"),
27            &request,
28        )
29        .await
30    }
31
32    /// `GET /webarenaIndigo/v1/nw/getfirewalllist`
33    pub async fn firewall_list(&self) -> Result<Vec<Firewall>, WebArenaIndigoApiError> {
34        HttpClient::get(
35            self.indigo.throttle(),
36            self.indigo.access_token(),
37            &self
38                .indigo
39                .endpoint("/webarenaIndigo/v1/nw/getfirewalllist"),
40        )
41        .await
42    }
43
44    /// `GET /webarenaIndigo/v1/nw/gettemplate/{id}`
45    pub async fn retrieve_firewall(
46        &self,
47        firewall_id: u32,
48    ) -> Result<Vec<FirewallTemplateRule>, WebArenaIndigoApiError> {
49        HttpClient::get(
50            self.indigo.throttle(),
51            self.indigo.access_token(),
52            &self.indigo.endpoint(&format!(
53                "/webarenaIndigo/v1/nw/gettemplate/{}",
54                firewall_id
55            )),
56        )
57        .await
58    }
59
60    /// `PUT /webarenaIndigo/v1/nw/updatefirewall`
61    pub async fn update_firewall(
62        &self,
63        request: UpdateFirewallRequest,
64    ) -> Result<FirewallTemplateResponse, WebArenaIndigoApiError> {
65        HttpClient::put(
66            self.indigo.throttle(),
67            self.indigo.access_token(),
68            &self.indigo.endpoint("/webarenaIndigo/v1/nw/updatefirewall"),
69            &request,
70        )
71        .await
72    }
73
74    /// `POST /webarenaIndigo/v1/nw/assign`
75    pub async fn assign_firewall(
76        &self,
77        firewall_id: u32,
78        instance_id: u32,
79    ) -> Result<FirewallOperationResponse, WebArenaIndigoApiError> {
80        HttpClient::post(
81            self.indigo.throttle(),
82            self.indigo.access_token(),
83            &self.indigo.endpoint("/webarenaIndigo/v1/nw/assign"),
84            &json!({
85                "templateid": firewall_id.to_string(),
86                "instanceid": instance_id.to_string(),
87            }),
88        )
89        .await
90    }
91
92    /// `DELETE /webarenaIndigo/v1/nw/deletefirewall/{id}`
93    pub async fn destroy_firewall(
94        &self,
95        firewall_id: u32,
96    ) -> Result<FirewallOperationResponse, WebArenaIndigoApiError> {
97        HttpClient::delete(
98            self.indigo.throttle(),
99            self.indigo.access_token(),
100            &self.indigo.endpoint(&format!(
101                "/webarenaIndigo/v1/nw/deletefirewall/{}",
102                firewall_id
103            )),
104        )
105        .await
106    }
107}
108
109#[derive(Debug, Clone, Serialize)]
110pub struct CreateFirewallRequest {
111    pub name: String,
112    pub inbound: Vec<FirewallRule>,
113    pub outbound: Vec<FirewallRule>,
114    #[serde(serialize_with = "u32_vec_as_strings")]
115    pub instances: Vec<u32>,
116}
117
118#[derive(Debug, Clone, Serialize)]
119pub struct UpdateFirewallRequest {
120    #[serde(rename = "templateid", serialize_with = "u32_as_string")]
121    pub firewall_id: u32,
122    pub name: String,
123    pub inbound: Vec<FirewallRule>,
124    pub outbound: Vec<FirewallRule>,
125    #[serde(serialize_with = "u32_vec_as_strings")]
126    pub instances: Vec<u32>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct FirewallRule {
131    #[serde(rename = "type")]
132    pub rule_type: String,
133    pub protocol: String,
134    pub port: String,
135    pub source: String,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct FirewallTemplateResponse {
140    pub success: bool,
141    pub message: String,
142    #[serde(rename = "sucessCode")]
143    pub success_code: String,
144    /// The live API returns this as a number on create and as a string on
145    /// update; both are accepted.
146    #[serde(rename = "firewallId", deserialize_with = "u32_lenient")]
147    pub firewall_id: u32,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct Firewall {
152    pub id: u32,
153    pub service_id: String,
154    pub user_id: u32,
155    pub name: String,
156    pub status: u32,
157    pub created_at: String,
158    pub updated_at: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
162pub struct FirewallTemplateRule {
163    pub id: u32,
164    pub name: String,
165    pub direction: String,
166    #[serde(rename = "type")]
167    pub rule_type: String,
168    pub protocol: String,
169    pub port: String,
170    pub source: String,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
174pub struct FirewallOperationResponse {
175    pub success: bool,
176    pub message: String,
177    #[serde(rename = "sucessCode")]
178    pub success_code: String,
179}