Skip to content

Commit fdc43f8

Browse files
author
Sebastien Boeuf
committed
ch_integration_tests: Refactor XML creation
Rely on an external crate to generate dynamically libvirt domain XML. This anticipates the need to opt in or out some parameters, which is not possible with static XML generation. Signed-off-by: Sebastien Boeuf <[email protected]>
1 parent b02d862 commit fdc43f8

File tree

3 files changed

+91
-52
lines changed

3 files changed

+91
-52
lines changed

ch_integration_tests/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ch_integration_tests/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ epoll = "4.3.1"
1111
libc = ">=0.2.91"
1212
lazy_static= "1.4.0"
1313
regex = "1.4.5"
14+
simple_xml_serialize = "0.1.0"
1415
ssh2 = "0.9.1"
1516
test_infra = { git = "https://github.com/cloud-hypervisor/cloud-hypervisor" }
1617
uuid = { version = "0.8", features = ["v4"] }

ch_integration_tests/tests/integration.rs

Lines changed: 83 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ extern crate regex;
1010

1111
#[cfg(test)]
1212
mod tests {
13+
use regex::Regex;
14+
use simple_xml_serialize::XMLElement;
1315
use std::io::{self, Write};
1416
use std::process::{Child, Command, Stdio};
1517
use std::sync::Mutex;
1618
use std::thread;
1719
use std::{ffi::OsStr, path::PathBuf};
1820
use test_infra::*;
19-
20-
use regex::Regex;
2121
use uuid::Uuid;
2222
use vmm_sys_util::tempdir::TempDir;
2323

@@ -67,56 +67,87 @@ mod tests {
6767

6868
impl<'a> Guest<'a> {
6969
fn create_domain(&self, vcpus: VcpuConfig, memory_size: u64) -> PathBuf {
70-
let domain = format!(
71-
"<domain type='ch'> \
72-
<name>{}</name> \
73-
<uuid>{}</uuid> \
74-
<genid>43dc0cf8-809b-4adb-9bea-a9abb5f3d90e</genid> \
75-
<title>Test VM {}</title> \
76-
<description>Test VM {}</description> \
77-
<os> \
78-
<type>hvm</type> \
79-
<kernel>{}</kernel> \
80-
</os> \
81-
<vcpu current='{}'>{}</vcpu> \
82-
<memory unit='b'>{}</memory> \
83-
<devices> \
84-
<disk type='file'> \
85-
<source file='{}'/> \
86-
<target dev='vda' bus='virtio'/> \
87-
</disk> \
88-
<disk type='file'> \
89-
<source file='{}'/> \
90-
<target dev='vdb' bus='virtio'/> \
91-
</disk> \
92-
<console type='pty'> \
93-
<target type='virtio' port='0'/> \
94-
</console> \
95-
<interface type='ethernet'> \
96-
<mac address='{}'/> \
97-
<model type='virtio'/> \
98-
<source> \
99-
<ip address='{}' prefix='24'/> \
100-
</source> \
101-
</interface> \
102-
</devices> \
103-
</domain>",
104-
self.vm_name,
105-
self.uuid,
106-
self.vm_name,
107-
self.vm_name,
108-
self.kernel_path.to_str().unwrap(),
109-
vcpus.boot,
110-
vcpus.max,
111-
memory_size,
112-
self.disk_config
113-
.disk(DiskType::OperatingSystem)
114-
.unwrap()
115-
.as_str(),
116-
self.disk_config.disk(DiskType::CloudInit).unwrap().as_str(),
117-
self.network.guest_mac,
118-
self.network.host_ip,
119-
);
70+
let xml_domain = XMLElement::new("domain")
71+
.attr("type", "ch")
72+
.element(XMLElement::new("name").text(self.vm_name.clone()))
73+
.element(XMLElement::new("uuid").text(self.uuid.clone()))
74+
.element(XMLElement::new("genid").text("43dc0cf8-809b-4adb-9bea-a9abb5f3d90e"))
75+
.element(XMLElement::new("title").text(format!("Test VM {}", self.vm_name.clone())))
76+
.element(
77+
XMLElement::new("description")
78+
.text(format!("Test VM {}", self.vm_name.clone())),
79+
)
80+
.element(
81+
XMLElement::new("os")
82+
.element(XMLElement::new("type").text("hvm"))
83+
.element(
84+
XMLElement::new("kernel").text(self.kernel_path.to_str().unwrap()),
85+
),
86+
)
87+
.element(
88+
XMLElement::new("vcpu")
89+
.attr("current", vcpus.boot)
90+
.text(vcpus.max),
91+
)
92+
.element(
93+
XMLElement::new("memory")
94+
.attr("unit", "b")
95+
.text(memory_size),
96+
)
97+
.element(
98+
XMLElement::new("devices")
99+
.element(
100+
XMLElement::new("disk")
101+
.attr("type", "file")
102+
.element(XMLElement::new("source").attr(
103+
"file",
104+
self.disk_config.disk(DiskType::OperatingSystem).unwrap(),
105+
))
106+
.element(
107+
XMLElement::new("target")
108+
.attr("dev", "vda")
109+
.attr("bus", "virtio"),
110+
),
111+
)
112+
.element(
113+
XMLElement::new("disk")
114+
.attr("type", "file")
115+
.element(XMLElement::new("source").attr(
116+
"file",
117+
self.disk_config.disk(DiskType::CloudInit).unwrap(),
118+
))
119+
.element(
120+
XMLElement::new("target")
121+
.attr("dev", "vdb")
122+
.attr("bus", "virtio"),
123+
),
124+
)
125+
.element(
126+
XMLElement::new("console").attr("type", "pty").element(
127+
XMLElement::new("target")
128+
.attr("type", "virtio")
129+
.attr("port", "0"),
130+
),
131+
)
132+
.element(
133+
XMLElement::new("interface")
134+
.attr("type", "ethernet")
135+
.element(
136+
XMLElement::new("mac")
137+
.attr("address", self.network.guest_mac.clone()),
138+
)
139+
.element(XMLElement::new("model").attr("type", "virtio"))
140+
.element(
141+
XMLElement::new("source").element(
142+
XMLElement::new("ip")
143+
.attr("address", self.network.host_ip.clone())
144+
.attr("prefix", "24"),
145+
),
146+
),
147+
),
148+
);
149+
150+
let domain = xml_domain.to_string();
120151

121152
eprintln!("{}\n", domain);
122153

0 commit comments

Comments
 (0)