use super::Kernel;
use super::VmConfiguration;
use super::VzVirtualMachineInstance;
use crate::containerization::container::Mount;
use crate::error::Error;
use crate::platform;
use crate::platform::ffi;
use std::fmt;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct ManagerOptions {
pub rosetta: bool,
pub nested_virtualization: bool,
}
pub struct VzVirtualMachineManager {
pub(crate) handle: ffi::CzVirtualMachineManager,
}
unsafe impl Send for VzVirtualMachineManager {}
unsafe impl Sync for VzVirtualMachineManager {}
impl VzVirtualMachineManager {
pub fn new(kernel: &Kernel, initial_filesystem: &Mount, options: ManagerOptions) -> Result<Self, Error> {
platform::outcome(
ffi::cz_virtual_machine_manager_new(
kernel.clone(),
initial_filesystem.clone(),
options.rosetta,
options.nested_virtualization,
),
"make a virtual machine manager",
)
.map(|outcome| Self {
handle: outcome.virtual_machine_manager(),
})
}
pub fn create(&self, config: &VmConfiguration) -> Result<VzVirtualMachineInstance, Error> {
platform::outcome(self.handle.create(config.clone()), "create a virtual machine").map(|outcome| {
VzVirtualMachineInstance {
handle: outcome.virtual_machine_instance(),
}
})
}
}
impl Clone for VzVirtualMachineManager {
fn clone(&self) -> Self {
Self {
handle: self.handle.duplicate(),
}
}
}
impl fmt::Debug for VzVirtualMachineManager {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("VzVirtualMachineManager")
.finish_non_exhaustive()
}
}