mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-29 20:24:31 +00:00
dragonball: add more unit test for virtio-blk device.
Added more unit tests for virtio-blk device. Fixes: #4899 Signed-off-by: wllenyj <wllenyj@linux.alibaba.com>
This commit is contained in:
parent
8ae14f6a55
commit
9a01d4e446
@ -776,3 +776,587 @@ impl Default for BlockDeviceMgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use test_utils::skip_if_not_root;
|
||||||
|
use vmm_sys_util::tempfile::TempFile;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use crate::test_utils::tests::create_vm_for_test;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_block_device_type() {
|
||||||
|
let dev_type = BlockDeviceType::get_type("spool:/device1");
|
||||||
|
assert_eq!(dev_type, BlockDeviceType::Spool);
|
||||||
|
let dev_type = BlockDeviceType::get_type("/device1");
|
||||||
|
assert_eq!(dev_type, BlockDeviceType::RawBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_create_block_devices_configs() {
|
||||||
|
let mgr = BlockDeviceMgr::default();
|
||||||
|
assert!(!mgr.has_root_block_device());
|
||||||
|
assert!(!mgr.has_part_uuid_root());
|
||||||
|
assert!(!mgr.is_read_only_root());
|
||||||
|
assert_eq!(mgr.get_index_of_drive_id(""), None);
|
||||||
|
assert_eq!(mgr.info_list.len(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_non_root_block_device() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file = TempFile::new().unwrap();
|
||||||
|
let dummy_path = dummy_file.as_path().to_owned();
|
||||||
|
let dummy_id = String::from("1");
|
||||||
|
let dummy_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path.clone(),
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: dummy_id.clone(),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
assert!(BlockDeviceMgr::insert_device(
|
||||||
|
vm.device_manager_mut(),
|
||||||
|
ctx,
|
||||||
|
dummy_block_device.clone(),
|
||||||
|
)
|
||||||
|
.is_ok());
|
||||||
|
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 1);
|
||||||
|
assert!(!vm.device_manager().block_manager.has_root_block_device());
|
||||||
|
assert!(!vm.device_manager().block_manager.has_part_uuid_root());
|
||||||
|
assert!(!vm.device_manager().block_manager.is_read_only_root());
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 1);
|
||||||
|
assert_eq!(
|
||||||
|
vm.device_manager().block_manager.info_list[0]
|
||||||
|
.config
|
||||||
|
.device_type(),
|
||||||
|
BlockDeviceType::RawBlock
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vm.device_manager().block_manager.info_list[0]
|
||||||
|
.config
|
||||||
|
.queue_sizes(),
|
||||||
|
[128u16]
|
||||||
|
);
|
||||||
|
|
||||||
|
let dev_config = vm.device_manager().block_manager.iter().next().unwrap();
|
||||||
|
assert_eq!(dev_config.config, dummy_block_device);
|
||||||
|
assert!(vm
|
||||||
|
.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_path(&dummy_path)
|
||||||
|
.is_some());
|
||||||
|
assert!(vm
|
||||||
|
.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_id(&dummy_id)
|
||||||
|
.is_some());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_blk_device_ratelimiters() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
//Init vm for test.
|
||||||
|
let mut vm = create_vm_for_test();
|
||||||
|
let device_op_ctx = DeviceOpContext::new(
|
||||||
|
Some(vm.epoll_manager().clone()),
|
||||||
|
vm.device_manager(),
|
||||||
|
Some(vm.vm_as().unwrap().clone()),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
let dummy_file = TempFile::new().unwrap();
|
||||||
|
let dummy_path = dummy_file.as_path().to_owned();
|
||||||
|
|
||||||
|
let dummy_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: true,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), device_op_ctx, dummy_block_device)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let cfg = BlockDeviceConfigUpdateInfo {
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut device_op_ctx = DeviceOpContext::new(
|
||||||
|
Some(vm.epoll_manager().clone()),
|
||||||
|
vm.device_manager(),
|
||||||
|
Some(vm.vm_as().unwrap().clone()),
|
||||||
|
None,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
|
vm.device_manager_mut()
|
||||||
|
.block_manager
|
||||||
|
.attach_devices(&mut device_op_ctx)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 1);
|
||||||
|
|
||||||
|
//Patch while the epoll handler is invalid.
|
||||||
|
let expected_error = "could not send patch message to the block epoll handler".to_string();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
BlockDeviceMgr::update_device_ratelimiters(vm.device_manager_mut(), cfg)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
expected_error
|
||||||
|
);
|
||||||
|
|
||||||
|
//Invalid drive id
|
||||||
|
let cfg2 = BlockDeviceConfigUpdateInfo {
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected_error = format!("invalid block device id '{0}'", cfg2.drive_id);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
BlockDeviceMgr::update_device_ratelimiters(vm.device_manager_mut(), cfg2)
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
expected_error
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_one_root_block_device() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file = TempFile::new().unwrap();
|
||||||
|
let dummy_path = dummy_file.as_path().to_owned();
|
||||||
|
let dummy_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: true,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
assert!(BlockDeviceMgr::insert_device(
|
||||||
|
vm.device_manager_mut(),
|
||||||
|
ctx,
|
||||||
|
dummy_block_device.clone(),
|
||||||
|
)
|
||||||
|
.is_ok());
|
||||||
|
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 1);
|
||||||
|
assert!(vm.device_manager().block_manager.has_root_block);
|
||||||
|
assert!(!vm.device_manager().block_manager.has_part_uuid_root);
|
||||||
|
assert!(vm.device_manager().block_manager.read_only_root);
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 1);
|
||||||
|
|
||||||
|
let dev_config = vm.device_manager().block_manager.iter().next().unwrap();
|
||||||
|
assert_eq!(dev_config.config, dummy_block_device);
|
||||||
|
assert!(vm.device_manager().block_manager.is_read_only_root());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_add_two_root_block_devices_configs() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file_1 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_1 = dummy_file_1.as_path().to_owned();
|
||||||
|
let root_block_device_1 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_1,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_2 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_2 = dummy_file_2.as_path().to_owned();
|
||||||
|
let root_block_device_2 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_2,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device_1).unwrap();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
assert!(
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device_2)
|
||||||
|
.is_err()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
// Test BlockDevicesConfigs::add when you first add the root device and then the other devices.
|
||||||
|
fn test_add_root_block_device_first() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file_1 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_1 = dummy_file_1.as_path().to_owned();
|
||||||
|
let root_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_1,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_2 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_2 = dummy_file_2.as_path().to_owned();
|
||||||
|
let dummy_block_device_2 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_2,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_3 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_3 = dummy_file_3.as_path().to_owned();
|
||||||
|
let dummy_block_device_3 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_3,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("3"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
vm.device_manager_mut()
|
||||||
|
.block_manager
|
||||||
|
.create(root_block_device.clone())
|
||||||
|
.unwrap();
|
||||||
|
vm.device_manager_mut()
|
||||||
|
.block_manager
|
||||||
|
.create(dummy_block_device_2.clone())
|
||||||
|
.unwrap();
|
||||||
|
vm.device_manager_mut()
|
||||||
|
.block_manager
|
||||||
|
.create(dummy_block_device_3.clone())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(vm.device_manager().block_manager.has_root_block_device(),);
|
||||||
|
assert!(!vm.device_manager().block_manager.has_part_uuid_root());
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 3);
|
||||||
|
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device).unwrap();
|
||||||
|
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_2).unwrap();
|
||||||
|
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_3).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
// Test BlockDevicesConfigs::add when you add other devices first and then the root device.
|
||||||
|
fn test_root_block_device_add_last() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file_1 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_1 = dummy_file_1.as_path().to_owned();
|
||||||
|
let root_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_1,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_2 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_2 = dummy_file_2.as_path().to_owned();
|
||||||
|
let dummy_block_device_2 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_2,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_3 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_3 = dummy_file_3.as_path().to_owned();
|
||||||
|
let dummy_block_device_3 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_3,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("3"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_2.clone())
|
||||||
|
.unwrap();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_3.clone())
|
||||||
|
.unwrap();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device.clone())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(vm.device_manager().block_manager.has_root_block_device(),);
|
||||||
|
assert!(!vm.device_manager().block_manager.has_part_uuid_root());
|
||||||
|
assert_eq!(vm.device_manager().block_manager.info_list.len(), 3);
|
||||||
|
|
||||||
|
let mut block_dev_iter = vm.device_manager().block_manager.iter();
|
||||||
|
// The root device should be first in the list no matter of the order in
|
||||||
|
// which the devices were added.
|
||||||
|
assert_eq!(
|
||||||
|
block_dev_iter.next().unwrap().config.drive_id,
|
||||||
|
root_block_device.drive_id
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
block_dev_iter.next().unwrap().config.drive_id,
|
||||||
|
dummy_block_device_2.drive_id
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
block_dev_iter.next().unwrap().config.drive_id,
|
||||||
|
dummy_block_device_3.drive_id
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_block_device_update() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let dummy_file_1 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_1 = dummy_file_1.as_path().to_owned();
|
||||||
|
let root_block_device = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_1.clone(),
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let dummy_file_2 = TempFile::new().unwrap();
|
||||||
|
let dummy_path_2 = dummy_file_2.as_path().to_owned();
|
||||||
|
let mut dummy_block_device_2 = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_2.clone(),
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
|
||||||
|
// Add 2 block devices.
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device).unwrap();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_2.clone())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Get index zero.
|
||||||
|
assert_eq!(
|
||||||
|
vm.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_id(&String::from("1"))
|
||||||
|
.unwrap(),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get None.
|
||||||
|
assert!(vm
|
||||||
|
.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_id(&String::from("foo"))
|
||||||
|
.is_none());
|
||||||
|
|
||||||
|
// Test several update cases using dummy_block_device_2.
|
||||||
|
// Validate `dummy_block_device_2` is already in the list
|
||||||
|
assert!(vm
|
||||||
|
.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_id(&dummy_block_device_2.drive_id)
|
||||||
|
.is_some());
|
||||||
|
// Update OK.
|
||||||
|
dummy_block_device_2.is_read_only = true;
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_2.clone())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let index = vm
|
||||||
|
.device_manager()
|
||||||
|
.block_manager
|
||||||
|
.get_index_of_drive_id(&dummy_block_device_2.drive_id)
|
||||||
|
.unwrap();
|
||||||
|
// Validate update was successful.
|
||||||
|
assert!(
|
||||||
|
vm.device_manager().block_manager.info_list[index]
|
||||||
|
.config
|
||||||
|
.is_read_only
|
||||||
|
);
|
||||||
|
|
||||||
|
// Update with invalid path.
|
||||||
|
let dummy_filename_3 = String::from("test_update_3");
|
||||||
|
let dummy_path_3 = PathBuf::from(dummy_filename_3);
|
||||||
|
dummy_block_device_2.path_on_host = dummy_path_3;
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
assert!(BlockDeviceMgr::insert_device(
|
||||||
|
vm.device_manager_mut(),
|
||||||
|
ctx,
|
||||||
|
dummy_block_device_2.clone(),
|
||||||
|
)
|
||||||
|
.is_err());
|
||||||
|
|
||||||
|
// Update with 2 root block devices.
|
||||||
|
dummy_block_device_2.path_on_host = dummy_path_2.clone();
|
||||||
|
dummy_block_device_2.is_root_device = true;
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
assert!(
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, dummy_block_device_2,)
|
||||||
|
.is_err(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Switch roots and add a PARTUUID for the new one.
|
||||||
|
let root_block_device_old = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_1,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: false,
|
||||||
|
part_uuid: None,
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("1"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
let root_block_device_new = BlockDeviceConfigInfo {
|
||||||
|
path_on_host: dummy_path_2,
|
||||||
|
device_type: BlockDeviceType::RawBlock,
|
||||||
|
is_root_device: true,
|
||||||
|
part_uuid: Some("0eaa91a0-01".to_string()),
|
||||||
|
is_read_only: false,
|
||||||
|
is_direct: false,
|
||||||
|
no_drop: false,
|
||||||
|
drive_id: String::from("2"),
|
||||||
|
rate_limiter: None,
|
||||||
|
num_queues: BlockDeviceConfigInfo::default_num_queues(),
|
||||||
|
queue_size: 128,
|
||||||
|
use_shared_irq: None,
|
||||||
|
use_generic_irq: None,
|
||||||
|
};
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device_old).unwrap();
|
||||||
|
let ctx = DeviceOpContext::create_boot_ctx(&vm, None);
|
||||||
|
BlockDeviceMgr::insert_device(vm.device_manager_mut(), ctx, root_block_device_new).unwrap();
|
||||||
|
assert!(vm.device_manager().block_manager.has_part_uuid_root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user