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