pub struct PetriVmBuilder<T: PetriVmmBackend> { /* private fields */ }Expand description
Petri VM builder
Implementations§
Source§impl<T: PetriVmmBackend> PetriVmBuilder<T>
impl<T: PetriVmmBackend> PetriVmBuilder<T>
Sourcepub fn new(
params: PetriTestParams<'_>,
artifacts: PetriVmArtifacts<T>,
driver: &DefaultDriver,
) -> Result<Self>
pub fn new( params: PetriTestParams<'_>, artifacts: PetriVmArtifacts<T>, driver: &DefaultDriver, ) -> Result<Self>
Create a new VM configuration.
Sourcepub fn minimal(
params: PetriTestParams<'_>,
artifacts: PetriVmArtifacts<T>,
driver: &DefaultDriver,
) -> Result<Self>
pub fn minimal( params: PetriTestParams<'_>, artifacts: PetriVmArtifacts<T>, driver: &DefaultDriver, ) -> Result<Self>
Create a minimal VM builder with only the bare minimum device set.
Unlike new(), this constructor:
- Does not add default VMBus devices (shutdown IC, KVP, etc.)
- Does not add serial ports
- Does not add SCSI controllers or crash dump disks
- Does not verify save/restore on boot
Use builder methods to opt in to specific devices. Intended for performance tests where minimal overhead is critical.
Sourcepub fn is_minimal(&self) -> bool
pub fn is_minimal(&self) -> bool
Whether this builder is in minimal mode.
Sourcepub fn with_prebuilt_initrd(self, path: PathBuf) -> Self
pub fn with_prebuilt_initrd(self, path: PathBuf) -> Self
Supply a pre-built initrd with pipette already injected.
When set, the builder skips the runtime gzip decompress/inject/
recompress cycle, using this initrd directly. Use
prepare_initrd to build the initrd
ahead of time.
Sourcepub fn prepare_initrd(&self) -> Result<TempPath>
pub fn prepare_initrd(&self) -> Result<TempPath>
Pre-build the modified initrd with pipette injected.
Reads the original initrd from the firmware artifacts, injects
the pipette binary via CPIO, and writes the result to a temp file.
Returns the path to the temp file. The caller must keep the
TempPath alive until after the VM boots.
Call this once before timing, then pass the path to
with_prebuilt_initrd for each
iteration.
Sourcepub fn with_serial_output(self) -> Self
pub fn with_serial_output(self) -> Self
Enable serial port output even in minimal mode.
Useful for diagnostics — the serial device overhead is negligible;
the cost comes from kernel console output, which is controlled via
the kernel cmdline (quiet loglevel=0).
Note: this currently only affects LinuxDirect boot (kernel cmdline and emulated serial backends). UEFI paths are unaffected.
Sourcepub fn without_serial_output(self) -> Self
pub fn without_serial_output(self) -> Self
Disable serial port output.
Suppresses serial device creation, eliminating the [uefi] / [openhcl]
log lines. Useful for performance tests where serial noise is unwanted.
Sourcepub fn without_screenshots(self) -> Self
pub fn without_screenshots(self) -> Self
Disable periodic framebuffer screenshots.
Suppresses the watchdog task that takes screenshots every 2 seconds, eliminating the “No change in framebuffer” debug log lines.
Sourcepub fn properties(&self) -> PetriVmProperties
pub fn properties(&self) -> PetriVmProperties
Get properties about the vm for convenience
Sourcepub fn using_vtl0_pipette(&self) -> bool
pub fn using_vtl0_pipette(&self) -> bool
Whether this VM is using pipette in VTL0
Sourcepub async fn run_without_agent(self) -> Result<PetriVm<T>>
pub async fn run_without_agent(self) -> Result<PetriVm<T>>
Build and run the VM, then wait for the VM to emit the expected boot event (if configured). Does not configure and start pipette. Should only be used for testing platforms that pipette does not support.
Sourcepub async fn run(self) -> Result<(PetriVm<T>, PipetteClient)>
pub async fn run(self) -> Result<(PetriVm<T>, PipetteClient)>
Build and run the VM, then wait for the VM to emit the expected boot event (if configured). Launches pipette and returns a client to it.
Sourcepub fn with_expect_boot_failure(self) -> Self
pub fn with_expect_boot_failure(self) -> Self
Configure the test to expect a boot failure from the VM. Useful for negative tests.
Sourcepub fn with_expect_no_boot_event(self) -> Self
pub fn with_expect_no_boot_event(self) -> Self
Configure the test to not expect any boot event. Useful for tests that do not boot a VTL0 guest.
Sourcepub fn with_expect_reset(self) -> Self
pub fn with_expect_reset(self) -> Self
Allow the VM to reset once at the beginning of the test. Should only be used if you are using a special VM configuration that causes the guest to reboot when it usually wouldn’t.
Sourcepub fn with_secure_boot(self) -> Self
pub fn with_secure_boot(self) -> Self
Set the VM to enable secure boot and inject the templates per OS flavor.
Sourcepub fn with_windows_secure_boot_template(self) -> Self
pub fn with_windows_secure_boot_template(self) -> Self
Inject Windows secure boot templates into the VM’s UEFI.
Sourcepub fn with_uefi_ca_secure_boot_template(self) -> Self
pub fn with_uefi_ca_secure_boot_template(self) -> Self
Inject UEFI CA secure boot templates into the VM’s UEFI.
Sourcepub fn with_processor_topology(self, topology: ProcessorTopology) -> Self
pub fn with_processor_topology(self, topology: ProcessorTopology) -> Self
Set the VM to use the specified processor topology.
Sourcepub fn with_memory(self, memory: MemoryConfig) -> Self
pub fn with_memory(self, memory: MemoryConfig) -> Self
Set the VM to use the specified memory config.
Sourcepub fn with_vtl2_base_address_type(
self,
address_type: Vtl2BaseAddressType,
) -> Self
pub fn with_vtl2_base_address_type( self, address_type: Vtl2BaseAddressType, ) -> Self
Sets a custom OpenHCL IGVM VTL2 address type. This controls the behavior
of where VTL2 is placed in address space, and also the total size of memory
allocated for VTL2. VTL2 start will fail if address_type is specified
and leads to the loader allocating less memory than what is in the IGVM file.
Sourcepub fn with_custom_openhcl(
self,
artifact: ResolvedArtifact<impl IsOpenhclIgvm>,
) -> Self
pub fn with_custom_openhcl( self, artifact: ResolvedArtifact<impl IsOpenhclIgvm>, ) -> Self
Sets a custom OpenHCL IGVM file to use.
Sourcepub fn with_openhcl_command_line(self, additional_command_line: &str) -> Self
pub fn with_openhcl_command_line(self, additional_command_line: &str) -> Self
Append additional command line arguments to pass to the paravisor.
Sourcepub fn with_confidential_filtering(self) -> Self
pub fn with_confidential_filtering(self) -> Self
Enable confidential filtering, even if the VM is not confidential.
Sourcepub fn with_openhcl_log_levels(self, levels: OpenvmmLogConfig) -> Self
pub fn with_openhcl_log_levels(self, levels: OpenvmmLogConfig) -> Self
Sets the command line parameters passed to OpenHCL related to logging.
Sourcepub fn with_host_log_levels(self, levels: OpenvmmLogConfig) -> Self
pub fn with_host_log_levels(self, levels: OpenvmmLogConfig) -> Self
Sets the log levels for the host OpenVMM process. DEVNOTE: In the future, this could be generalized for both HyperV and OpenVMM. For now, this is only implemented for OpenVMM.
Sourcepub fn with_agent_file(self, name: &str, artifact: ResolvedArtifact) -> Self
pub fn with_agent_file(self, name: &str, artifact: ResolvedArtifact) -> Self
Adds a file to the VM’s pipette agent image.
Sourcepub fn with_openhcl_agent_file(
self,
name: &str,
artifact: ResolvedArtifact,
) -> Self
pub fn with_openhcl_agent_file( self, name: &str, artifact: ResolvedArtifact, ) -> Self
Adds a file to the paravisor’s pipette agent image.
Sourcepub fn with_uefi_frontpage(self, enable: bool) -> Self
pub fn with_uefi_frontpage(self, enable: bool) -> Self
Sets whether UEFI frontpage is enabled.
Sourcepub fn with_default_boot_always_attempt(self, enable: bool) -> Self
pub fn with_default_boot_always_attempt(self, enable: bool) -> Self
Sets whether UEFI should always attempt a default boot.
Sourcepub fn with_vmbus_redirect(self, enable: bool) -> Self
pub fn with_vmbus_redirect(self, enable: bool) -> Self
Run the VM with Enable VMBus relay enabled
Sourcepub fn with_guest_state_lifetime(
self,
guest_state_lifetime: PetriGuestStateLifetime,
) -> Self
pub fn with_guest_state_lifetime( self, guest_state_lifetime: PetriGuestStateLifetime, ) -> Self
Specify the guest state lifetime for the VM
Sourcepub fn with_guest_state_encryption(
self,
policy: GuestStateEncryptionPolicy,
) -> Self
pub fn with_guest_state_encryption( self, policy: GuestStateEncryptionPolicy, ) -> Self
Specify the guest state encryption policy for the VM
Sourcepub fn with_initial_vmgs(self, disk: ResolvedArtifact<impl IsTestVmgs>) -> Self
pub fn with_initial_vmgs(self, disk: ResolvedArtifact<impl IsTestVmgs>) -> Self
Use the specified backing VMGS file
Sourcepub fn with_persistent_vmgs(self, disk: impl AsRef<Path>) -> Self
pub fn with_persistent_vmgs(self, disk: impl AsRef<Path>) -> Self
Use the specified backing VMGS file
Sourcepub fn with_boot_device_type(self, boot: BootDeviceType) -> Self
pub fn with_boot_device_type(self, boot: BootDeviceType) -> Self
Set the boot device type for the VM.
This overrides the default, which is determined by the firmware type.
Sourcepub fn with_tpm_state_persistence(self, tpm_state_persistence: bool) -> Self
pub fn with_tpm_state_persistence(self, tpm_state_persistence: bool) -> Self
Enable or disable the TPM state persistence for the VM.
Sourcepub fn with_custom_vtl2_settings(
self,
f: impl FnOnce(&mut Vtl2Settings) + 'static + Send + Sync,
) -> Self
pub fn with_custom_vtl2_settings( self, f: impl FnOnce(&mut Vtl2Settings) + 'static + Send + Sync, ) -> Self
Add custom VTL 2 settings.
Sourcepub fn add_vtl2_storage_controller(self, controller: StorageController) -> Self
pub fn add_vtl2_storage_controller(self, controller: StorageController) -> Self
Add a storage controller to VTL2
Sourcepub fn add_vmbus_storage_controller(
self,
id: &Guid,
target_vtl: Vtl,
controller_type: VmbusStorageType,
) -> Self
pub fn add_vmbus_storage_controller( self, id: &Guid, target_vtl: Vtl, controller_type: VmbusStorageType, ) -> Self
Add an additional SCSI controller to the VM.
Sourcepub fn add_vmbus_drive(
self,
drive: Drive,
controller_id: &Guid,
controller_location: Option<u32>,
) -> Self
pub fn add_vmbus_drive( self, drive: Drive, controller_id: &Guid, controller_location: Option<u32>, ) -> Self
Add a VMBus disk drive to the VM
Sourcepub fn add_ide_drive(
self,
drive: Drive,
controller_number: u32,
controller_location: u8,
) -> Self
pub fn add_ide_drive( self, drive: Drive, controller_number: u32, controller_location: u8, ) -> Self
Add a VMBus disk drive to the VM
Sourcepub fn is_openhcl(&self) -> bool
pub fn is_openhcl(&self) -> bool
Get whether the VM will use OpenHCL
Sourcepub fn isolation(&self) -> Option<IsolationType>
pub fn isolation(&self) -> Option<IsolationType>
Get the isolation type of the VM
Sourcepub fn arch(&self) -> MachineArch
pub fn arch(&self) -> MachineArch
Get the machine architecture
Sourcepub fn log_source(&self) -> &PetriLogSource
pub fn log_source(&self) -> &PetriLogSource
Get the log source for creating additional log files.
Sourcepub fn default_servicing_flags(&self) -> OpenHclServicingFlags
pub fn default_servicing_flags(&self) -> OpenHclServicingFlags
Get the default OpenHCL servicing flags for this config
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for PetriVmBuilder<T>where
T: Freeze,
impl<T> !RefUnwindSafe for PetriVmBuilder<T>
impl<T> Send for PetriVmBuilder<T>where
T: Send,
impl<T> !Sync for PetriVmBuilder<T>
impl<T> Unpin for PetriVmBuilder<T>where
T: Unpin,
impl<T> !UnwindSafe for PetriVmBuilder<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.