microsoft/openvmm

Public

mirrored fromhttps://github.com/microsoft/openvmmAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
8bd6d8fd5fcd4e4efdee54f2c1fd165a93cfb9c3

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

petri/src/worker.rs

80lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use hvlite_defs::config::Config;
5use hvlite_defs::rpc::PulseSaveRestoreError;
6use hvlite_defs::rpc::VmRpc;
7use hvlite_defs::worker::VmWorkerParameters;
8use hvlite_defs::worker::VM_WORKER;
9use mesh::rpc::RpcSend;
10use mesh_worker::WorkerHandle;
11use mesh_worker::WorkerHost;
12use vmm_core_defs::HaltReason;
13
14pub(crate) struct Worker {
15 handle: WorkerHandle,
16 rpc: mesh::Sender<VmRpc>,
17}
18
19impl 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