mirror of
https://github.com/aljazceru/kata-containers.git
synced 2025-12-18 23:04:20 +01:00
According to the runtime OCI Spec, there can be some hook operations in the lifecycle of the container. In these hook operations, the runtime can execute some commands. There are different points in time in the container lifecycle and different hook types can be executed. In this commit, we are now supporting 4 types of hooks(same in runtime-go): Prestart hook, CreateRuntime hook, Poststart hook and Poststop hook. Fixes: #5787 Signed-off-by: Yushuo <y-shuo@linux.alibaba.com>
140 lines
3.4 KiB
Rust
140 lines
3.4 KiB
Rust
// Copyright (c) 2022 Red Hat
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
mod inner;
|
|
|
|
use crate::device::Device;
|
|
use crate::hypervisor_persist::HypervisorState;
|
|
use crate::Hypervisor;
|
|
use crate::{HypervisorConfig, VcpuThreadIds};
|
|
use inner::QemuInner;
|
|
use kata_types::capabilities::Capabilities;
|
|
|
|
use anyhow::Result;
|
|
use async_trait::async_trait;
|
|
|
|
use std::sync::Arc;
|
|
use tokio::sync::RwLock;
|
|
|
|
pub struct Qemu {
|
|
inner: Arc<RwLock<QemuInner>>,
|
|
}
|
|
|
|
impl Default for Qemu {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
impl Qemu {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
inner: Arc::new(RwLock::new(QemuInner::new())),
|
|
}
|
|
}
|
|
|
|
pub async fn set_hypervisor_config(&mut self, config: HypervisorConfig) {
|
|
let mut inner = self.inner.write().await;
|
|
inner.set_hypervisor_config(config)
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Hypervisor for Qemu {
|
|
async fn prepare_vm(&self, id: &str, netns: Option<String>) -> Result<()> {
|
|
let mut inner = self.inner.write().await;
|
|
inner.prepare_vm(id, netns).await
|
|
}
|
|
|
|
async fn start_vm(&self, timeout: i32) -> Result<()> {
|
|
let mut inner = self.inner.write().await;
|
|
inner.start_vm(timeout).await
|
|
}
|
|
|
|
async fn stop_vm(&self) -> Result<()> {
|
|
let mut inner = self.inner.write().await;
|
|
inner.stop_vm()
|
|
}
|
|
|
|
async fn pause_vm(&self) -> Result<()> {
|
|
let inner = self.inner.read().await;
|
|
inner.pause_vm()
|
|
}
|
|
|
|
async fn resume_vm(&self) -> Result<()> {
|
|
let inner = self.inner.read().await;
|
|
inner.resume_vm()
|
|
}
|
|
|
|
async fn save_vm(&self) -> Result<()> {
|
|
let inner = self.inner.read().await;
|
|
inner.save_vm().await
|
|
}
|
|
|
|
async fn add_device(&self, device: Device) -> Result<()> {
|
|
let mut inner = self.inner.write().await;
|
|
inner.add_device(device).await
|
|
}
|
|
|
|
async fn remove_device(&self, device: Device) -> Result<()> {
|
|
let mut inner = self.inner.write().await;
|
|
inner.remove_device(device).await
|
|
}
|
|
|
|
async fn get_agent_socket(&self) -> Result<String> {
|
|
let inner = self.inner.read().await;
|
|
inner.get_agent_socket().await
|
|
}
|
|
|
|
async fn disconnect(&self) {
|
|
let mut inner = self.inner.write().await;
|
|
inner.disconnect().await
|
|
}
|
|
|
|
async fn hypervisor_config(&self) -> HypervisorConfig {
|
|
let inner = self.inner.read().await;
|
|
inner.hypervisor_config()
|
|
}
|
|
|
|
async fn get_thread_ids(&self) -> Result<VcpuThreadIds> {
|
|
let inner = self.inner.read().await;
|
|
inner.get_thread_ids().await
|
|
}
|
|
|
|
async fn get_vmm_master_tid(&self) -> Result<u32> {
|
|
let inner = self.inner.read().await;
|
|
inner.get_vmm_master_tid().await
|
|
}
|
|
|
|
async fn cleanup(&self) -> Result<()> {
|
|
let inner = self.inner.read().await;
|
|
inner.cleanup().await
|
|
}
|
|
|
|
async fn get_pids(&self) -> Result<Vec<u32>> {
|
|
let inner = self.inner.read().await;
|
|
inner.get_pids().await
|
|
}
|
|
|
|
async fn check(&self) -> Result<()> {
|
|
let inner = self.inner.read().await;
|
|
inner.check().await
|
|
}
|
|
|
|
async fn get_jailer_root(&self) -> Result<String> {
|
|
let inner = self.inner.read().await;
|
|
inner.get_jailer_root().await
|
|
}
|
|
|
|
async fn save_state(&self) -> Result<HypervisorState> {
|
|
todo!()
|
|
}
|
|
|
|
async fn capabilities(&self) -> Result<Capabilities> {
|
|
let inner = self.inner.read().await;
|
|
inner.capabilities().await
|
|
}
|
|
}
|