diff --git a/virtweb_backend/src/libvirt_lib_structures.rs b/virtweb_backend/src/libvirt_lib_structures.rs index 27b07a4..d7e37a2 100644 --- a/virtweb_backend/src/libvirt_lib_structures.rs +++ b/virtweb_backend/src/libvirt_lib_structures.rs @@ -90,10 +90,14 @@ pub struct DomainInputXML { #[derive(serde::Serialize, serde::Deserialize)] #[serde(rename = "devices")] pub struct DevicesXML { - /// Graphics (used for VNC + /// Graphics (used for VNC) #[serde(skip_serializing_if = "Option::is_none")] pub graphics: Option, + /// Graphics (used for VNC) + #[serde(skip_serializing_if = "Option::is_none")] + pub video: Option, + /// Disks (used for storage) #[serde(default, rename = "disk", skip_serializing_if = "Vec::is_empty")] pub disks: Vec, @@ -107,7 +111,7 @@ pub struct DevicesXML { pub inputs: Vec, } -/// Screen information +/// Graphics information #[derive(serde::Serialize, serde::Deserialize)] #[serde(rename = "graphics")] pub struct GraphicsXML { @@ -117,6 +121,21 @@ pub struct GraphicsXML { pub socket: String, } +/// Video device information +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(rename = "video")] +pub struct VideoXML { + pub model: VideoModelXML, +} + +/// Video model device information +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(rename = "model")] +pub struct VideoModelXML { + #[serde(rename(serialize = "@type"))] + pub r#type: String, +} + /// Disk information #[derive(serde::Serialize, serde::Deserialize)] #[serde(rename = "disk")] diff --git a/virtweb_backend/src/libvirt_rest_structures.rs b/virtweb_backend/src/libvirt_rest_structures.rs index dc10acd..ce4e0ca 100644 --- a/virtweb_backend/src/libvirt_rest_structures.rs +++ b/virtweb_backend/src/libvirt_rest_structures.rs @@ -5,7 +5,8 @@ use crate::libvirt_lib_structures::{ DomainCPUTopology, DomainCPUXML, DomainInputXML, DomainMemoryXML, DomainNetInterfaceXML, DomainVCPUXML, DomainXML, FeaturesXML, GraphicsXML, NetIntSourceXML, NetworkDHCPRangeXML, NetworkDHCPXML, NetworkDNSForwarderXML, NetworkDNSXML, NetworkDomainXML, NetworkForwardXML, - NetworkIPXML, NetworkXML, OSLoaderXML, OSTypeXML, XMLUuid, ACPIXML, OSXML, + NetworkIPXML, NetworkXML, OSLoaderXML, OSTypeXML, VideoModelXML, VideoXML, XMLUuid, ACPIXML, + OSXML, }; use crate::libvirt_rest_structures::LibVirtStructError::StructureExtraction; use crate::utils::disks_utils::Disk; @@ -170,15 +171,22 @@ impl VMInfo { }) } - let vnc_graphics = match self.vnc_access { - true => Some(GraphicsXML { - r#type: "vnc".to_string(), - socket: AppConfig::get() - .vnc_socket_for_domain(&self.name) - .to_string_lossy() - .to_string(), - }), - false => None, + let (vnc_graphics, vnc_video) = match self.vnc_access { + true => ( + Some(GraphicsXML { + r#type: "vnc".to_string(), + socket: AppConfig::get() + .vnc_socket_for_domain(&self.name) + .to_string_lossy() + .to_string(), + }), + Some(VideoXML { + model: VideoModelXML { + r#type: "qxl".to_string(), + }, + }), + ), + false => (None, None), }; // Check disks name for duplicates @@ -268,6 +276,7 @@ impl VMInfo { devices: DevicesXML { graphics: vnc_graphics, + video: vnc_video, disks, net_interfaces: networks, inputs: vec![