#[cfg(feature = "serde")]
mod bool;
mod netplan;
pub use netplan::*;
use std::collections::HashMap;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "derive_builder")]
use derive_builder::Builder;
#[derive(Default, Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "derive_builder", derive(Builder))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub struct NetplanConfig {
pub network: NetworkConfig,
}
#[derive(Default, Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "derive_builder", derive(Builder))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub struct NetworkConfig {
pub version: u8,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub renderer: Option<Renderer>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub ethernets: Option<HashMap<String, EthernetConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub wifis: Option<HashMap<String, WifiConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub bonds: Option<HashMap<String, BondConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub bridges: Option<HashMap<String, BridgeConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub vlans: Option<HashMap<String, VlanConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub tunnels: Option<HashMap<String, TunnelConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub vrfs: Option<HashMap<String, VrfsConfig>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub dummy_devices: Option<HashMap<String, DummyDeviceConfig>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Renderer {
#[cfg_attr(feature = "serde", serde(rename = "networkd"))]
Networkd,
#[cfg_attr(feature = "serde", serde(rename = "NetworkManager"))]
NetworkManager,
#[cfg_attr(feature = "serde", serde(rename = "sriov"))]
Sriov,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(untagged))]
#[cfg_attr(feature = "serde", serde(rename = "lowercase"))]
pub enum UseDomains {
Boolean(
#[cfg_attr(
feature = "serde",
serde(deserialize_with = "crate::bool::string_or_bool")
)]
bool,
),
Route,
}
#[cfg(test)]
mod test {
use crate::NetplanConfig;
#[test]
fn yaml_booleans() {
let input = r#"
network:
version: 2
ethernets:
nics:
match:
name: ens*
dhcp4: on
dhcp6: N
"#;
let netplan_config: NetplanConfig = serde_yaml::from_str(&input).unwrap();
let ethernets = netplan_config.network.ethernets.unwrap();
let ethernet = ethernets.values().next().unwrap();
assert!(ethernet.common_all.is_some());
let common = ethernet.common_all.as_ref().unwrap();
assert_eq!(common.dhcp4, Some(true));
}
}