#[cfg(test)]
mod tests;
mod types;
pub use types::{OtherInfo, PowerState, Snapshot, SnapshotId, Vm, VmId, VmOrSnapshotId};
use jsonrpsee_types::{traits::Client as _, v2::params::ParamsSer};
use jsonrpsee_ws_client::WsClient;
use std::sync::Arc;
use crate::{procedure_args, RpcError};
pub struct VmProcedures {
pub(crate) inner: Arc<WsClient>,
}
impl VmProcedures {
pub async fn restart_nonblocking(&self, vm_id: VmId) -> Result<(), RestartError> {
#[derive(serde::Deserialize, Debug)]
#[serde(transparent)]
struct RestartResult(bool);
let params = procedure_args! { "id" => vm_id };
let restart_suceeded: RestartResult = self
.inner
.request("vm.restart", Some(ParamsSer::Map(params)))
.await
.map_err(RestartError::Rpc)?;
if let RestartResult(false) = restart_suceeded {
return Err(RestartError::ReportedFail);
}
Ok(())
}
pub async fn snapshot(
&self,
vm_id: VmId,
name: String,
description: String,
save_memory: bool,
) -> Result<SnapshotId, RpcError> {
let params = procedure_args! {
"id" => vm_id,
"name" => name,
"description" => description,
"saveMemory"=> save_memory,
};
self.inner
.request("vm.snapshot", Some(ParamsSer::Map(params)))
.await
.map_err(Into::into)
}
pub async fn revert(&self, snapshot_id: SnapshotId) -> Result<(), RevertSnapshotError> {
#[derive(serde::Deserialize, Debug)]
#[serde(transparent)]
struct RevertResult(bool);
let params = procedure_args! { "snapshot" => snapshot_id.clone() };
let revert_result = self
.inner
.request::<RevertResult>("vm.revert", Some(ParamsSer::Map(params)))
.await
.map_err(RevertSnapshotError::Rpc)?;
if let RevertResult(false) = revert_result {
log::warn!("revert_snapshot: {:?} false", snapshot_id);
return Err(RevertSnapshotError::ReportedFail);
}
Ok(())
}
pub async fn delete(
&self,
vm_or_snapshot_id: impl Into<VmOrSnapshotId>,
) -> Result<(), RpcError> {
#[derive(serde::Deserialize)]
#[serde(transparent)]
struct DeleteResult(([(); 0], [(); 1]));
let vm_or_snapshot_id = vm_or_snapshot_id.into();
let params = procedure_args! { "id" => vm_or_snapshot_id };
self.inner
.request::<DeleteResult>("vm.delete", Some(ParamsSer::Map(params)))
.await?;
Ok(())
}
}
#[derive(Debug)]
pub enum RestartError {
ReportedFail,
Rpc(RpcError),
}
#[derive(Debug)]
pub enum RevertSnapshotError {
ReportedFail,
Rpc(RpcError),
}