Skip to main content

unifly_api/session/
nat.rs

1// NAT policy operations via v2 API
2//
3// The Integration API does not expose NAT write endpoints on many
4// controller versions. The v2 API (`/v2/api/site/{site}/nat`) provides
5// full CRUD and is used here instead.
6
7use serde_json::Value;
8use tracing::debug;
9
10use super::SessionClient;
11use crate::error::Error;
12
13impl SessionClient {
14    /// List all NAT rules via the v2 API.
15    ///
16    /// `GET /v2/api/site/{site}/nat`
17    pub async fn list_nat_rules(&self) -> Result<Vec<Value>, Error> {
18        let url = self.site_url_v2("nat");
19        debug!("listing NAT rules (v2)");
20        let val = self.get_raw(url).await?;
21        Ok(val.as_array().cloned().unwrap_or_default())
22    }
23
24    /// Create a NAT rule via the v2 API.
25    ///
26    /// `POST /v2/api/site/{site}/nat`
27    pub async fn create_nat_rule(&self, body: &Value) -> Result<Value, Error> {
28        let path = format!("v2/api/site/{}/nat", self.site());
29        debug!("creating NAT rule (v2)");
30        self.raw_post(&path, body).await
31    }
32
33    /// Update a NAT rule via the v2 API.
34    ///
35    /// `PUT /v2/api/site/{site}/nat/{rule_id}`
36    pub async fn update_nat_rule(&self, rule_id: &str, body: &Value) -> Result<Value, Error> {
37        let path = format!("v2/api/site/{}/nat/{rule_id}", self.site());
38        debug!(rule_id, "updating NAT rule (v2)");
39        self.raw_put(&path, body).await
40    }
41
42    /// Delete a NAT rule via the v2 API.
43    ///
44    /// `DELETE /v2/api/site/{site}/nat/{rule_id}`
45    pub async fn delete_nat_rule(&self, rule_id: &str) -> Result<(), Error> {
46        let path = format!("v2/api/site/{}/nat/{rule_id}", self.site());
47        debug!(rule_id, "deleting NAT rule (v2)");
48        self.raw_delete(&path).await
49    }
50}