1 use serde
::{Deserialize, Serialize}
;
7 IP_V4_FORMAT
, IP_V6_FORMAT
, IP_FORMAT
,
8 CIDR_V4_FORMAT
, CIDR_V6_FORMAT
, CIDR_FORMAT
,
11 pub const NETWORK_INTERFACE_FORMAT
: ApiStringFormat
=
12 ApiStringFormat
::Pattern(&PROXMOX_SAFE_ID_REGEX
);
14 pub const IP_V4_SCHEMA
: Schema
=
15 StringSchema
::new("IPv4 address.")
16 .format(&IP_V4_FORMAT
)
20 pub const IP_V6_SCHEMA
: Schema
=
21 StringSchema
::new("IPv6 address.")
22 .format(&IP_V6_FORMAT
)
26 pub const IP_SCHEMA
: Schema
=
27 StringSchema
::new("IP (IPv4 or IPv6) address.")
32 pub const CIDR_V4_SCHEMA
: Schema
=
33 StringSchema
::new("IPv4 address with netmask (CIDR notation).")
34 .format(&CIDR_V4_FORMAT
)
38 pub const CIDR_V6_SCHEMA
: Schema
=
39 StringSchema
::new("IPv6 address with netmask (CIDR notation).")
40 .format(&CIDR_V6_FORMAT
)
44 pub const CIDR_SCHEMA
: Schema
=
45 StringSchema
::new("IP address (IPv4 or IPv6) with netmask (CIDR notation).")
51 #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
52 #[serde(rename_all = "lowercase")]
53 /// Interface configuration method
54 pub enum NetworkConfigMethod
{
55 /// Configuration is done manually using other tools
57 /// Define interfaces with statically allocated addresses.
59 /// Obtain an address via DHCP
61 /// Define the loopback interface.
66 #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
67 #[serde(rename_all = "kebab-case")]
68 #[allow(non_camel_case_types)]
71 pub enum LinuxBondMode
{
72 /// Round-robin policy
74 /// Active-backup policy
80 /// IEEE 802.3ad Dynamic link aggregation
81 #[serde(rename = "802.3ad")]
83 /// Adaptive transmit load balancing
85 /// Adaptive load balancing
90 #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
91 #[serde(rename_all = "kebab-case")]
92 #[allow(non_camel_case_types)]
94 /// Bond Transmit Hash Policy for LACP (802.3ad)
95 pub enum BondXmitHashPolicy
{
99 #[serde(rename = "layer2+3")]
102 #[serde(rename = "layer3+4")]
107 #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
108 #[serde(rename_all = "lowercase")]
109 /// Network interface type
110 pub enum NetworkInterfaceType
{
113 /// Physical Ethernet device
119 /// Linux VLAN (eth.10)
121 /// Interface Alias (eth:1)
123 /// Unknown interface type
127 pub const NETWORK_INTERFACE_NAME_SCHEMA
: Schema
= StringSchema
::new("Network interface name.")
128 .format(&NETWORK_INTERFACE_FORMAT
)
130 .max_length(libc
::IFNAMSIZ
-1)
133 pub const NETWORK_INTERFACE_ARRAY_SCHEMA
: Schema
= ArraySchema
::new(
134 "Network interface list.", &NETWORK_INTERFACE_NAME_SCHEMA
)
137 pub const NETWORK_INTERFACE_LIST_SCHEMA
: Schema
= StringSchema
::new(
138 "A list of network devices, comma separated.")
139 .format(&ApiStringFormat
::PropertyString(&NETWORK_INTERFACE_ARRAY_SCHEMA
))
145 schema
: NETWORK_INTERFACE_NAME_SCHEMA
,
148 type: NetworkInterfaceType
,
151 type: NetworkConfigMethod
,
155 type: NetworkConfigMethod
,
159 schema
: CIDR_V4_SCHEMA
,
163 schema
: CIDR_V6_SCHEMA
,
167 schema
: IP_V4_SCHEMA
,
171 schema
: IP_V6_SCHEMA
,
175 description
: "Option list (inet)",
178 description
: "Optional attribute line.",
183 description
: "Option list (inet6)",
186 description
: "Optional attribute line.",
191 description
: "Comments (inet, may span multiple lines)",
196 description
: "Comments (inet6, may span multiple lines)",
201 schema
: NETWORK_INTERFACE_ARRAY_SCHEMA
,
205 schema
: NETWORK_INTERFACE_ARRAY_SCHEMA
,
213 schema
: NETWORK_INTERFACE_NAME_SCHEMA
,
216 bond_xmit_hash_policy
: {
217 type: BondXmitHashPolicy
,
222 #[derive(Debug, Serialize, Deserialize)]
223 /// Network Interface configuration
224 pub struct Interface
{
225 /// Autostart interface
226 #[serde(rename = "autostart")]
228 /// Interface is active (UP)
233 #[serde(rename = "type")]
234 pub interface_type
: NetworkInterfaceType
,
235 #[serde(skip_serializing_if="Option::is_none")]
236 pub method
: Option
<NetworkConfigMethod
>,
237 #[serde(skip_serializing_if="Option::is_none")]
238 pub method6
: Option
<NetworkConfigMethod
>,
239 #[serde(skip_serializing_if="Option::is_none")]
240 /// IPv4 address with netmask
241 pub cidr
: Option
<String
>,
242 #[serde(skip_serializing_if="Option::is_none")]
244 pub gateway
: Option
<String
>,
245 #[serde(skip_serializing_if="Option::is_none")]
246 /// IPv6 address with netmask
247 pub cidr6
: Option
<String
>,
248 #[serde(skip_serializing_if="Option::is_none")]
250 pub gateway6
: Option
<String
>,
252 #[serde(skip_serializing_if="Vec::is_empty")]
253 pub options
: Vec
<String
>,
254 #[serde(skip_serializing_if="Vec::is_empty")]
255 pub options6
: Vec
<String
>,
257 #[serde(skip_serializing_if="Option::is_none")]
258 pub comments
: Option
<String
>,
259 #[serde(skip_serializing_if="Option::is_none")]
260 pub comments6
: Option
<String
>,
262 #[serde(skip_serializing_if="Option::is_none")]
263 /// Maximum Transmission Unit
264 pub mtu
: Option
<u64>,
266 #[serde(skip_serializing_if="Option::is_none")]
267 pub bridge_ports
: Option
<Vec
<String
>>,
268 /// Enable bridge vlan support.
269 #[serde(skip_serializing_if="Option::is_none")]
270 pub bridge_vlan_aware
: Option
<bool
>,
272 #[serde(skip_serializing_if="Option::is_none")]
273 pub slaves
: Option
<Vec
<String
>>,
274 #[serde(skip_serializing_if="Option::is_none")]
275 pub bond_mode
: Option
<LinuxBondMode
>,
276 #[serde(skip_serializing_if="Option::is_none")]
277 #[serde(rename = "bond-primary")]
278 pub bond_primary
: Option
<String
>,
279 pub bond_xmit_hash_policy
: Option
<BondXmitHashPolicy
>,
283 pub fn new(name
: String
) -> Self {
286 interface_type
: NetworkInterfaceType
::Unknown
,
296 options6
: Vec
::new(),
301 bridge_vlan_aware
: None
,
305 bond_xmit_hash_policy
: None
,