summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJoakim Hulthe <joakim@hulthe.net>2024-03-06 14:00:36 +0100
committerJoakim Hulthe <joakim@hulthe.net>2024-03-20 16:50:15 +0100
commit69d2c506d34cf944812ef65d695bb7c882e764ab (patch)
tree969d524d71ff5956af105d7cac034142ae66c9d0
parent611efc096c1aaf4105b840df0423eb7f0db5eb9c (diff)
downloadmullvadvpn-69d2c506d34cf944812ef65d695bb7c882e764ab.tar.xz
mullvadvpn-69d2c506d34cf944812ef65d695bb7c882e764ab.zip
Make OVMF paths configurable per VM
-rw-r--r--test/test-manager/src/config.rs10
-rw-r--r--test/test-manager/src/vm/qemu.rs34
2 files changed, 36 insertions, 8 deletions
diff --git a/test/test-manager/src/config.rs b/test/test-manager/src/config.rs
index 1605661d53..6921c0b33f 100644
--- a/test/test-manager/src/config.rs
+++ b/test/test-manager/src/config.rs
@@ -139,6 +139,16 @@ pub struct VmConfig {
#[serde(default)]
#[arg(long)]
pub tpm: bool,
+
+ /// Override the path to `OVMF_VARS.secboot.fd`. Requires `tpm`.
+ #[serde(default)]
+ #[arg(long, requires("tpm"))]
+ pub ovmf_vars_path: Option<String>,
+
+ /// Override the path to `OVMF_CODE.secboot.fd`. Requires `tpm`.
+ #[serde(default)]
+ #[arg(long, requires("tpm"))]
+ pub ovmf_code_path: Option<String>,
}
impl VmConfig {
diff --git a/test/test-manager/src/vm/qemu.rs b/test/test-manager/src/vm/qemu.rs
index 5688f47101..62613d5e1d 100644
--- a/test/test-manager/src/vm/qemu.rs
+++ b/test/test-manager/src/vm/qemu.rs
@@ -134,7 +134,7 @@ pub async fn run(config: &Config, vm_config: &VmConfig) -> Result<QemuInstance>
// Configure OVMF. Currently, this is enabled implicitly if using a TPM
let ovmf_handle = if vm_config.tpm {
- let handle = OvmfHandle::new().await?;
+ let handle = OvmfHandle::new(vm_config).await?;
handle.append_qemu_args(&mut qemu_cmd);
Some(handle)
} else {
@@ -202,32 +202,50 @@ pub async fn run(config: &Config, vm_config: &VmConfig) -> Result<QemuInstance>
/// Used to set up UEFI and append options to the QEMU command
struct OvmfHandle {
temp_vars: TempFile,
+ ovmf_code_path: String,
}
impl OvmfHandle {
- pub async fn new() -> Result<Self> {
- const OVMF_VARS_PATH: &str = "/usr/share/OVMF/OVMF_VARS.secboot.fd";
+ pub async fn new(config: &VmConfig) -> Result<Self> {
+ const DEFAULT_OVMF_VARS_PATH: &str = "/usr/share/OVMF/OVMF_VARS.secboot.fd";
+ const DEFAULT_OVMF_CODE_PATH: &str = "/usr/share/OVMF/OVMF_CODE.secboot.fd";
+
+ let ovmf_code_path = config
+ .ovmf_code_path
+ .as_deref()
+ .unwrap_or(DEFAULT_OVMF_CODE_PATH)
+ .to_owned();
+
+ let ovmf_vars_path = config
+ .ovmf_vars_path
+ .as_deref()
+ .unwrap_or(DEFAULT_OVMF_VARS_PATH);
// Create a local copy of OVMF_VARS
let temp_vars_path = random_tempfile_name();
- fs::copy(OVMF_VARS_PATH, &temp_vars_path)
+ fs::copy(ovmf_vars_path, &temp_vars_path)
.await
.map_err(Error::CopyOvmfVars)?;
let temp_vars = TempFile::from_existing(temp_vars_path, async_tempfile::Ownership::Owned)
.await
.map_err(|_| Error::WrapOvmfVars)?;
- Ok(OvmfHandle { temp_vars })
+
+ Ok(OvmfHandle {
+ temp_vars,
+ ovmf_code_path,
+ })
}
pub fn append_qemu_args(&self, qemu_cmd: &mut Command) {
- const OVMF_CODE_PATH: &str = "/usr/share/OVMF/OVMF_CODE.secboot.fd";
-
qemu_cmd.args([
"-global",
"driver=cfi.pflash01,property=secure,value=on",
"-drive",
- &format!("if=pflash,format=raw,unit=0,file={OVMF_CODE_PATH},readonly=on"),
+ &format!(
+ "if=pflash,format=raw,unit=0,file={},readonly=on",
+ self.ovmf_code_path
+ ),
"-drive",
&format!(
"if=pflash,format=raw,unit=1,file={}",