diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-04-09 12:36:01 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-04-09 12:36:01 +0000 |
commit | 9df699b6f706366ad208ce925a74671ac508bee2 (patch) | |
tree | ec1b66468cd29ccdc73e7bc8d7030e74fff1c692 /host/start-vm | |
parent | 06f46c4f1d27fa712434bc70c2a8c5201f285579 (diff) | |
download | spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar.gz spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar.bz2 spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar.lz spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar.xz spectrum-9df699b6f706366ad208ce925a74671ac508bee2.tar.zst spectrum-9df699b6f706366ad208ce925a74671ac508bee2.zip |
lib/nixpkgs.default.nix: update
cloud-hypervisor has changed the CLI, so we have to update every place we invoke it. Signed-off-by: Alyssa Ross <hi@alyssa.is>
Diffstat (limited to 'host/start-vm')
-rw-r--r-- | host/start-vm/lib.rs | 18 | ||||
-rw-r--r-- | host/start-vm/tests/helper.rs | 6 | ||||
-rw-r--r-- | host/start-vm/tests/meson.build | 2 | ||||
-rw-r--r-- | host/start-vm/tests/vm_command-multiple-disks.rs | 40 | ||||
-rw-r--r-- | host/start-vm/tests/vm_command-shared-dir.rs | 28 |
5 files changed, 65 insertions, 29 deletions
diff --git a/host/start-vm/lib.rs b/host/start-vm/lib.rs index 3959566..826163e 100644 --- a/host/start-vm/lib.rs +++ b/host/start-vm/lib.rs @@ -81,8 +81,6 @@ pub fn vm_command(dir: PathBuf, config_root: &Path) -> Result<Command, String> { Err(e) => return Err(format!("reading directory {:?}: {}", net_providers_dir, e)), } - command.arg("--disk"); - let blk_dir = config_dir.join("blk"); match blk_dir.read_dir() { Ok(entries) => { @@ -102,23 +100,15 @@ pub fn vm_command(dir: PathBuf, config_root: &Path) -> Result<Command, String> { let mut arg = OsString::from("path="); arg.push(entry); arg.push(",readonly=on"); - command.arg(arg); + command.arg("--disk").arg(arg); } } Err(e) => return Err(format!("reading directory {:?}: {}", blk_dir, e)), } - if command.get_args().last() == Some(OsStr::new("--disk")) { - return Err("no block devices specified".to_string()); - } - let shared_dirs_dir = config_dir.join("shared-dirs"); - match shared_dirs_dir.read_dir().map(Iterator::peekable) { - Ok(mut entries) => { - if entries.peek().is_some() { - command.arg("--fs"); - } - + match shared_dirs_dir.read_dir() { + Ok(entries) => { for result in entries { let entry = result .map_err(|e| format!("examining directory entry: {}", e))? @@ -131,7 +121,7 @@ pub fn vm_command(dir: PathBuf, config_root: &Path) -> Result<Command, String> { arg.push("-fs-"); arg.push(&entry); arg.push("/env/virtiofsd.sock"); - command.arg(arg); + command.arg("--fs").arg(arg); } } Err(e) if e.kind() == ErrorKind::NotFound => {} diff --git a/host/start-vm/tests/helper.rs b/host/start-vm/tests/helper.rs index 8cb8572..c2d2827 100644 --- a/host/start-vm/tests/helper.rs +++ b/host/start-vm/tests/helper.rs @@ -10,6 +10,12 @@ use std::path::{Path, PathBuf}; use start_vm::prog_name; +pub fn contains_seq<H: PartialEq<N>, N>(haystack: &[H], needle: &[N]) -> bool { + let start_indexes = 0..=(haystack.len() - needle.len()); + let mut candidates = start_indexes.map(|i| &haystack[i..][..needle.len()]); + candidates.any(|c| c == needle) +} + extern "C" { fn mkdtemp(template: *mut c_char) -> *mut c_char; } diff --git a/host/start-vm/tests/meson.build b/host/start-vm/tests/meson.build index 857414b..9d652ff 100644 --- a/host/start-vm/tests/meson.build +++ b/host/start-vm/tests/meson.build @@ -31,5 +31,7 @@ test('tap_open (name too long)', executable('tap_open-name-too-long', test('vm_command-basic', executable('vm_command-basic', 'vm_command-basic.rs', link_with : [rust_lib, rust_helper])) +test('vm_command-multiple-disks', executable('vm_command-multiple-disks', + 'vm_command-multiple-disks.rs', link_with : [rust_lib, rust_helper])) test('vm_command-shared-dir', executable('vm_command-shared-dir', 'vm_command-shared-dir.rs', link_with : [rust_lib, rust_helper])) diff --git a/host/start-vm/tests/vm_command-multiple-disks.rs b/host/start-vm/tests/vm_command-multiple-disks.rs new file mode 100644 index 0000000..2aaf6f3 --- /dev/null +++ b/host/start-vm/tests/vm_command-multiple-disks.rs @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: EUPL-1.2+ +// SPDX-FileCopyrightText: 2022-2023 Alyssa Ross <hi@alyssa.is> + +use std::ffi::{OsStr, OsString}; +use std::fs::{create_dir, create_dir_all, File}; +use std::os::unix::fs::symlink; + +use start_vm::vm_command; +use test_helper::{contains_seq, TempDir}; + +fn main() -> std::io::Result<()> { + let tmp_dir = TempDir::new()?; + + let service_dir = tmp_dir.path().join("testvm"); + let vm_config = tmp_dir.path().join("svc/data/testvm"); + + create_dir(&service_dir)?; + create_dir_all(&vm_config)?; + File::create(vm_config.join("vmlinux"))?; + create_dir(vm_config.join("blk"))?; + symlink("/dev/null", vm_config.join("blk/disk1.img"))?; + symlink("/dev/null", vm_config.join("blk/disk2.img"))?; + + let command = vm_command(service_dir, &tmp_dir.path().join("svc/data")).unwrap(); + let args: Box<[_]> = command.get_args().collect(); + + for i in 1..=2 { + let image_path = tmp_dir + .path() + .join(format!("svc/data/testvm/blk/disk{i}.img")); + let mut expected_disk_arg = OsString::from("path="); + expected_disk_arg.push(image_path); + expected_disk_arg.push(",readonly=on"); + + let expected_args = [OsStr::new("--disk"), &expected_disk_arg]; + assert!(contains_seq(&args, &expected_args)); + } + + Ok(()) +} diff --git a/host/start-vm/tests/vm_command-shared-dir.rs b/host/start-vm/tests/vm_command-shared-dir.rs index 2b13663..af17a7f 100644 --- a/host/start-vm/tests/vm_command-shared-dir.rs +++ b/host/start-vm/tests/vm_command-shared-dir.rs @@ -1,17 +1,11 @@ // SPDX-License-Identifier: EUPL-1.2+ -// SPDX-FileCopyrightText: 2022 Alyssa Ross <hi@alyssa.is> +// SPDX-FileCopyrightText: 2022-2023 Alyssa Ross <hi@alyssa.is> use std::fs::{create_dir, create_dir_all, File}; use std::os::unix::fs::symlink; use start_vm::vm_command; -use test_helper::TempDir; - -fn contains_seq<H: PartialEq<N>, N>(haystack: &[H], needle: &[N]) -> bool { - let start_indexes = 0..=(haystack.len() - needle.len()); - let mut candidates = start_indexes.map(|i| &haystack[i..][..needle.len()]); - candidates.any(|c| c == needle) -} +use test_helper::{contains_seq, TempDir}; fn main() -> std::io::Result<()> { let tmp_dir = TempDir::new()?; @@ -26,16 +20,20 @@ fn main() -> std::io::Result<()> { symlink("/dev/null", vm_config.join("blk/root.img"))?; create_dir(vm_config.join("shared-dirs"))?; - create_dir(vm_config.join("shared-dirs/root"))?; - symlink("/", vm_config.join("shared-dirs/root/dir"))?; - let expected_args = [ - "--fs", - "tag=root,socket=../testvm-fs-root/env/virtiofsd.sock", - ]; + create_dir(vm_config.join("shared-dirs/dir1"))?; + symlink("/", vm_config.join("shared-dirs/dir1/dir"))?; + + create_dir(vm_config.join("shared-dirs/dir2"))?; + symlink("/", vm_config.join("shared-dirs/dir2/dir"))?; let command = vm_command(service_dir, &tmp_dir.path().join("svc/data")).unwrap(); let args: Box<[_]> = command.get_args().collect(); - assert!(contains_seq(&args, &expected_args)); + + for i in 1..=2 { + let expected_fs_arg = format!("tag=dir{i},socket=../testvm-fs-dir{i}/env/virtiofsd.sock"); + assert!(contains_seq(&args, &["--fs", &expected_fs_arg])); + } + Ok(()) } |