PetriVmBuilder

Struct PetriVmBuilder 

Source
pub struct PetriVmBuilder<T: PetriVmmBackend> { /* private fields */ }
Expand description

Petri VM builder

Implementations§

Source§

impl<T: PetriVmmBackend> PetriVmBuilder<T>

Source

pub fn new( params: PetriTestParams<'_>, artifacts: PetriVmArtifacts<T>, driver: &DefaultDriver, ) -> Result<Self>

Create a new VM configuration.

Source

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.

Source

pub fn is_minimal(&self) -> bool

Whether this builder is in minimal mode.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn properties(&self) -> PetriVmProperties

Get properties about the vm for convenience

Source

pub fn using_vtl0_pipette(&self) -> bool

Whether this VM is using pipette in VTL0

Source

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.

Source

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.

Source

pub fn with_expect_boot_failure(self) -> Self

Configure the test to expect a boot failure from the VM. Useful for negative tests.

Source

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.

Source

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.

Source

pub fn with_secure_boot(self) -> Self

Set the VM to enable secure boot and inject the templates per OS flavor.

Source

pub fn with_windows_secure_boot_template(self) -> Self

Inject Windows secure boot templates into the VM’s UEFI.

Source

pub fn with_uefi_ca_secure_boot_template(self) -> Self

Inject UEFI CA secure boot templates into the VM’s UEFI.

Source

pub fn with_processor_topology(self, topology: ProcessorTopology) -> Self

Set the VM to use the specified processor topology.

Source

pub fn with_memory(self, memory: MemoryConfig) -> Self

Set the VM to use the specified memory config.

Source

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.

Source

pub fn with_custom_openhcl( self, artifact: ResolvedArtifact<impl IsOpenhclIgvm>, ) -> Self

Sets a custom OpenHCL IGVM file to use.

Source

pub fn with_openhcl_command_line(self, additional_command_line: &str) -> Self

Append additional command line arguments to pass to the paravisor.

Source

pub fn with_confidential_filtering(self) -> Self

Enable confidential filtering, even if the VM is not confidential.

Source

pub fn with_openhcl_log_levels(self, levels: OpenvmmLogConfig) -> Self

Sets the command line parameters passed to OpenHCL related to logging.

Source

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.

Source

pub fn with_agent_file(self, name: &str, artifact: ResolvedArtifact) -> Self

Adds a file to the VM’s pipette agent image.

Source

pub fn with_openhcl_agent_file( self, name: &str, artifact: ResolvedArtifact, ) -> Self

Adds a file to the paravisor’s pipette agent image.

Source

pub fn with_uefi_frontpage(self, enable: bool) -> Self

Sets whether UEFI frontpage is enabled.

Source

pub fn with_default_boot_always_attempt(self, enable: bool) -> Self

Sets whether UEFI should always attempt a default boot.

Source

pub fn with_vmbus_redirect(self, enable: bool) -> Self

Run the VM with Enable VMBus relay enabled

Source

pub fn with_guest_state_lifetime( self, guest_state_lifetime: PetriGuestStateLifetime, ) -> Self

Specify the guest state lifetime for the VM

Source

pub fn with_guest_state_encryption( self, policy: GuestStateEncryptionPolicy, ) -> Self

Specify the guest state encryption policy for the VM

Source

pub fn with_initial_vmgs(self, disk: ResolvedArtifact<impl IsTestVmgs>) -> Self

Use the specified backing VMGS file

Source

pub fn with_persistent_vmgs(self, disk: impl AsRef<Path>) -> Self

Use the specified backing VMGS file

Source

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.

Source

pub fn with_tpm(self, enable: bool) -> Self

Enable the TPM for the VM.

Source

pub fn with_tpm_state_persistence(self, tpm_state_persistence: bool) -> Self

Enable or disable the TPM state persistence for the VM.

Source

pub fn with_custom_vtl2_settings( self, f: impl FnOnce(&mut Vtl2Settings) + 'static + Send + Sync, ) -> Self

Add custom VTL 2 settings.

Source

pub fn add_vtl2_storage_controller(self, controller: StorageController) -> Self

Add a storage controller to VTL2

Source

pub fn add_vmbus_storage_controller( self, id: &Guid, target_vtl: Vtl, controller_type: VmbusStorageType, ) -> Self

Add an additional SCSI controller to the VM.

Source

pub fn add_vmbus_drive( self, drive: Drive, controller_id: &Guid, controller_location: Option<u32>, ) -> Self

Add a VMBus disk drive to the VM

Source

pub fn add_ide_drive( self, drive: Drive, controller_number: u32, controller_location: u8, ) -> Self

Add a VMBus disk drive to the VM

Source

pub fn os_flavor(&self) -> OsFlavor

Get VM’s guest OS flavor

Source

pub fn is_openhcl(&self) -> bool

Get whether the VM will use OpenHCL

Source

pub fn isolation(&self) -> Option<IsolationType>

Get the isolation type of the VM

Source

pub fn arch(&self) -> MachineArch

Get the machine architecture

Source

pub fn log_source(&self) -> &PetriLogSource

Get the log source for creating additional log files.

Source

pub fn default_servicing_flags(&self) -> OpenHclServicingFlags

Get the default OpenHCL servicing flags for this config

Source

pub fn modify_backend( self, f: impl FnOnce(T::VmmConfig) -> T::VmmConfig + 'static + Send, ) -> Self

Get the backend-specific config builder

Trait Implementations§

Source§

impl<T: PetriVmmBackend> Debug for PetriVmBuilder<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more