diff --git a/hypervisor/src/hypervisor.rs b/hypervisor/src/hypervisor.rs index b51e0e076..63621e45f 100644 --- a/hypervisor/src/hypervisor.rs +++ b/hypervisor/src/hypervisor.rs @@ -20,6 +20,11 @@ use thiserror::Error; /// /// pub enum HypervisorError { + /// + /// Hypervisor availability check error + /// + #[error("Failed to check availability of the hypervisor: {0}")] + HypervisorAvailableCheck(#[source] anyhow::Error), /// /// hypervisor creation error /// diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 159686e90..bbb71c913 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -916,6 +916,16 @@ impl KvmHypervisor { Ok(Arc::new(KvmHypervisor { kvm: kvm_obj })) } + /// Check if the hypervisor is available + pub fn is_available() -> hypervisor::Result { + match std::fs::metadata("/dev/kvm") { + Ok(_) => Ok(true), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(false), + Err(err) => Err(hypervisor::HypervisorError::HypervisorAvailableCheck( + err.into(), + )), + } + } } /// Implementation of Hypervisor trait for KVM /// Example: diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index d7d6972ab..4c68fa430 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -183,6 +183,16 @@ impl MshvHypervisor { Mshv::new().map_err(|e| hypervisor::HypervisorError::HypervisorCreate(e.into()))?; Ok(Arc::new(MshvHypervisor { mshv: mshv_obj })) } + /// Check if the hypervisor is available + pub fn is_available() -> hypervisor::Result { + match std::fs::metadata("/dev/mshv") { + Ok(_) => Ok(true), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(false), + Err(err) => Err(hypervisor::HypervisorError::HypervisorAvailableCheck( + err.into(), + )), + } + } } /// Implementation of Hypervisor trait for Mshv /// Example: