Merge pull request #8704 from amshinde/runtime-rs-clh-implement-persist

runtime-rs: implement persist api for cloud-hypervisor
This commit is contained in:
Archana Shinde 2024-02-07 02:29:33 -08:00 committed by GitHub
commit d9ce88ada3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 71 additions and 10 deletions

9
src/libs/Cargo.lock generated
View File

@ -701,6 +701,7 @@ dependencies = [
"once_cell", "once_cell",
"rand", "rand",
"safe-path", "safe-path",
"serde",
"serde_json", "serde_json",
"serial_test", "serial_test",
"slog", "slog",
@ -1384,9 +1385,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.136" version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -1423,9 +1424,9 @@ checksum = "794e44574226fc701e3be5c651feb7939038fc67fb73f6f4dd5c4ba90fd3be70"
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.136" version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -21,6 +21,7 @@ lazy_static = "1.4.0"
libc = "0.2.100" libc = "0.2.100"
nix = "0.24.2" nix = "0.24.2"
once_cell = "1.9.0" once_cell = "1.9.0"
serde = { version = "1.0.138", features = ["derive"] }
serde_json = "1.0.73" serde_json = "1.0.73"
slog = "2.5.2" slog = "2.5.2"
slog-scope = "4.4.0" slog-scope = "4.4.0"

View File

@ -12,6 +12,7 @@ use std::fmt;
use std::path::Path; use std::path::Path;
use std::path::PathBuf; use std::path::PathBuf;
use thiserror::Error; use thiserror::Error;
use serde::{Deserialize, Serialize};
#[cfg(any(target_arch = "s390x", target_arch = "powerpc64le"))] #[cfg(any(target_arch = "s390x", target_arch = "powerpc64le"))]
use nix::unistd::Uid; use nix::unistd::Uid;
@ -19,14 +20,14 @@ use nix::unistd::Uid;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use std::fs; use std::fs;
#[derive(Debug, Clone, PartialEq, Eq, Default)] #[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct TDXDetails { pub struct TDXDetails {
pub major_version: u32, pub major_version: u32,
pub minor_version: u32, pub minor_version: u32,
} }
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug, Clone, PartialEq, Default)] #[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub enum GuestProtection { pub enum GuestProtection {
#[default] #[default]
NoProtection, NoProtection,

View File

@ -1804,6 +1804,7 @@ dependencies = [
"once_cell", "once_cell",
"rand 0.8.5", "rand 0.8.5",
"safe-path 0.1.0", "safe-path 0.1.0",
"serde",
"serde_json", "serde_json",
"slog", "slog",
"slog-scope", "slog-scope",

View File

@ -147,10 +147,11 @@ impl Persist for CloudHypervisorInner {
vm_path: self.vm_path.clone(), vm_path: self.vm_path.clone(),
jailed: false, jailed: false,
jailer_root: String::default(), jailer_root: String::default(),
netns: None, netns: self.netns.clone(),
config: self.hypervisor_config(), config: self.hypervisor_config(),
run_dir: self.run_dir.clone(), run_dir: self.run_dir.clone(),
cached_block_devices: Default::default(), guest_protection_to_use: self.guest_protection_to_use.clone(),
..Default::default() ..Default::default()
}) })
} }
@ -160,16 +161,70 @@ impl Persist for CloudHypervisorInner {
_hypervisor_args: Self::ConstructorArgs, _hypervisor_args: Self::ConstructorArgs,
hypervisor_state: Self::State, hypervisor_state: Self::State,
) -> Result<Self> { ) -> Result<Self> {
let ch = Self { let (tx, rx) = channel(true);
let mut ch = Self {
config: Some(hypervisor_state.config), config: Some(hypervisor_state.config),
state: VmmState::NotReady, state: VmmState::NotReady,
id: hypervisor_state.id, id: hypervisor_state.id,
vm_path: hypervisor_state.vm_path, vm_path: hypervisor_state.vm_path,
run_dir: hypervisor_state.run_dir, run_dir: hypervisor_state.run_dir,
netns: hypervisor_state.netns,
guest_protection_to_use: hypervisor_state.guest_protection_to_use.clone(),
pending_devices: vec![],
device_ids: HashMap::<String, String>::new(),
tasks: None,
shutdown_tx: Some(tx),
shutdown_rx: Some(rx),
timeout_secs: CH_DEFAULT_TIMEOUT_SECS as i32,
jailer_root: String::default(),
ch_features: None,
..Default::default() ..Default::default()
}; };
ch._capabilities = ch.capabilities().await?;
Ok(ch) Ok(ch)
} }
} }
#[cfg(test)]
mod tests {
use super::*;
use kata_sys_util::protection::TDXDetails;
#[actix_rt::test]
async fn test_save_clh() {
let mut clh = CloudHypervisorInner::new();
clh.id = String::from("123456");
clh.netns = Some(String::from("/var/run/netns/testnet"));
clh.vm_path = String::from("/opt/kata/bin/cloud-hypervisor");
clh.run_dir = String::from("/var/run/kata-containers/") + &clh.id;
let details = TDXDetails {
major_version: 1,
minor_version: 0,
};
clh.guest_protection_to_use = GuestProtection::Tdx(details);
let state = clh.save().await.unwrap();
assert_eq!(state.id, clh.id);
assert_eq!(state.netns, clh.netns);
assert_eq!(state.vm_path, clh.vm_path);
assert_eq!(state.run_dir, clh.run_dir);
assert_eq!(state.guest_protection_to_use, clh.guest_protection_to_use);
assert_eq!(state.jailed, false);
assert_eq!(state.hypervisor_type, HYPERVISOR_NAME_CH.to_string());
let clh = CloudHypervisorInner::restore((), state.clone())
.await
.unwrap();
assert_eq!(clh.id, state.id);
assert_eq!(clh.netns, state.netns);
assert_eq!(clh.vm_path, state.vm_path);
assert_eq!(clh.run_dir, state.run_dir);
assert_eq!(clh.guest_protection_to_use, state.guest_protection_to_use);
}
}

View File

@ -5,9 +5,9 @@
// //
use crate::HypervisorConfig; use crate::HypervisorConfig;
use kata_sys_util::protection::GuestProtection;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::HashSet; use std::collections::HashSet;
#[derive(Serialize, Deserialize, Default, Clone, Debug)] #[derive(Serialize, Deserialize, Default, Clone, Debug)]
pub struct HypervisorState { pub struct HypervisorState {
// Type of hypervisor, E.g. dragonball/qemu/firecracker/acrn. // Type of hypervisor, E.g. dragonball/qemu/firecracker/acrn.
@ -34,4 +34,6 @@ pub struct HypervisorState {
pub cached_block_devices: HashSet<String>, pub cached_block_devices: HashSet<String>,
pub virtiofs_daemon_pid: i32, pub virtiofs_daemon_pid: i32,
pub passfd_listener_port: Option<u32>, pub passfd_listener_port: Option<u32>,
/// guest protection
pub guest_protection_to_use: GuestProtection,
} }