mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-03 20:15:45 +00:00
vmm: remove Default impls for config
These Default implementations either don't produce valid configs, are no longer used outside of tests, or both. For the tests, we can define our own local "default" values that make the most sense for the tests, without worrying about what's a (somewhat) sensible "global" default value. Signed-off-by: Alyssa Ross <hi@alyssa.is>
This commit is contained in:
parent
c71cb00a5a
commit
7674196113
@ -145,7 +145,11 @@ impl RequestHandler for StubApiRequestHandler {
|
|||||||
},
|
},
|
||||||
payload: Some(PayloadConfig {
|
payload: Some(PayloadConfig {
|
||||||
kernel: Some(PathBuf::from("/path/to/kernel")),
|
kernel: Some(PathBuf::from("/path/to/kernel")),
|
||||||
..Default::default()
|
firmware: None,
|
||||||
|
cmdline: None,
|
||||||
|
initramfs: None,
|
||||||
|
#[cfg(feature = "igvm")]
|
||||||
|
igvm: None,
|
||||||
}),
|
}),
|
||||||
rate_limit_groups: None,
|
rate_limit_groups: None,
|
||||||
disks: None,
|
disks: None,
|
||||||
|
@ -853,7 +853,11 @@ mod unit_tests {
|
|||||||
},
|
},
|
||||||
payload: Some(PayloadConfig {
|
payload: Some(PayloadConfig {
|
||||||
kernel: Some(PathBuf::from("/path/to/kernel")),
|
kernel: Some(PathBuf::from("/path/to/kernel")),
|
||||||
..Default::default()
|
firmware: None,
|
||||||
|
cmdline: None,
|
||||||
|
initramfs: None,
|
||||||
|
#[cfg(feature = "igvm")]
|
||||||
|
igvm: None,
|
||||||
}),
|
}),
|
||||||
rate_limit_groups: None,
|
rate_limit_groups: None,
|
||||||
disks: None,
|
disks: None,
|
||||||
|
@ -2641,6 +2641,7 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use net_util::MacAddr;
|
use net_util::MacAddr;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
use std::net::Ipv4Addr;
|
||||||
use std::os::unix::io::AsRawFd;
|
use std::os::unix::io::AsRawFd;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2808,104 +2809,133 @@ mod tests {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn disk_fixture() -> DiskConfig {
|
||||||
|
DiskConfig {
|
||||||
|
path: Some(PathBuf::from("/path/to_file")),
|
||||||
|
readonly: false,
|
||||||
|
direct: false,
|
||||||
|
iommu: false,
|
||||||
|
num_queues: 1,
|
||||||
|
queue_size: 128,
|
||||||
|
vhost_user: false,
|
||||||
|
vhost_socket: None,
|
||||||
|
id: None,
|
||||||
|
disable_io_uring: false,
|
||||||
|
disable_aio: false,
|
||||||
|
rate_limit_group: None,
|
||||||
|
rate_limiter_config: None,
|
||||||
|
pci_segment: 0,
|
||||||
|
serial: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_disk_parsing() -> Result<()> {
|
fn test_disk_parsing() -> Result<()> {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file")?,
|
DiskConfig::parse("path=/path/to_file")?,
|
||||||
DiskConfig {
|
DiskConfig { ..disk_fixture() }
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,id=mydisk0")?,
|
DiskConfig::parse("path=/path/to_file,id=mydisk0")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
id: Some("mydisk0".to_owned()),
|
id: Some("mydisk0".to_owned()),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("vhost_user=true,socket=/tmp/sock")?,
|
DiskConfig::parse("vhost_user=true,socket=/tmp/sock")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
|
path: None,
|
||||||
vhost_socket: Some(String::from("/tmp/sock")),
|
vhost_socket: Some(String::from("/tmp/sock")),
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,iommu=on")?,
|
DiskConfig::parse("path=/path/to_file,iommu=on")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
iommu: true,
|
iommu: true,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,iommu=on,queue_size=256")?,
|
DiskConfig::parse("path=/path/to_file,iommu=on,queue_size=256")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
iommu: true,
|
iommu: true,
|
||||||
queue_size: 256,
|
queue_size: 256,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,iommu=on,queue_size=256,num_queues=4")?,
|
DiskConfig::parse("path=/path/to_file,iommu=on,queue_size=256,num_queues=4")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
iommu: true,
|
iommu: true,
|
||||||
queue_size: 256,
|
queue_size: 256,
|
||||||
num_queues: 4,
|
num_queues: 4,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,direct=on")?,
|
DiskConfig::parse("path=/path/to_file,direct=on")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
direct: true,
|
direct: true,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,serial=test")?,
|
DiskConfig::parse("path=/path/to_file,serial=test")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
serial: Some(String::from("test")),
|
serial: Some(String::from("test")),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DiskConfig::parse("path=/path/to_file,rate_limit_group=group0")?,
|
DiskConfig::parse("path=/path/to_file,rate_limit_group=group0")?,
|
||||||
DiskConfig {
|
DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to_file")),
|
|
||||||
rate_limit_group: Some("group0".to_string()),
|
rate_limit_group: Some("group0".to_string()),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn net_fixture() -> NetConfig {
|
||||||
|
NetConfig {
|
||||||
|
tap: None,
|
||||||
|
ip: Ipv4Addr::new(192, 168, 249, 1),
|
||||||
|
mask: Ipv4Addr::new(255, 255, 255, 0),
|
||||||
|
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
||||||
|
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
||||||
|
mtu: None,
|
||||||
|
iommu: false,
|
||||||
|
num_queues: 2,
|
||||||
|
queue_size: 256,
|
||||||
|
vhost_user: false,
|
||||||
|
vhost_socket: None,
|
||||||
|
vhost_mode: VhostMode::Client,
|
||||||
|
id: None,
|
||||||
|
fds: None,
|
||||||
|
rate_limiter_config: None,
|
||||||
|
pci_segment: 0,
|
||||||
|
offload_tso: true,
|
||||||
|
offload_ufo: true,
|
||||||
|
offload_csum: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_net_parsing() -> Result<()> {
|
fn test_net_parsing() -> Result<()> {
|
||||||
// mac address is random
|
// mac address is random
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef")?,
|
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef")?,
|
||||||
NetConfig {
|
net_fixture(),
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
|
||||||
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,id=mynet0")?,
|
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,id=mynet0")?,
|
||||||
NetConfig {
|
NetConfig {
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
|
||||||
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
|
||||||
id: Some("mynet0".to_owned()),
|
id: Some("mynet0".to_owned()),
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2914,12 +2944,10 @@ mod tests {
|
|||||||
"mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,tap=tap0,ip=192.168.100.1,mask=255.255.255.128"
|
"mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,tap=tap0,ip=192.168.100.1,mask=255.255.255.128"
|
||||||
)?,
|
)?,
|
||||||
NetConfig {
|
NetConfig {
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
|
||||||
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
|
||||||
tap: Some("tap0".to_owned()),
|
tap: Some("tap0".to_owned()),
|
||||||
ip: "192.168.100.1".parse().unwrap(),
|
ip: "192.168.100.1".parse().unwrap(),
|
||||||
mask: "255.255.255.128".parse().unwrap(),
|
mask: "255.255.255.128".parse().unwrap(),
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2928,33 +2956,29 @@ mod tests {
|
|||||||
"mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,vhost_user=true,socket=/tmp/sock"
|
"mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,vhost_user=true,socket=/tmp/sock"
|
||||||
)?,
|
)?,
|
||||||
NetConfig {
|
NetConfig {
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
|
||||||
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
vhost_socket: Some("/tmp/sock".to_owned()),
|
vhost_socket: Some("/tmp/sock".to_owned()),
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,num_queues=4,queue_size=1024,iommu=on")?,
|
NetConfig::parse("mac=de:ad:be:ef:12:34,host_mac=12:34:de:ad:be:ef,num_queues=4,queue_size=1024,iommu=on")?,
|
||||||
NetConfig {
|
NetConfig {
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
|
||||||
host_mac: Some(MacAddr::parse_str("12:34:de:ad:be:ef").unwrap()),
|
|
||||||
num_queues: 4,
|
num_queues: 4,
|
||||||
queue_size: 1024,
|
queue_size: 1024,
|
||||||
iommu: true,
|
iommu: true,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
NetConfig::parse("mac=de:ad:be:ef:12:34,fd=[3,7],num_queues=4")?,
|
NetConfig::parse("mac=de:ad:be:ef:12:34,fd=[3,7],num_queues=4")?,
|
||||||
NetConfig {
|
NetConfig {
|
||||||
mac: MacAddr::parse_str("de:ad:be:ef:12:34").unwrap(),
|
host_mac: None,
|
||||||
fds: Some(vec![3, 7]),
|
fds: Some(vec![3, 7]),
|
||||||
num_queues: 4,
|
num_queues: 4,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2988,34 +3012,47 @@ mod tests {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fs_fixture() -> FsConfig {
|
||||||
|
FsConfig {
|
||||||
|
socket: PathBuf::from("/tmp/sock"),
|
||||||
|
tag: "mytag".to_owned(),
|
||||||
|
num_queues: 1,
|
||||||
|
queue_size: 1024,
|
||||||
|
id: None,
|
||||||
|
pci_segment: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_fs() -> Result<()> {
|
fn test_parse_fs() -> Result<()> {
|
||||||
// "tag" and "socket" must be supplied
|
// "tag" and "socket" must be supplied
|
||||||
assert!(FsConfig::parse("").is_err());
|
assert!(FsConfig::parse("").is_err());
|
||||||
assert!(FsConfig::parse("tag=mytag").is_err());
|
assert!(FsConfig::parse("tag=mytag").is_err());
|
||||||
assert!(FsConfig::parse("socket=/tmp/sock").is_err());
|
assert!(FsConfig::parse("socket=/tmp/sock").is_err());
|
||||||
assert_eq!(
|
assert_eq!(FsConfig::parse("tag=mytag,socket=/tmp/sock")?, fs_fixture());
|
||||||
FsConfig::parse("tag=mytag,socket=/tmp/sock")?,
|
|
||||||
FsConfig {
|
|
||||||
socket: PathBuf::from("/tmp/sock"),
|
|
||||||
tag: "mytag".to_owned(),
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
FsConfig::parse("tag=mytag,socket=/tmp/sock,num_queues=4,queue_size=1024")?,
|
FsConfig::parse("tag=mytag,socket=/tmp/sock,num_queues=4,queue_size=1024")?,
|
||||||
FsConfig {
|
FsConfig {
|
||||||
socket: PathBuf::from("/tmp/sock"),
|
|
||||||
tag: "mytag".to_owned(),
|
|
||||||
num_queues: 4,
|
num_queues: 4,
|
||||||
queue_size: 1024,
|
queue_size: 1024,
|
||||||
..Default::default()
|
..fs_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pmem_fixture() -> PmemConfig {
|
||||||
|
PmemConfig {
|
||||||
|
file: PathBuf::from("/tmp/pmem"),
|
||||||
|
size: Some(128 << 20),
|
||||||
|
iommu: false,
|
||||||
|
discard_writes: false,
|
||||||
|
id: None,
|
||||||
|
pci_segment: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_pmem_parsing() -> Result<()> {
|
fn test_pmem_parsing() -> Result<()> {
|
||||||
// Must always give a file and size
|
// Must always give a file and size
|
||||||
@ -3023,29 +3060,21 @@ mod tests {
|
|||||||
assert!(PmemConfig::parse("size=128M").is_err());
|
assert!(PmemConfig::parse("size=128M").is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
PmemConfig::parse("file=/tmp/pmem,size=128M")?,
|
PmemConfig::parse("file=/tmp/pmem,size=128M")?,
|
||||||
PmemConfig {
|
pmem_fixture()
|
||||||
file: PathBuf::from("/tmp/pmem"),
|
|
||||||
size: Some(128 << 20),
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
PmemConfig::parse("file=/tmp/pmem,size=128M,id=mypmem0")?,
|
PmemConfig::parse("file=/tmp/pmem,size=128M,id=mypmem0")?,
|
||||||
PmemConfig {
|
PmemConfig {
|
||||||
file: PathBuf::from("/tmp/pmem"),
|
|
||||||
size: Some(128 << 20),
|
|
||||||
id: Some("mypmem0".to_owned()),
|
id: Some("mypmem0".to_owned()),
|
||||||
..Default::default()
|
..pmem_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
PmemConfig::parse("file=/tmp/pmem,size=128M,iommu=on,discard_writes=on")?,
|
PmemConfig::parse("file=/tmp/pmem,size=128M,iommu=on,discard_writes=on")?,
|
||||||
PmemConfig {
|
PmemConfig {
|
||||||
file: PathBuf::from("/tmp/pmem"),
|
|
||||||
size: Some(128 << 20),
|
|
||||||
discard_writes: true,
|
discard_writes: true,
|
||||||
iommu: true,
|
iommu: true,
|
||||||
..Default::default()
|
..pmem_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -3131,63 +3160,65 @@ mod tests {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn device_fixture() -> DeviceConfig {
|
||||||
|
DeviceConfig {
|
||||||
|
path: PathBuf::from("/path/to/device"),
|
||||||
|
id: None,
|
||||||
|
iommu: false,
|
||||||
|
pci_segment: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_device_parsing() -> Result<()> {
|
fn test_device_parsing() -> Result<()> {
|
||||||
// Device must have a path provided
|
// Device must have a path provided
|
||||||
assert!(DeviceConfig::parse("").is_err());
|
assert!(DeviceConfig::parse("").is_err());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DeviceConfig::parse("path=/path/to/device")?,
|
DeviceConfig::parse("path=/path/to/device")?,
|
||||||
DeviceConfig {
|
device_fixture()
|
||||||
path: PathBuf::from("/path/to/device"),
|
|
||||||
id: None,
|
|
||||||
iommu: false,
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DeviceConfig::parse("path=/path/to/device,iommu=on")?,
|
DeviceConfig::parse("path=/path/to/device,iommu=on")?,
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: PathBuf::from("/path/to/device"),
|
|
||||||
id: None,
|
|
||||||
iommu: true,
|
iommu: true,
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DeviceConfig::parse("path=/path/to/device,iommu=on,id=mydevice0")?,
|
DeviceConfig::parse("path=/path/to/device,iommu=on,id=mydevice0")?,
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: PathBuf::from("/path/to/device"),
|
|
||||||
id: Some("mydevice0".to_owned()),
|
id: Some("mydevice0".to_owned()),
|
||||||
iommu: true,
|
iommu: true,
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn vdpa_fixture() -> VdpaConfig {
|
||||||
|
VdpaConfig {
|
||||||
|
path: PathBuf::from("/dev/vhost-vdpa"),
|
||||||
|
num_queues: 1,
|
||||||
|
iommu: false,
|
||||||
|
id: None,
|
||||||
|
pci_segment: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vdpa_parsing() -> Result<()> {
|
fn test_vdpa_parsing() -> Result<()> {
|
||||||
// path is required
|
// path is required
|
||||||
assert!(VdpaConfig::parse("").is_err());
|
assert!(VdpaConfig::parse("").is_err());
|
||||||
assert_eq!(
|
assert_eq!(VdpaConfig::parse("path=/dev/vhost-vdpa")?, vdpa_fixture());
|
||||||
VdpaConfig::parse("path=/dev/vhost-vdpa")?,
|
|
||||||
VdpaConfig {
|
|
||||||
path: PathBuf::from("/dev/vhost-vdpa"),
|
|
||||||
num_queues: 1,
|
|
||||||
id: None,
|
|
||||||
..Default::default()
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
VdpaConfig::parse("path=/dev/vhost-vdpa,num_queues=2,id=my_vdpa")?,
|
VdpaConfig::parse("path=/dev/vhost-vdpa,num_queues=2,id=my_vdpa")?,
|
||||||
VdpaConfig {
|
VdpaConfig {
|
||||||
path: PathBuf::from("/dev/vhost-vdpa"),
|
|
||||||
num_queues: 2,
|
num_queues: 2,
|
||||||
id: Some("my_vdpa".to_owned()),
|
id: Some("my_vdpa".to_owned()),
|
||||||
..Default::default()
|
..vdpa_fixture()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -3217,7 +3248,7 @@ mod tests {
|
|||||||
socket: PathBuf::from("/tmp/sock"),
|
socket: PathBuf::from("/tmp/sock"),
|
||||||
iommu: false,
|
iommu: false,
|
||||||
id: None,
|
id: None,
|
||||||
..Default::default()
|
pci_segment: 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -3227,12 +3258,38 @@ mod tests {
|
|||||||
socket: PathBuf::from("/tmp/sock"),
|
socket: PathBuf::from("/tmp/sock"),
|
||||||
iommu: true,
|
iommu: true,
|
||||||
id: None,
|
id: None,
|
||||||
..Default::default()
|
pci_segment: 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn platform_fixture() -> PlatformConfig {
|
||||||
|
PlatformConfig {
|
||||||
|
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
||||||
|
iommu_segments: None,
|
||||||
|
serial_number: None,
|
||||||
|
uuid: None,
|
||||||
|
oem_strings: None,
|
||||||
|
#[cfg(feature = "tdx")]
|
||||||
|
tdx: false,
|
||||||
|
#[cfg(feature = "sev_snp")]
|
||||||
|
sev_snp: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn numa_fixture() -> NumaConfig {
|
||||||
|
NumaConfig {
|
||||||
|
guest_numa_id: 0,
|
||||||
|
cpus: None,
|
||||||
|
distances: None,
|
||||||
|
memory_zones: None,
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
sgx_epc_sections: None,
|
||||||
|
pci_segments: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_config_validation() {
|
fn test_config_validation() {
|
||||||
let mut valid_config = VmConfig {
|
let mut valid_config = VmConfig {
|
||||||
@ -3256,7 +3313,11 @@ mod tests {
|
|||||||
},
|
},
|
||||||
payload: Some(PayloadConfig {
|
payload: Some(PayloadConfig {
|
||||||
kernel: Some(PathBuf::from("/path/to/kernel")),
|
kernel: Some(PathBuf::from("/path/to/kernel")),
|
||||||
..Default::default()
|
firmware: None,
|
||||||
|
cmdline: None,
|
||||||
|
initramfs: None,
|
||||||
|
#[cfg(feature = "igvm")]
|
||||||
|
igvm: None,
|
||||||
}),
|
}),
|
||||||
rate_limit_groups: None,
|
rate_limit_groups: None,
|
||||||
disks: None,
|
disks: None,
|
||||||
@ -3345,7 +3406,7 @@ mod tests {
|
|||||||
invalid_config.disks = Some(vec![DiskConfig {
|
invalid_config.disks = Some(vec![DiskConfig {
|
||||||
vhost_socket: Some("/path/to/sock".to_owned()),
|
vhost_socket: Some("/path/to/sock".to_owned()),
|
||||||
path: Some(PathBuf::from("/path/to/image")),
|
path: Some(PathBuf::from("/path/to/image")),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3355,8 +3416,9 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.memory.shared = true;
|
invalid_config.memory.shared = true;
|
||||||
invalid_config.disks = Some(vec![DiskConfig {
|
invalid_config.disks = Some(vec![DiskConfig {
|
||||||
|
path: None,
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3365,9 +3427,10 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.disks = Some(vec![DiskConfig {
|
invalid_config.disks = Some(vec![DiskConfig {
|
||||||
|
path: None,
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
vhost_socket: Some("/path/to/sock".to_owned()),
|
vhost_socket: Some("/path/to/sock".to_owned()),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3376,9 +3439,10 @@ mod tests {
|
|||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.disks = Some(vec![DiskConfig {
|
still_valid_config.disks = Some(vec![DiskConfig {
|
||||||
|
path: None,
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
vhost_socket: Some("/path/to/sock".to_owned()),
|
vhost_socket: Some("/path/to/sock".to_owned()),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
still_valid_config.memory.shared = true;
|
still_valid_config.memory.shared = true;
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
@ -3386,7 +3450,7 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.net = Some(vec![NetConfig {
|
invalid_config.net = Some(vec![NetConfig {
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3397,7 +3461,7 @@ mod tests {
|
|||||||
still_valid_config.net = Some(vec![NetConfig {
|
still_valid_config.net = Some(vec![NetConfig {
|
||||||
vhost_user: true,
|
vhost_user: true,
|
||||||
vhost_socket: Some("/path/to/sock".to_owned()),
|
vhost_socket: Some("/path/to/sock".to_owned()),
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
still_valid_config.memory.shared = true;
|
still_valid_config.memory.shared = true;
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
@ -3405,7 +3469,7 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.net = Some(vec![NetConfig {
|
invalid_config.net = Some(vec![NetConfig {
|
||||||
fds: Some(vec![0]),
|
fds: Some(vec![0]),
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3415,7 +3479,7 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.net = Some(vec![NetConfig {
|
invalid_config.net = Some(vec![NetConfig {
|
||||||
offload_csum: false,
|
offload_csum: false,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3423,9 +3487,7 @@ mod tests {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.fs = Some(vec![FsConfig {
|
invalid_config.fs = Some(vec![fs_fixture()]);
|
||||||
..Default::default()
|
|
||||||
}]);
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
Err(ValidationError::VhostUserRequiresSharedMemory)
|
Err(ValidationError::VhostUserRequiresSharedMemory)
|
||||||
@ -3461,16 +3523,13 @@ mod tests {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(platform_fixture());
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS + 1,
|
num_pci_segments: MAX_NUM_PCI_SEGMENTS + 1,
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3481,17 +3540,15 @@ mod tests {
|
|||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![MAX_NUM_PCI_SEGMENTS + 1, MAX_NUM_PCI_SEGMENTS + 2]),
|
iommu_segments: Some(vec![MAX_NUM_PCI_SEGMENTS + 1, MAX_NUM_PCI_SEGMENTS + 2]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3500,61 +3557,56 @@ mod tests {
|
|||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
still_valid_config.disks = Some(vec![DiskConfig {
|
still_valid_config.disks = Some(vec![DiskConfig {
|
||||||
iommu: true,
|
iommu: true,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
still_valid_config.net = Some(vec![NetConfig {
|
still_valid_config.net = Some(vec![NetConfig {
|
||||||
iommu: true,
|
iommu: true,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
still_valid_config.pmem = Some(vec![PmemConfig {
|
still_valid_config.pmem = Some(vec![PmemConfig {
|
||||||
iommu: true,
|
iommu: true,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..pmem_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
still_valid_config.devices = Some(vec![DeviceConfig {
|
still_valid_config.devices = Some(vec![DeviceConfig {
|
||||||
iommu: true,
|
iommu: true,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
|
|
||||||
let mut still_valid_config = valid_config.clone();
|
let mut still_valid_config = valid_config.clone();
|
||||||
still_valid_config.platform = Some(PlatformConfig {
|
still_valid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
still_valid_config.vsock = Some(VsockConfig {
|
still_valid_config.vsock = Some(VsockConfig {
|
||||||
cid: 3,
|
cid: 3,
|
||||||
@ -3567,14 +3619,13 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.disks = Some(vec![DiskConfig {
|
invalid_config.disks = Some(vec![DiskConfig {
|
||||||
iommu: false,
|
iommu: false,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3583,14 +3634,13 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.net = Some(vec![NetConfig {
|
invalid_config.net = Some(vec![NetConfig {
|
||||||
iommu: false,
|
iommu: false,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..net_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3601,12 +3651,12 @@ mod tests {
|
|||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.pmem = Some(vec![PmemConfig {
|
invalid_config.pmem = Some(vec![PmemConfig {
|
||||||
iommu: false,
|
iommu: false,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..pmem_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3617,12 +3667,12 @@ mod tests {
|
|||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.devices = Some(vec![DeviceConfig {
|
invalid_config.devices = Some(vec![DeviceConfig {
|
||||||
iommu: false,
|
iommu: false,
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3631,9 +3681,8 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.vsock = Some(VsockConfig {
|
invalid_config.vsock = Some(VsockConfig {
|
||||||
cid: 3,
|
cid: 3,
|
||||||
@ -3650,13 +3699,13 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.memory.shared = true;
|
invalid_config.memory.shared = true;
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.user_devices = Some(vec![UserDeviceConfig {
|
invalid_config.user_devices = Some(vec![UserDeviceConfig {
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
socket: PathBuf::new(),
|
||||||
|
id: None,
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3665,13 +3714,12 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.vdpa = Some(vec![VdpaConfig {
|
invalid_config.vdpa = Some(vec![VdpaConfig {
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..vdpa_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3681,13 +3729,12 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.memory.shared = true;
|
invalid_config.memory.shared = true;
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: MAX_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: Some(vec![1, 2, 3]),
|
iommu_segments: Some(vec![1, 2, 3]),
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.fs = Some(vec![FsConfig {
|
invalid_config.fs = Some(vec![FsConfig {
|
||||||
pci_segment: 1,
|
pci_segment: 1,
|
||||||
..Default::default()
|
..fs_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3697,18 +3744,18 @@ mod tests {
|
|||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.platform = Some(PlatformConfig {
|
invalid_config.platform = Some(PlatformConfig {
|
||||||
num_pci_segments: 2,
|
num_pci_segments: 2,
|
||||||
..Default::default()
|
..platform_fixture()
|
||||||
});
|
});
|
||||||
invalid_config.numa = Some(vec![
|
invalid_config.numa = Some(vec![
|
||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 0,
|
guest_numa_id: 0,
|
||||||
pci_segments: Some(vec![1]),
|
pci_segments: Some(vec![1]),
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 1,
|
guest_numa_id: 1,
|
||||||
pci_segments: Some(vec![1]),
|
pci_segments: Some(vec![1]),
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -3720,12 +3767,12 @@ mod tests {
|
|||||||
invalid_config.numa = Some(vec![
|
invalid_config.numa = Some(vec![
|
||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 0,
|
guest_numa_id: 0,
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 1,
|
guest_numa_id: 1,
|
||||||
pci_segments: Some(vec![0]),
|
pci_segments: Some(vec![0]),
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -3738,12 +3785,12 @@ mod tests {
|
|||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 0,
|
guest_numa_id: 0,
|
||||||
pci_segments: Some(vec![0]),
|
pci_segments: Some(vec![0]),
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
NumaConfig {
|
NumaConfig {
|
||||||
guest_numa_id: 1,
|
guest_numa_id: 1,
|
||||||
pci_segments: Some(vec![1]),
|
pci_segments: Some(vec![1]),
|
||||||
..Default::default()
|
..numa_fixture()
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -3753,9 +3800,8 @@ mod tests {
|
|||||||
|
|
||||||
let mut invalid_config = valid_config.clone();
|
let mut invalid_config = valid_config.clone();
|
||||||
invalid_config.disks = Some(vec![DiskConfig {
|
invalid_config.disks = Some(vec![DiskConfig {
|
||||||
path: Some(PathBuf::from("/path/to/image")),
|
|
||||||
rate_limit_group: Some("foo".into()),
|
rate_limit_group: Some("foo".into()),
|
||||||
..Default::default()
|
..disk_fixture()
|
||||||
}]);
|
}]);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
invalid_config.validate(),
|
invalid_config.validate(),
|
||||||
@ -3766,11 +3812,11 @@ mod tests {
|
|||||||
still_valid_config.devices = Some(vec![
|
still_valid_config.devices = Some(vec![
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: "/device1".into(),
|
path: "/device1".into(),
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
},
|
},
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: "/device2".into(),
|
path: "/device2".into(),
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
assert!(still_valid_config.validate().is_ok());
|
assert!(still_valid_config.validate().is_ok());
|
||||||
@ -3779,11 +3825,11 @@ mod tests {
|
|||||||
invalid_config.devices = Some(vec![
|
invalid_config.devices = Some(vec![
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: "/device1".into(),
|
path: "/device1".into(),
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
},
|
},
|
||||||
DeviceConfig {
|
DeviceConfig {
|
||||||
path: "/device1".into(),
|
path: "/device1".into(),
|
||||||
..Default::default()
|
..device_fixture()
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
assert!(invalid_config.validate().is_err());
|
assert!(invalid_config.validate().is_err());
|
||||||
|
@ -2066,7 +2066,11 @@ mod unit_tests {
|
|||||||
},
|
},
|
||||||
payload: Some(PayloadConfig {
|
payload: Some(PayloadConfig {
|
||||||
kernel: Some(PathBuf::from("/path/to/kernel")),
|
kernel: Some(PathBuf::from("/path/to/kernel")),
|
||||||
..Default::default()
|
firmware: None,
|
||||||
|
cmdline: None,
|
||||||
|
initramfs: None,
|
||||||
|
#[cfg(feature = "igvm")]
|
||||||
|
igvm: None,
|
||||||
}),
|
}),
|
||||||
rate_limit_groups: None,
|
rate_limit_groups: None,
|
||||||
disks: None,
|
disks: None,
|
||||||
|
@ -94,22 +94,6 @@ pub struct PlatformConfig {
|
|||||||
pub sev_snp: bool,
|
pub sev_snp: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for PlatformConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
PlatformConfig {
|
|
||||||
num_pci_segments: DEFAULT_NUM_PCI_SEGMENTS,
|
|
||||||
iommu_segments: None,
|
|
||||||
serial_number: None,
|
|
||||||
uuid: None,
|
|
||||||
oem_strings: None,
|
|
||||||
#[cfg(feature = "tdx")]
|
|
||||||
tdx: false,
|
|
||||||
#[cfg(feature = "sev_snp")]
|
|
||||||
sev_snp: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct MemoryZoneConfig {
|
pub struct MemoryZoneConfig {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
@ -203,15 +187,6 @@ pub struct RateLimiterGroupConfig {
|
|||||||
pub rate_limiter_config: RateLimiterConfig,
|
pub rate_limiter_config: RateLimiterConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for RateLimiterGroupConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
RateLimiterGroupConfig {
|
|
||||||
id: "".to_string(),
|
|
||||||
rate_limiter_config: RateLimiterConfig::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct DiskConfig {
|
pub struct DiskConfig {
|
||||||
pub path: Option<PathBuf>,
|
pub path: Option<PathBuf>,
|
||||||
@ -258,28 +233,6 @@ pub fn default_diskconfig_queue_size() -> u16 {
|
|||||||
DEFAULT_DISK_QUEUE_SIZE
|
DEFAULT_DISK_QUEUE_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for DiskConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
path: None,
|
|
||||||
readonly: false,
|
|
||||||
direct: false,
|
|
||||||
iommu: false,
|
|
||||||
num_queues: default_diskconfig_num_queues(),
|
|
||||||
queue_size: default_diskconfig_queue_size(),
|
|
||||||
vhost_user: false,
|
|
||||||
vhost_socket: None,
|
|
||||||
id: None,
|
|
||||||
disable_io_uring: false,
|
|
||||||
disable_aio: false,
|
|
||||||
rate_limit_group: None,
|
|
||||||
rate_limiter_config: None,
|
|
||||||
pci_segment: 0,
|
|
||||||
serial: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct NetConfig {
|
pub struct NetConfig {
|
||||||
#[serde(default = "default_netconfig_tap")]
|
#[serde(default = "default_netconfig_tap")]
|
||||||
@ -353,32 +306,6 @@ pub fn default_netconfig_queue_size() -> u16 {
|
|||||||
DEFAULT_NET_QUEUE_SIZE
|
DEFAULT_NET_QUEUE_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for NetConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
tap: default_netconfig_tap(),
|
|
||||||
ip: default_netconfig_ip(),
|
|
||||||
mask: default_netconfig_mask(),
|
|
||||||
mac: default_netconfig_mac(),
|
|
||||||
host_mac: None,
|
|
||||||
mtu: None,
|
|
||||||
iommu: false,
|
|
||||||
num_queues: default_netconfig_num_queues(),
|
|
||||||
queue_size: default_netconfig_queue_size(),
|
|
||||||
vhost_user: false,
|
|
||||||
vhost_socket: None,
|
|
||||||
vhost_mode: VhostMode::Client,
|
|
||||||
id: None,
|
|
||||||
fds: None,
|
|
||||||
rate_limiter_config: None,
|
|
||||||
pci_segment: 0,
|
|
||||||
offload_tso: true,
|
|
||||||
offload_ufo: true,
|
|
||||||
offload_csum: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct RngConfig {
|
pub struct RngConfig {
|
||||||
pub src: PathBuf,
|
pub src: PathBuf,
|
||||||
@ -430,20 +357,7 @@ pub fn default_fsconfig_queue_size() -> u16 {
|
|||||||
1024
|
1024
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for FsConfig {
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
tag: "".to_owned(),
|
|
||||||
socket: PathBuf::new(),
|
|
||||||
num_queues: default_fsconfig_num_queues(),
|
|
||||||
queue_size: default_fsconfig_queue_size(),
|
|
||||||
id: None,
|
|
||||||
pci_segment: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
|
||||||
pub struct PmemConfig {
|
pub struct PmemConfig {
|
||||||
pub file: PathBuf,
|
pub file: PathBuf,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -482,7 +396,7 @@ pub fn default_consoleconfig_file() -> Option<PathBuf> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct DeviceConfig {
|
pub struct DeviceConfig {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -493,7 +407,7 @@ pub struct DeviceConfig {
|
|||||||
pub pci_segment: u16,
|
pub pci_segment: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct UserDeviceConfig {
|
pub struct UserDeviceConfig {
|
||||||
pub socket: PathBuf,
|
pub socket: PathBuf,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -502,7 +416,7 @@ pub struct UserDeviceConfig {
|
|||||||
pub pci_segment: u16,
|
pub pci_segment: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct VdpaConfig {
|
pub struct VdpaConfig {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
#[serde(default = "default_vdpaconfig_num_queues")]
|
#[serde(default = "default_vdpaconfig_num_queues")]
|
||||||
@ -519,7 +433,7 @@ pub fn default_vdpaconfig_num_queues() -> usize {
|
|||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct VsockConfig {
|
pub struct VsockConfig {
|
||||||
pub cid: u32,
|
pub cid: u32,
|
||||||
pub socket: PathBuf,
|
pub socket: PathBuf,
|
||||||
@ -532,7 +446,7 @@ pub struct VsockConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct SgxEpcConfig {
|
pub struct SgxEpcConfig {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -541,7 +455,7 @@ pub struct SgxEpcConfig {
|
|||||||
pub prefault: bool,
|
pub prefault: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct NumaDistance {
|
pub struct NumaDistance {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub destination: u32,
|
pub destination: u32,
|
||||||
@ -549,7 +463,7 @@ pub struct NumaDistance {
|
|||||||
pub distance: u8,
|
pub distance: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
|
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub struct NumaConfig {
|
pub struct NumaConfig {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub guest_numa_id: u32,
|
pub guest_numa_id: u32,
|
||||||
@ -566,7 +480,7 @@ pub struct NumaConfig {
|
|||||||
pub pci_segments: Option<Vec<u16>>,
|
pub pci_segments: Option<Vec<u16>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
|
||||||
pub struct PayloadConfig {
|
pub struct PayloadConfig {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub firmware: Option<PathBuf>,
|
pub firmware: Option<PathBuf>,
|
||||||
|
Loading…
Reference in New Issue
Block a user