From 1b406b9d0c3cccfbcfcf0bfcdff19a24b632e029 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Thu, 11 May 2023 00:47:01 -0700 Subject: [PATCH] kata-ctl:Implement functionality to check host is capable of running VM Implement functionality to add to the env output if the host is capable of running a VM. Fixes: #6727 Signed-off-by: Archana Shinde --- src/tools/kata-ctl/src/arch/aarch64/mod.rs | 5 +++++ src/tools/kata-ctl/src/arch/powerpc64le/mod.rs | 5 +++++ src/tools/kata-ctl/src/arch/s390x/mod.rs | 15 +++++++++++++++ src/tools/kata-ctl/src/arch/x86_64/mod.rs | 17 +++++++++++++++++ src/tools/kata-ctl/src/check.rs | 3 +++ src/tools/kata-ctl/src/ops/env_ops.rs | 9 +++++++-- 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/tools/kata-ctl/src/arch/aarch64/mod.rs b/src/tools/kata-ctl/src/arch/aarch64/mod.rs index 0f4012a368..41d28f8db1 100644 --- a/src/tools/kata-ctl/src/arch/aarch64/mod.rs +++ b/src/tools/kata-ctl/src/arch/aarch64/mod.rs @@ -80,6 +80,11 @@ mod arch_specific { Some(CHECK_LIST) } + pub fn host_is_vmcontainer_capable() -> Result { + // TODO: Not implemented + Ok(true) + } + #[allow(dead_code)] // Guest protection is not supported on ARM64. pub fn available_guest_protection() -> Result { diff --git a/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs b/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs index fc849c6318..436d5a4d23 100644 --- a/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs +++ b/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs @@ -33,6 +33,11 @@ mod arch_specific { // to the goloang implementation of function getCPUDetails() } + pub fn host_is_vmcontainer_capable() -> Result { + // TODO: Not implemented + Ok(true) + } + pub fn available_guest_protection() -> Result { if !Uid::effective().is_root() { return Err(check::ProtectionError::NoPerms); diff --git a/src/tools/kata-ctl/src/arch/s390x/mod.rs b/src/tools/kata-ctl/src/arch/s390x/mod.rs index d3efe6f3c6..991d676d1c 100644 --- a/src/tools/kata-ctl/src/arch/s390x/mod.rs +++ b/src/tools/kata-ctl/src/arch/s390x/mod.rs @@ -78,6 +78,21 @@ mod arch_specific { Some(CHECK_LIST) } + pub fn host_is_vmcontainer_capable() -> Result { + let mut count = 0; + if check_cpu().is_err() { + count += 1; + }; + + // TODO: Add additional checks for kernel modules + + if count == 0 { + return Ok(true); + }; + + Err(anyhow!("System is not capable of running a VM")) + } + #[allow(dead_code)] fn retrieve_cpu_facilities() -> Result> { let f = std::fs::File::open(check::PROC_CPUINFO)?; diff --git a/src/tools/kata-ctl/src/arch/x86_64/mod.rs b/src/tools/kata-ctl/src/arch/x86_64/mod.rs index 457f87d9f2..fb2d0a35ec 100644 --- a/src/tools/kata-ctl/src/arch/x86_64/mod.rs +++ b/src/tools/kata-ctl/src/arch/x86_64/mod.rs @@ -343,6 +343,23 @@ mod arch_specific { } Ok(()) } + + pub fn host_is_vmcontainer_capable() -> Result { + let mut count = 0; + if check_cpu("check_cpu").is_err() { + count += 1; + }; + + if check_kernel_modules("check_modules").is_err() { + count += 1; + }; + + if count == 0 { + return Ok(true); + }; + + Err(anyhow!("System is not capable of running a VM")) + } } #[cfg(target_arch = "x86_64")] diff --git a/src/tools/kata-ctl/src/check.rs b/src/tools/kata-ctl/src/check.rs index f8d39dbde8..78e30a93a9 100644 --- a/src/tools/kata-ctl/src/check.rs +++ b/src/tools/kata-ctl/src/check.rs @@ -5,7 +5,9 @@ // Contains checks that are not architecture-specific +#[cfg(any(target_arch = "x86_64"))] use crate::types::KernelModule; + use anyhow::{anyhow, Result}; use nix::fcntl::{open, OFlag}; use nix::sys::stat::Mode; @@ -393,6 +395,7 @@ pub fn check_kernel_module_loaded(kernel_module: &KernelModule) -> Result<(), St #[cfg(test)] mod tests { use super::*; + #[cfg(any(target_arch = "x86_64"))] use crate::types::{KernelModule, KernelParam, KernelParamType}; use semver::Version; use slog::warn; diff --git a/src/tools/kata-ctl/src/ops/env_ops.rs b/src/tools/kata-ctl/src/ops/env_ops.rs index 05602e479c..d687f96172 100644 --- a/src/tools/kata-ctl/src/ops/env_ops.rs +++ b/src/tools/kata-ctl/src/ops/env_ops.rs @@ -255,6 +255,12 @@ fn get_host_info() -> Result { let guest_protection = guest_protection.to_string(); + let mut vm_container_capable = true; + + if arch_specific::host_is_vmcontainer_capable().is_err() { + vm_container_capable = false; + } + let support_vsocks = utils::supports_vsocks(utils::VHOST_VSOCK_DEVICE)?; Ok(HostInfo { @@ -264,8 +270,7 @@ fn get_host_info() -> Result { cpu: host_cpu, memory: memory_info, available_guest_protection: guest_protection, - // TODO: See https://github.com/kata-containers/kata-containers/issues/6727 - vm_container_capable: true, + vm_container_capable, support_vsocks, }) }