Can specify MAC addresses for domains
This commit is contained in:
@ -43,3 +43,6 @@ pub const DISK_SIZE_MIN: usize = 100;
|
||||
|
||||
/// Disk size max (MB)
|
||||
pub const DISK_SIZE_MAX: usize = 1000 * 1000 * 2;
|
||||
|
||||
/// Network mac address default prefix
|
||||
pub const NET_MAC_ADDR_PREFIX: &str = "52:54:00";
|
||||
|
@ -14,6 +14,7 @@ struct StaticConfig {
|
||||
local_auth_enabled: bool,
|
||||
oidc_auth_enabled: bool,
|
||||
iso_mimetypes: &'static [&'static str],
|
||||
net_mac_prefix: &'static str,
|
||||
constraints: ServerConstraints,
|
||||
}
|
||||
|
||||
@ -42,6 +43,7 @@ pub async fn static_config(local_auth: LocalAuthEnabled) -> impl Responder {
|
||||
local_auth_enabled: *local_auth,
|
||||
oidc_auth_enabled: !AppConfig::get().disable_oidc,
|
||||
iso_mimetypes: &constants::ALLOWED_ISO_MIME_TYPES,
|
||||
net_mac_prefix: constants::NET_MAC_ADDR_PREFIX,
|
||||
constraints: ServerConstraints {
|
||||
iso_max_size: constants::ISO_MAX_SIZE,
|
||||
|
||||
|
@ -63,6 +63,13 @@ pub struct FeaturesXML {
|
||||
#[serde(rename = "acpi")]
|
||||
pub struct ACPIXML {}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize)]
|
||||
#[serde(rename = "mac")]
|
||||
pub struct NetMacAddress {
|
||||
#[serde(rename(serialize = "@address"))]
|
||||
pub address: String,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize)]
|
||||
#[serde(rename = "source")]
|
||||
pub struct NetIntSourceXML {
|
||||
@ -75,7 +82,7 @@ pub struct NetIntSourceXML {
|
||||
pub struct DomainNetInterfaceXML {
|
||||
#[serde(rename(serialize = "@type"))]
|
||||
pub r#type: String,
|
||||
|
||||
pub mac: NetMacAddress,
|
||||
pub source: Option<NetIntSourceXML>,
|
||||
}
|
||||
|
||||
|
@ -3,10 +3,10 @@ use crate::constants;
|
||||
use crate::libvirt_lib_structures::{
|
||||
DevicesXML, DiskBootXML, DiskDriverXML, DiskReadOnlyXML, DiskSourceXML, DiskTargetXML, DiskXML,
|
||||
DomainCPUTopology, DomainCPUXML, DomainInputXML, DomainMemoryXML, DomainNetInterfaceXML,
|
||||
DomainVCPUXML, DomainXML, FeaturesXML, GraphicsXML, NetIntSourceXML, NetworkDHCPRangeXML,
|
||||
NetworkDHCPXML, NetworkDNSForwarderXML, NetworkDNSXML, NetworkDomainXML, NetworkForwardXML,
|
||||
NetworkIPXML, NetworkXML, OSLoaderXML, OSTypeXML, TPMBackendXML, TPMDeviceXML, VideoModelXML,
|
||||
VideoXML, XMLUuid, ACPIXML, OSXML,
|
||||
DomainVCPUXML, DomainXML, FeaturesXML, GraphicsXML, NetIntSourceXML, NetMacAddress,
|
||||
NetworkDHCPRangeXML, NetworkDHCPXML, NetworkDNSForwarderXML, NetworkDNSXML, NetworkDomainXML,
|
||||
NetworkForwardXML, NetworkIPXML, NetworkXML, OSLoaderXML, OSTypeXML, TPMBackendXML,
|
||||
TPMDeviceXML, VideoModelXML, VideoXML, XMLUuid, ACPIXML, OSXML,
|
||||
};
|
||||
use crate::libvirt_rest_structures::LibVirtStructError::StructureExtraction;
|
||||
use crate::utils::disks_utils::Disk;
|
||||
@ -65,9 +65,16 @@ pub enum VMArchitecture {
|
||||
X86_64,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize)]
|
||||
pub struct Network {
|
||||
mac: String,
|
||||
#[serde(flatten)]
|
||||
r#type: NetworkType,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize)]
|
||||
#[serde(tag = "type")]
|
||||
pub enum Network {
|
||||
pub enum NetworkType {
|
||||
UserspaceSLIRPStack,
|
||||
DefinedNetwork { network: String }, // TODO : complete network types
|
||||
}
|
||||
@ -235,12 +242,14 @@ impl VMInfo {
|
||||
|
||||
let mut networks = vec![];
|
||||
for n in self.networks {
|
||||
networks.push(match n {
|
||||
Network::UserspaceSLIRPStack => DomainNetInterfaceXML {
|
||||
networks.push(match n.r#type {
|
||||
NetworkType::UserspaceSLIRPStack => DomainNetInterfaceXML {
|
||||
mac: NetMacAddress { address: n.mac },
|
||||
r#type: "user".to_string(),
|
||||
source: None,
|
||||
},
|
||||
Network::DefinedNetwork { network } => DomainNetInterfaceXML {
|
||||
NetworkType::DefinedNetwork { network } => DomainNetInterfaceXML {
|
||||
mac: NetMacAddress { address: n.mac },
|
||||
r#type: "network".to_string(),
|
||||
source: Some(NetIntSourceXML { network }),
|
||||
},
|
||||
@ -382,14 +391,21 @@ impl VMInfo {
|
||||
.devices
|
||||
.net_interfaces
|
||||
.iter()
|
||||
.map(|d| match d.r#type.as_str() {
|
||||
"user" => Ok(Network::UserspaceSLIRPStack),
|
||||
"network" => Ok(Network::DefinedNetwork {
|
||||
network: d.source.as_ref().unwrap().network.to_string(),
|
||||
}),
|
||||
a => Err(LibVirtStructError::DomainExtraction(format!(
|
||||
"Unknown network interface type: {a}! "
|
||||
))),
|
||||
.map(|d| {
|
||||
Ok(Network {
|
||||
mac: d.mac.address.to_string(),
|
||||
r#type: match d.r#type.as_str() {
|
||||
"user" => NetworkType::UserspaceSLIRPStack,
|
||||
"network" => NetworkType::DefinedNetwork {
|
||||
network: d.source.as_ref().unwrap().network.to_string(),
|
||||
},
|
||||
a => {
|
||||
return Err(LibVirtStructError::DomainExtraction(format!(
|
||||
"Unknown network interface type: {a}! "
|
||||
)));
|
||||
}
|
||||
},
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<_>, _>>()?,
|
||||
|
||||
|
Reference in New Issue
Block a user