microsoft/openvmm
Publicmirrored fromhttps://github.com/microsoft/openvmmAvailable
petri/src/worker.rs
80lines · modecode
| 1 | // Copyright (c) Microsoft Corporation. |
| 2 | // Licensed under the MIT License. |
| 3 | |
| 4 | use hvlite_defs::config::Config; |
| 5 | use hvlite_defs::rpc::PulseSaveRestoreError; |
| 6 | use hvlite_defs::rpc::VmRpc; |
| 7 | use hvlite_defs::worker::VmWorkerParameters; |
| 8 | use hvlite_defs::worker::VM_WORKER; |
| 9 | use mesh::rpc::RpcSend; |
| 10 | use mesh_worker::WorkerHandle; |
| 11 | use mesh_worker::WorkerHost; |
| 12 | use vmm_core_defs::HaltReason; |
| 13 | |
| 14 | pub(crate) struct Worker { |
| 15 | handle: WorkerHandle, |
| 16 | rpc: mesh::Sender<VmRpc>, |
| 17 | } |
| 18 | |
| 19 | impl Worker { |
| 20 | pub(crate) async fn launch( |
| 21 | host: &WorkerHost, |
| 22 | cfg: Config, |
| 23 | ) -> anyhow::Result<(Self, mesh::Receiver<HaltReason>)> { |
| 24 | let (vm_rpc, rpc_recv) = mesh::channel(); |
| 25 | let (notify_send, notify_recv) = mesh::channel(); |
| 26 | |
| 27 | let params = VmWorkerParameters { |
| 28 | hypervisor: None, |
| 29 | cfg, |
| 30 | saved_state: None, |
| 31 | rpc: rpc_recv, |
| 32 | notify: notify_send, |
| 33 | }; |
| 34 | let vm_worker = host.launch_worker(VM_WORKER, params).await?; |
| 35 | |
| 36 | Ok(( |
| 37 | Self { |
| 38 | handle: vm_worker, |
| 39 | rpc: vm_rpc, |
| 40 | }, |
| 41 | notify_recv, |
| 42 | )) |
| 43 | } |
| 44 | |
| 45 | pub(crate) async fn resume(&self) -> Result<bool, mesh::RecvError> { |
| 46 | self.rpc.call(VmRpc::Resume, ()).await |
| 47 | } |
| 48 | |
| 49 | pub(crate) async fn reset(&self) -> anyhow::Result<()> { |
| 50 | self.rpc.call(VmRpc::Reset, ()).await??; |
| 51 | Ok(()) |
| 52 | } |
| 53 | |
| 54 | pub(crate) async fn pulse_save_restore( |
| 55 | &self, |
| 56 | ) -> Result<Result<(), PulseSaveRestoreError>, mesh::RecvError> { |
| 57 | self.rpc.call(VmRpc::PulseSaveRestore, ()).await |
| 58 | } |
| 59 | |
| 60 | pub(crate) async fn restart_openhcl( |
| 61 | &self, |
| 62 | send: &mesh::Sender<get_resources::ged::GuestEmulationRequest>, |
| 63 | file: std::fs::File, |
| 64 | ) -> anyhow::Result<()> { |
| 65 | hvlite_helpers::underhill::service_underhill(&self.rpc, send, file).await |
| 66 | } |
| 67 | |
| 68 | pub(crate) async fn inspect_all(&self) -> String { |
| 69 | let mut inspection = inspect::inspect("", &self.handle); |
| 70 | inspection.resolve().await; |
| 71 | let results = inspection.results(); |
| 72 | format!("{results:#}",) |
| 73 | } |
| 74 | |
| 75 | pub(crate) async fn shutdown(mut self) -> anyhow::Result<()> { |
| 76 | self.handle.stop(); |
| 77 | self.handle.join().await?; |
| 78 | Ok(()) |
| 79 | } |
| 80 | } |
| 81 | |