mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-28 00:07:16 +00:00
kata-types: Add Cloud Hypervisor (CH) definitions
Implement `ConfigPlugin` trait for Cloud Hypervisor (CH). Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com>
This commit is contained in:
parent
95602c8c08
commit
545151829d
@ -67,3 +67,17 @@ pub const DEFAULT_QEMU_PCI_BRIDGES: u32 = 2;
|
|||||||
pub const MAX_QEMU_PCI_BRIDGES: u32 = 5;
|
pub const MAX_QEMU_PCI_BRIDGES: u32 = 5;
|
||||||
pub const MAX_QEMU_VCPUS: u32 = 256;
|
pub const MAX_QEMU_VCPUS: u32 = 256;
|
||||||
pub const MIN_QEMU_MEMORY_SIZE_MB: u32 = 64;
|
pub const MIN_QEMU_MEMORY_SIZE_MB: u32 = 64;
|
||||||
|
|
||||||
|
// Default configuration for Cloud Hypervisor (CH)
|
||||||
|
pub const DEFAULT_CH_BINARY_PATH: &str = "/usr/bin/cloud-hypervisor";
|
||||||
|
pub const DEFAULT_CH_CONTROL_PATH: &str = "";
|
||||||
|
pub const DEFAULT_CH_ENTROPY_SOURCE: &str = "/dev/urandom";
|
||||||
|
pub const DEFAULT_CH_GUEST_KERNEL_IMAGE: &str = "vmlinuz";
|
||||||
|
pub const DEFAULT_CH_GUEST_KERNEL_PARAMS: &str = "";
|
||||||
|
pub const DEFAULT_CH_FIRMWARE_PATH: &str = "";
|
||||||
|
pub const DEFAULT_CH_MEMORY_SIZE_MB: u32 = 128;
|
||||||
|
pub const DEFAULT_CH_MEMORY_SLOTS: u32 = 128;
|
||||||
|
pub const DEFAULT_CH_PCI_BRIDGES: u32 = 2;
|
||||||
|
pub const MAX_CH_PCI_BRIDGES: u32 = 5;
|
||||||
|
pub const MAX_CH_VCPUS: u32 = 256;
|
||||||
|
pub const MIN_CH_MEMORY_SIZE_MB: u32 = 64;
|
||||||
|
146
src/libs/kata-types/src/config/hypervisor/ch.rs
Normal file
146
src/libs/kata-types/src/config/hypervisor/ch.rs
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
// Copyright (c) 2019-2021 Alibaba Cloud
|
||||||
|
// Copyright (c) 2022-2023 Intel Corporation
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
use std::io::Result;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use super::{default, register_hypervisor_plugin};
|
||||||
|
|
||||||
|
use crate::config::default::MAX_CH_VCPUS;
|
||||||
|
use crate::config::default::MIN_CH_MEMORY_SIZE_MB;
|
||||||
|
|
||||||
|
use crate::config::hypervisor::VIRTIO_BLK_MMIO;
|
||||||
|
use crate::config::{ConfigPlugin, TomlConfig};
|
||||||
|
use crate::{eother, resolve_path, validate_path};
|
||||||
|
|
||||||
|
/// Hypervisor name for CH, used to index `TomlConfig::hypervisor`.
|
||||||
|
pub const HYPERVISOR_NAME_CH: &str = "cloud-hypervisor";
|
||||||
|
|
||||||
|
/// Configuration information for CH.
|
||||||
|
#[derive(Default, Debug)]
|
||||||
|
pub struct CloudHypervisorConfig {}
|
||||||
|
|
||||||
|
impl CloudHypervisorConfig {
|
||||||
|
/// Create a new instance of `CloudHypervisorConfig`.
|
||||||
|
pub fn new() -> Self {
|
||||||
|
CloudHypervisorConfig {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Register the CH plugin.
|
||||||
|
pub fn register(self) {
|
||||||
|
let plugin = Arc::new(self);
|
||||||
|
register_hypervisor_plugin(HYPERVISOR_NAME_CH, plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ConfigPlugin for CloudHypervisorConfig {
|
||||||
|
fn get_max_cpus(&self) -> u32 {
|
||||||
|
MAX_CH_VCPUS
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_min_memory(&self) -> u32 {
|
||||||
|
MIN_CH_MEMORY_SIZE_MB
|
||||||
|
}
|
||||||
|
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
HYPERVISOR_NAME_CH
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adjust the configuration information after loading from configuration file.
|
||||||
|
fn adjust_config(&self, conf: &mut TomlConfig) -> Result<()> {
|
||||||
|
if let Some(ch) = conf.hypervisor.get_mut(HYPERVISOR_NAME_CH) {
|
||||||
|
if ch.path.is_empty() {
|
||||||
|
ch.path = default::DEFAULT_CH_BINARY_PATH.to_string();
|
||||||
|
}
|
||||||
|
resolve_path!(ch.path, "CH binary path `{}` is invalid: {}")?;
|
||||||
|
if ch.ctlpath.is_empty() {
|
||||||
|
ch.ctlpath = default::DEFAULT_CH_CONTROL_PATH.to_string();
|
||||||
|
}
|
||||||
|
resolve_path!(ch.ctlpath, "CH ctlpath `{}` is invalid: {}")?;
|
||||||
|
|
||||||
|
if ch.boot_info.kernel.is_empty() {
|
||||||
|
ch.boot_info.kernel = default::DEFAULT_CH_GUEST_KERNEL_IMAGE.to_string();
|
||||||
|
}
|
||||||
|
if ch.boot_info.kernel_params.is_empty() {
|
||||||
|
ch.boot_info.kernel_params = default::DEFAULT_CH_GUEST_KERNEL_PARAMS.to_string();
|
||||||
|
}
|
||||||
|
if ch.boot_info.firmware.is_empty() {
|
||||||
|
ch.boot_info.firmware = default::DEFAULT_CH_FIRMWARE_PATH.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.device_info.default_bridges == 0 {
|
||||||
|
ch.device_info.default_bridges = default::DEFAULT_CH_PCI_BRIDGES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.machine_info.entropy_source.is_empty() {
|
||||||
|
ch.machine_info.entropy_source = default::DEFAULT_CH_ENTROPY_SOURCE.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.memory_info.default_memory == 0 {
|
||||||
|
ch.memory_info.default_memory = default::DEFAULT_CH_MEMORY_SIZE_MB;
|
||||||
|
}
|
||||||
|
if ch.memory_info.memory_slots == 0 {
|
||||||
|
ch.memory_info.memory_slots = default::DEFAULT_CH_MEMORY_SLOTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Validate the configuration information.
|
||||||
|
fn validate(&self, conf: &TomlConfig) -> Result<()> {
|
||||||
|
if let Some(ch) = conf.hypervisor.get(HYPERVISOR_NAME_CH) {
|
||||||
|
validate_path!(ch.path, "CH binary path `{}` is invalid: {}")?;
|
||||||
|
validate_path!(ch.ctlpath, "CH control path `{}` is invalid: {}")?;
|
||||||
|
if !ch.jailer_path.is_empty() {
|
||||||
|
return Err(eother!("Path for CH jailer should be empty"));
|
||||||
|
}
|
||||||
|
if !ch.valid_jailer_paths.is_empty() {
|
||||||
|
return Err(eother!("Valid CH jailer path list should be empty"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ch.blockdev_info.disable_block_device_use
|
||||||
|
&& ch.blockdev_info.block_device_driver == VIRTIO_BLK_MMIO
|
||||||
|
{
|
||||||
|
return Err(eother!("CH doesn't support virtio-blk-mmio"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.boot_info.kernel.is_empty() {
|
||||||
|
return Err(eother!("Guest kernel image for CH is empty"));
|
||||||
|
}
|
||||||
|
if ch.boot_info.image.is_empty() && ch.boot_info.initrd.is_empty() {
|
||||||
|
return Err(eother!("Both guest boot image and initrd for CH are empty"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch.cpu_info.default_vcpus > 0
|
||||||
|
&& ch.cpu_info.default_vcpus as u32 > default::MAX_CH_VCPUS)
|
||||||
|
|| ch.cpu_info.default_maxvcpus > default::MAX_CH_VCPUS
|
||||||
|
{
|
||||||
|
return Err(eother!(
|
||||||
|
"CH hypervisor cannot support {} vCPUs",
|
||||||
|
ch.cpu_info.default_maxvcpus
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.device_info.default_bridges > default::MAX_CH_PCI_BRIDGES {
|
||||||
|
return Err(eother!(
|
||||||
|
"CH hypervisor cannot support {} PCI bridges",
|
||||||
|
ch.device_info.default_bridges
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch.memory_info.default_memory < MIN_CH_MEMORY_SIZE_MB {
|
||||||
|
return Err(eother!(
|
||||||
|
"CH hypervisor has minimal memory limitation {}",
|
||||||
|
MIN_CH_MEMORY_SIZE_MB
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -40,6 +40,9 @@ pub use self::dragonball::{DragonballConfig, HYPERVISOR_NAME_DRAGONBALL};
|
|||||||
mod qemu;
|
mod qemu;
|
||||||
pub use self::qemu::{QemuConfig, HYPERVISOR_NAME_QEMU};
|
pub use self::qemu::{QemuConfig, HYPERVISOR_NAME_QEMU};
|
||||||
|
|
||||||
|
mod ch;
|
||||||
|
pub use self::ch::{CloudHypervisorConfig, HYPERVISOR_NAME_CH};
|
||||||
|
|
||||||
const VIRTIO_BLK: &str = "virtio-blk";
|
const VIRTIO_BLK: &str = "virtio-blk";
|
||||||
const VIRTIO_BLK_MMIO: &str = "virtio-mmio";
|
const VIRTIO_BLK_MMIO: &str = "virtio-mmio";
|
||||||
const VIRTIO_BLK_CCW: &str = "virtio-blk-ccw";
|
const VIRTIO_BLK_CCW: &str = "virtio-blk-ccw";
|
||||||
|
@ -25,8 +25,8 @@ pub mod hypervisor;
|
|||||||
pub use self::agent::Agent;
|
pub use self::agent::Agent;
|
||||||
use self::default::DEFAULT_AGENT_DBG_CONSOLE_PORT;
|
use self::default::DEFAULT_AGENT_DBG_CONSOLE_PORT;
|
||||||
pub use self::hypervisor::{
|
pub use self::hypervisor::{
|
||||||
BootInfo, DragonballConfig, Hypervisor, QemuConfig, HYPERVISOR_NAME_DRAGONBALL,
|
BootInfo, CloudHypervisorConfig, DragonballConfig, Hypervisor, QemuConfig,
|
||||||
HYPERVISOR_NAME_QEMU,
|
HYPERVISOR_NAME_DRAGONBALL, HYPERVISOR_NAME_QEMU,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod runtime;
|
mod runtime;
|
||||||
|
Loading…
Reference in New Issue
Block a user