nzr-virt: smbios strings support
This commit is contained in:
parent
d10d98de96
commit
b350e73b8a
3 changed files with 102 additions and 0 deletions
|
@ -113,6 +113,14 @@ impl DomainBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn smbios(mut self, data: Sysinfo) -> Self {
|
||||||
|
self.domain.os.smbios = Some(SmbiosInfo {
|
||||||
|
mode: "sysinfo".into(),
|
||||||
|
});
|
||||||
|
self.domain.sysinfo = Some(data);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cpu_topology(mut self, sockets: u8, dies: u8, cores: u8, threads: u8) -> Self {
|
pub fn cpu_topology(mut self, sockets: u8, dies: u8, cores: u8, threads: u8) -> Self {
|
||||||
self.domain.cpu.topology = CpuTopology {
|
self.domain.cpu.topology = CpuTopology {
|
||||||
sockets,
|
sockets,
|
||||||
|
|
|
@ -25,6 +25,7 @@ pub struct Domain {
|
||||||
pub cpu: Cpu,
|
pub cpu: Cpu,
|
||||||
pub devices: DeviceList,
|
pub devices: DeviceList,
|
||||||
pub os: OsData,
|
pub os: OsData,
|
||||||
|
pub sysinfo: Option<Sysinfo>,
|
||||||
pub on_poweroff: Option<PowerAction>,
|
pub on_poweroff: Option<PowerAction>,
|
||||||
pub on_reboot: Option<PowerAction>,
|
pub on_reboot: Option<PowerAction>,
|
||||||
pub on_crash: Option<PowerAction>,
|
pub on_crash: Option<PowerAction>,
|
||||||
|
@ -68,7 +69,9 @@ impl Default for Domain {
|
||||||
useserial: "yes".to_owned(),
|
useserial: "yes".to_owned(),
|
||||||
reboot_timeout: 0,
|
reboot_timeout: 0,
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
sysinfo: None,
|
||||||
on_poweroff: None,
|
on_poweroff: None,
|
||||||
on_reboot: None,
|
on_reboot: None,
|
||||||
on_crash: None,
|
on_crash: None,
|
||||||
|
@ -358,6 +361,12 @@ impl Default for OsType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
|
pub struct SmbiosInfo {
|
||||||
|
#[serde(rename = "@mode")]
|
||||||
|
mode: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[skip_serializing_none]
|
#[skip_serializing_none]
|
||||||
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
pub struct OsData {
|
pub struct OsData {
|
||||||
|
@ -365,6 +374,7 @@ pub struct OsData {
|
||||||
r#type: OsType,
|
r#type: OsType,
|
||||||
// we will not be doing PV, no <bootloader>/<kernel>/<initrd>/etc
|
// we will not be doing PV, no <bootloader>/<kernel>/<initrd>/etc
|
||||||
bios: BiosData,
|
bios: BiosData,
|
||||||
|
smbios: Option<SmbiosInfo>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for OsData {
|
impl Default for OsData {
|
||||||
|
@ -378,6 +388,7 @@ impl Default for OsData {
|
||||||
useserial: "yes".to_owned(),
|
useserial: "yes".to_owned(),
|
||||||
reboot_timeout: 0,
|
reboot_timeout: 0,
|
||||||
},
|
},
|
||||||
|
smbios: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,6 +488,75 @@ pub struct Cpu {
|
||||||
topology: CpuTopology,
|
topology: CpuTopology,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
|
pub struct InfoEntry {
|
||||||
|
#[serde(rename = "@name")]
|
||||||
|
name: Option<String>,
|
||||||
|
#[serde(rename = "$value")]
|
||||||
|
value: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
|
pub struct InfoMap {
|
||||||
|
entry: Vec<InfoEntry>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InfoMap {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self { entry: Vec::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn push(&mut self, name: impl Into<String>, value: impl Into<String>) -> &mut Self {
|
||||||
|
self.entry.push(InfoEntry {
|
||||||
|
name: Some(name.into()),
|
||||||
|
value: value.into(),
|
||||||
|
});
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for InfoMap {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[skip_serializing_none]
|
||||||
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Sysinfo {
|
||||||
|
#[serde(rename = "@type")]
|
||||||
|
r#type: String,
|
||||||
|
bios: Option<InfoMap>,
|
||||||
|
system: Option<InfoMap>,
|
||||||
|
base_board: Option<InfoMap>,
|
||||||
|
chassis: Option<InfoMap>,
|
||||||
|
oem_strings: Option<InfoMap>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sysinfo {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
r#type: "smbios".into(),
|
||||||
|
bios: None,
|
||||||
|
system: None,
|
||||||
|
base_board: None,
|
||||||
|
chassis: None,
|
||||||
|
oem_strings: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn system(&mut self, info: InfoMap) {
|
||||||
|
self.system = Some(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Sysinfo {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^=
|
// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^=
|
||||||
|
|
||||||
#[skip_serializing_none]
|
#[skip_serializing_none]
|
||||||
|
|
|
@ -47,12 +47,25 @@ fn domain_serde() {
|
||||||
<boot dev="hd"/>
|
<boot dev="hd"/>
|
||||||
<type arch="x86_64" machine="pc-i440fx-5.2">hvm</type>
|
<type arch="x86_64" machine="pc-i440fx-5.2">hvm</type>
|
||||||
<bios useserial="yes" rebootTimeout="0"/>
|
<bios useserial="yes" rebootTimeout="0"/>
|
||||||
|
<smbios mode="sysinfo"/>
|
||||||
</os>
|
</os>
|
||||||
|
<sysinfo type="smbios">
|
||||||
|
<system>
|
||||||
|
<entry name="serial">hello!</entry>
|
||||||
|
</system>
|
||||||
|
</sysinfo>
|
||||||
</domain>"#
|
</domain>"#
|
||||||
.unprettify();
|
.unprettify();
|
||||||
println!("Serializing domain...");
|
println!("Serializing domain...");
|
||||||
let mac = MacAddr::new(0x02, 0x0b, 0xee, 0xca, 0xfe, 0x42);
|
let mac = MacAddr::new(0x02, 0x0b, 0xee, 0xca, 0xfe, 0x42);
|
||||||
let uuid = uuid!("9a8f2611-a976-4d06-ac91-2750ac3462b3");
|
let uuid = uuid!("9a8f2611-a976-4d06-ac91-2750ac3462b3");
|
||||||
|
let sysinfo = {
|
||||||
|
let mut system_map = InfoMap::new();
|
||||||
|
system_map.push("serial", "hello!");
|
||||||
|
let mut sysinfo = Sysinfo::new();
|
||||||
|
sysinfo.system(system_map);
|
||||||
|
sysinfo
|
||||||
|
};
|
||||||
let domain = DomainBuilder::default()
|
let domain = DomainBuilder::default()
|
||||||
.name("test-vm")
|
.name("test-vm")
|
||||||
.uuid(uuid)
|
.uuid(uuid)
|
||||||
|
@ -62,6 +75,7 @@ fn domain_serde() {
|
||||||
.target("sda", "virtio")
|
.target("sda", "virtio")
|
||||||
})
|
})
|
||||||
.net_device(|net| net.with_bridge("virbr0").mac_addr(mac))
|
.net_device(|net| net.with_bridge("virbr0").mac_addr(mac))
|
||||||
|
.smbios(sysinfo)
|
||||||
.build();
|
.build();
|
||||||
let dom_xml = quick_xml::se::to_string(&domain).unwrap();
|
let dom_xml = quick_xml::se::to_string(&domain).unwrap();
|
||||||
println!("{}", dom_xml);
|
println!("{}", dom_xml);
|
||||||
|
|
Loading…
Reference in a new issue