Refactor XML definitions serialization
This commit is contained in:
parent
924c972984
commit
ed1bd806d7
@ -120,32 +120,8 @@ pub struct DefineDomainReq(pub DomainXML);
|
|||||||
impl Handler<DefineDomainReq> for LibVirtActor {
|
impl Handler<DefineDomainReq> for LibVirtActor {
|
||||||
type Result = anyhow::Result<XMLUuid>;
|
type Result = anyhow::Result<XMLUuid>;
|
||||||
|
|
||||||
fn handle(&mut self, mut msg: DefineDomainReq, _ctx: &mut Self::Context) -> Self::Result {
|
fn handle(&mut self, msg: DefineDomainReq, _ctx: &mut Self::Context) -> Self::Result {
|
||||||
// A issue with the disks & network interface definition serialization needs them to be serialized aside
|
let xml = msg.0.into_xml()?;
|
||||||
let mut devices_xml = Vec::with_capacity(msg.0.devices.disks.len());
|
|
||||||
for disk in msg.0.devices.disks {
|
|
||||||
let disk_xml = serde_xml_rs::to_string(&disk)?;
|
|
||||||
let start_offset = disk_xml.find("<disk").unwrap();
|
|
||||||
devices_xml.push(disk_xml[start_offset..].to_string());
|
|
||||||
}
|
|
||||||
for network in msg.0.devices.net_interfaces {
|
|
||||||
let network_xml = serde_xml_rs::to_string(&network)?;
|
|
||||||
let start_offset = network_xml.find("<interface").unwrap();
|
|
||||||
devices_xml.push(network_xml[start_offset..].to_string());
|
|
||||||
}
|
|
||||||
for input in msg.0.devices.inputs {
|
|
||||||
let input_xml = serde_xml_rs::to_string(&input)?;
|
|
||||||
let start_offset = input_xml.find("<input").unwrap();
|
|
||||||
devices_xml.push(input_xml[start_offset..].to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.0.devices.disks = vec![];
|
|
||||||
msg.0.devices.net_interfaces = vec![];
|
|
||||||
msg.0.devices.inputs = vec![];
|
|
||||||
|
|
||||||
let mut xml = serde_xml_rs::to_string(&msg.0)?;
|
|
||||||
let disks_xml = devices_xml.join("\n");
|
|
||||||
xml = xml.replacen("<devices>", &format!("<devices>{disks_xml}"), 1);
|
|
||||||
|
|
||||||
log::debug!("Define domain:\n{}", xml);
|
log::debug!("Define domain:\n{}", xml);
|
||||||
let domain = Domain::define_xml(&self.m, &xml)?;
|
let domain = Domain::define_xml(&self.m, &xml)?;
|
||||||
@ -389,26 +365,11 @@ pub struct DefineNetwork(pub NetworkXML);
|
|||||||
impl Handler<DefineNetwork> for LibVirtActor {
|
impl Handler<DefineNetwork> for LibVirtActor {
|
||||||
type Result = anyhow::Result<XMLUuid>;
|
type Result = anyhow::Result<XMLUuid>;
|
||||||
|
|
||||||
fn handle(&mut self, mut msg: DefineNetwork, _ctx: &mut Self::Context) -> Self::Result {
|
fn handle(&mut self, msg: DefineNetwork, _ctx: &mut Self::Context) -> Self::Result {
|
||||||
log::debug!("Define network: {:?}", msg.0);
|
log::debug!("Define network: {:?}", msg.0);
|
||||||
|
|
||||||
// A issue with the IPs definition serialization needs them to be serialized aside
|
|
||||||
let mut ips_xml = Vec::with_capacity(msg.0.ips.len());
|
|
||||||
for ip in msg.0.ips {
|
|
||||||
log::debug!("Serialize {ip:?}");
|
|
||||||
let ip_xml = serde_xml_rs::to_string(&ip)?;
|
|
||||||
let start_offset = ip_xml.find("<ip").unwrap();
|
|
||||||
ips_xml.push(ip_xml[start_offset..].to_string());
|
|
||||||
}
|
|
||||||
msg.0.ips = vec![];
|
|
||||||
|
|
||||||
let mut network_xml = serde_xml_rs::to_string(&msg.0)?;
|
|
||||||
log::trace!("Serialize network XML start: {network_xml}");
|
|
||||||
|
|
||||||
let ips_xml = ips_xml.join("\n");
|
|
||||||
network_xml = network_xml.replacen("</network>", &format!("{ips_xml}</network>"), 1);
|
|
||||||
|
|
||||||
log::debug!("Source network structure: {:#?}", msg.0);
|
log::debug!("Source network structure: {:#?}", msg.0);
|
||||||
|
let network_xml = msg.0.into_xml()?;
|
||||||
log::debug!("Define network XML: {network_xml}");
|
log::debug!("Define network XML: {network_xml}");
|
||||||
|
|
||||||
let network = Network::define_xml(&self.m, &network_xml)?;
|
let network = Network::define_xml(&self.m, &network_xml)?;
|
||||||
|
@ -318,6 +318,38 @@ pub struct DomainXML {
|
|||||||
pub on_crash: String,
|
pub on_crash: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DomainXML {
|
||||||
|
/// Turn this domain into its XML definition
|
||||||
|
pub fn into_xml(mut self) -> anyhow::Result<String> {
|
||||||
|
// A issue with the disks & network interface definition serialization needs them to be serialized aside
|
||||||
|
let mut devices_xml = Vec::with_capacity(self.devices.disks.len());
|
||||||
|
for disk in self.devices.disks {
|
||||||
|
let disk_xml = serde_xml_rs::to_string(&disk)?;
|
||||||
|
let start_offset = disk_xml.find("<disk").unwrap();
|
||||||
|
devices_xml.push(disk_xml[start_offset..].to_string());
|
||||||
|
}
|
||||||
|
for network in self.devices.net_interfaces {
|
||||||
|
let network_xml = serde_xml_rs::to_string(&network)?;
|
||||||
|
let start_offset = network_xml.find("<interface").unwrap();
|
||||||
|
devices_xml.push(network_xml[start_offset..].to_string());
|
||||||
|
}
|
||||||
|
for input in self.devices.inputs {
|
||||||
|
let input_xml = serde_xml_rs::to_string(&input)?;
|
||||||
|
let start_offset = input_xml.find("<input").unwrap();
|
||||||
|
devices_xml.push(input_xml[start_offset..].to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
self.devices.disks = vec![];
|
||||||
|
self.devices.net_interfaces = vec![];
|
||||||
|
self.devices.inputs = vec![];
|
||||||
|
|
||||||
|
let mut xml = serde_xml_rs::to_string(&self)?;
|
||||||
|
let disks_xml = devices_xml.join("\n");
|
||||||
|
xml = xml.replacen("<devices>", &format!("<devices>{disks_xml}"), 1);
|
||||||
|
Ok(xml)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Domain state
|
/// Domain state
|
||||||
#[derive(serde::Serialize, Debug, Copy, Clone)]
|
#[derive(serde::Serialize, Debug, Copy, Clone)]
|
||||||
pub enum DomainState {
|
pub enum DomainState {
|
||||||
@ -435,3 +467,24 @@ pub struct NetworkXML {
|
|||||||
#[serde(default, rename = "ip")]
|
#[serde(default, rename = "ip")]
|
||||||
pub ips: Vec<NetworkIPXML>,
|
pub ips: Vec<NetworkIPXML>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl NetworkXML {
|
||||||
|
pub fn into_xml(mut self) -> anyhow::Result<String> {
|
||||||
|
// A issue with the IPs definition serialization needs them to be serialized aside
|
||||||
|
let mut ips_xml = Vec::with_capacity(self.ips.len());
|
||||||
|
for ip in self.ips {
|
||||||
|
log::debug!("Serialize {ip:?}");
|
||||||
|
let ip_xml = serde_xml_rs::to_string(&ip)?;
|
||||||
|
let start_offset = ip_xml.find("<ip").unwrap();
|
||||||
|
ips_xml.push(ip_xml[start_offset..].to_string());
|
||||||
|
}
|
||||||
|
self.ips = vec![];
|
||||||
|
|
||||||
|
let mut network_xml = serde_xml_rs::to_string(&self)?;
|
||||||
|
log::trace!("Serialize network XML start: {network_xml}");
|
||||||
|
|
||||||
|
let ips_xml = ips_xml.join("\n");
|
||||||
|
network_xml = network_xml.replacen("</network>", &format!("{ips_xml}</network>"), 1);
|
||||||
|
Ok(network_xml)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user