summary refs log tree commit diff
path: root/host/start-vm
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-04-09 12:36:01 +0000
committerAlyssa Ross <hi@alyssa.is>2023-04-09 12:36:01 +0000
commit9df699b6f706366ad208ce925a74671ac508bee2 (patch)
treeec1b66468cd29ccdc73e7bc8d7030e74fff1c692 /host/start-vm
parent06f46c4f1d27fa712434bc70c2a8c5201f285579 (diff)
downloadspectrum-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.rs18
-rw-r--r--host/start-vm/tests/helper.rs6
-rw-r--r--host/start-vm/tests/meson.build2
-rw-r--r--host/start-vm/tests/vm_command-multiple-disks.rs40
-rw-r--r--host/start-vm/tests/vm_command-shared-dir.rs28
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(())
 }