unifly_api/convert/
nat.rs1use crate::integration_types;
2use crate::model::common::DataSource;
3use crate::model::entity_id::EntityId;
4use crate::model::firewall::{NatPolicy, NatType};
5
6use super::helpers::origin_from_metadata;
7
8impl From<integration_types::NatPolicyResponse> for NatPolicy {
9 fn from(r: integration_types::NatPolicyResponse) -> Self {
10 let nat_type = match r.nat_type.as_str() {
11 "MASQUERADE" => NatType::Masquerade,
12 "SOURCE_NAT" => NatType::Source,
13 _ => NatType::Destination,
14 };
15
16 let src_address = r
17 .source
18 .as_ref()
19 .and_then(|s| s.get("address"))
20 .and_then(serde_json::Value::as_str)
21 .map(ToOwned::to_owned);
22 let src_port = r
23 .source
24 .as_ref()
25 .and_then(|s| s.get("port"))
26 .and_then(serde_json::Value::as_str)
27 .map(ToOwned::to_owned);
28 let dst_address = r
29 .destination
30 .as_ref()
31 .and_then(|d| d.get("address"))
32 .and_then(serde_json::Value::as_str)
33 .map(ToOwned::to_owned);
34 let dst_port = r
35 .destination
36 .as_ref()
37 .and_then(|d| d.get("port"))
38 .and_then(serde_json::Value::as_str)
39 .map(ToOwned::to_owned);
40
41 NatPolicy {
42 id: EntityId::Uuid(r.id),
43 name: r.name,
44 description: r.description,
45 enabled: r.enabled,
46 nat_type,
47 interface_id: r.interface_id.map(EntityId::Uuid),
48 protocol: r.protocol,
49 src_address,
50 src_port,
51 dst_address,
52 dst_port,
53 translated_address: r.translated_address,
54 translated_port: r.translated_port,
55 origin: r.metadata.as_ref().and_then(origin_from_metadata),
56 data_source: DataSource::IntegrationApi,
57 }
58 }
59}
60
61pub fn nat_policy_from_v2(v: &serde_json::Value) -> Option<NatPolicy> {
62 let id_str = v.get("_id").and_then(|v| v.as_str())?;
63 let nat_type_str = v.get("type").and_then(|v| v.as_str()).unwrap_or("DNAT");
64 let nat_type = match nat_type_str {
65 "MASQUERADE" => NatType::Masquerade,
66 "SNAT" => NatType::Source,
67 _ => NatType::Destination,
68 };
69
70 let filter_addr = |filter: Option<&serde_json::Value>| -> Option<String> {
71 filter
72 .and_then(|f| f.get("address"))
73 .and_then(|v| v.as_str())
74 .map(ToOwned::to_owned)
75 };
76 let filter_port = |filter: Option<&serde_json::Value>| -> Option<String> {
77 filter
78 .and_then(|f| f.get("port"))
79 .and_then(|v| v.as_str())
80 .map(ToOwned::to_owned)
81 };
82
83 let src_filter = v.get("source_filter");
84 let dst_filter = v.get("destination_filter");
85
86 Some(NatPolicy {
87 id: EntityId::from(id_str.to_owned()),
88 name: v
89 .get("description")
90 .and_then(|v| v.as_str())
91 .unwrap_or("")
92 .to_owned(),
93 description: None,
94 enabled: v
95 .get("enabled")
96 .and_then(serde_json::Value::as_bool)
97 .unwrap_or(false),
98 nat_type,
99 interface_id: v
100 .get("in_interface")
101 .or_else(|| v.get("out_interface"))
102 .and_then(|v| v.as_str())
103 .map(|s| EntityId::from(s.to_owned())),
104 protocol: v
105 .get("protocol")
106 .and_then(|v| v.as_str())
107 .map(ToOwned::to_owned),
108 src_address: filter_addr(src_filter),
109 src_port: filter_port(src_filter),
110 dst_address: filter_addr(dst_filter),
111 dst_port: filter_port(dst_filter),
112 translated_address: v
113 .get("ip_address")
114 .and_then(|v| v.as_str())
115 .map(ToOwned::to_owned),
116 translated_port: v
117 .get("port")
118 .and_then(|v| v.as_str())
119 .map(ToOwned::to_owned),
120 origin: None,
121 data_source: DataSource::SessionApi,
122 })
123}