mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-07 22:45:31 +00:00
kata-deploy: get the config path from cri options
get the config path for runtime-rs from cri options Fixes: #5000 Signed-off-by: Zhongtao Hu <zhongtaohu.tim@linux.alibaba.com>
This commit is contained in:
parent
c6b3dcb67d
commit
d663f110d7
@ -128,6 +128,7 @@ pub struct ContainerConfig {
|
|||||||
pub bundle: String,
|
pub bundle: String,
|
||||||
pub rootfs_mounts: Vec<Mount>,
|
pub rootfs_mounts: Vec<Mount>,
|
||||||
pub terminal: bool,
|
pub terminal: bool,
|
||||||
|
pub options: Option<Vec<u8>>,
|
||||||
pub stdin: Option<String>,
|
pub stdin: Option<String>,
|
||||||
pub stdout: Option<String>,
|
pub stdout: Option<String>,
|
||||||
pub stderr: Option<String>,
|
pub stderr: Option<String>,
|
||||||
|
@ -4,19 +4,17 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
//
|
//
|
||||||
|
|
||||||
use std::{
|
|
||||||
convert::{From, TryFrom},
|
|
||||||
path::PathBuf,
|
|
||||||
};
|
|
||||||
|
|
||||||
use anyhow::{Context, Result};
|
|
||||||
use containerd_shim_protos::api;
|
|
||||||
use kata_types::mount::Mount;
|
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
ContainerConfig, ContainerID, ContainerProcess, ExecProcessRequest, KillRequest, Request,
|
ContainerConfig, ContainerID, ContainerProcess, ExecProcessRequest, KillRequest, Request,
|
||||||
ResizePTYRequest, ShutdownRequest, UpdateRequest,
|
ResizePTYRequest, ShutdownRequest, UpdateRequest,
|
||||||
};
|
};
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use containerd_shim_protos::api;
|
||||||
|
use kata_types::mount::Mount;
|
||||||
|
use std::{
|
||||||
|
convert::{From, TryFrom},
|
||||||
|
path::PathBuf,
|
||||||
|
};
|
||||||
|
|
||||||
fn trans_from_shim_mount(from: api::Mount) -> Mount {
|
fn trans_from_shim_mount(from: api::Mount) -> Mount {
|
||||||
let options = from.options.to_vec();
|
let options = from.options.to_vec();
|
||||||
@ -42,6 +40,11 @@ fn trans_from_shim_mount(from: api::Mount) -> Mount {
|
|||||||
impl TryFrom<api::CreateTaskRequest> for Request {
|
impl TryFrom<api::CreateTaskRequest> for Request {
|
||||||
type Error = anyhow::Error;
|
type Error = anyhow::Error;
|
||||||
fn try_from(from: api::CreateTaskRequest) -> Result<Self> {
|
fn try_from(from: api::CreateTaskRequest) -> Result<Self> {
|
||||||
|
let options = if from.has_options() {
|
||||||
|
Some(from.get_options().get_value().to_vec())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
Ok(Request::CreateContainer(ContainerConfig {
|
Ok(Request::CreateContainer(ContainerConfig {
|
||||||
container_id: from.id.clone(),
|
container_id: from.id.clone(),
|
||||||
bundle: from.bundle.clone(),
|
bundle: from.bundle.clone(),
|
||||||
@ -52,6 +55,7 @@ impl TryFrom<api::CreateTaskRequest> for Request {
|
|||||||
.map(trans_from_shim_mount)
|
.map(trans_from_shim_mount)
|
||||||
.collect(),
|
.collect(),
|
||||||
terminal: from.terminal,
|
terminal: from.terminal,
|
||||||
|
options,
|
||||||
stdin: (!from.stdin.is_empty()).then(|| from.stdin.clone()),
|
stdin: (!from.stdin.is_empty()).then(|| from.stdin.clone()),
|
||||||
stdout: (!from.stdout.is_empty()).then(|| from.stdout.clone()),
|
stdout: (!from.stdout.is_empty()).then(|| from.stdout.clone()),
|
||||||
stderr: (!from.stderr.is_empty()).then(|| from.stderr.clone()),
|
stderr: (!from.stderr.is_empty()).then(|| from.stderr.clone()),
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
//
|
//
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::{str::from_utf8, sync::Arc};
|
||||||
|
|
||||||
use anyhow::{anyhow, Context, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ impl RuntimeHandlerManagerInner {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_init(&mut self, spec: &oci::Spec) -> Result<()> {
|
async fn try_init(&mut self, spec: &oci::Spec, options: &Option<Vec<u8>>) -> Result<()> {
|
||||||
// return if runtime instance has init
|
// return if runtime instance has init
|
||||||
if self.runtime_instance.is_some() {
|
if self.runtime_instance.is_some() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -104,7 +104,7 @@ impl RuntimeHandlerManagerInner {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let config = load_config(spec).context("load config")?;
|
let config = load_config(spec, options).context("load config")?;
|
||||||
self.init_runtime_handler(netns, Arc::new(config))
|
self.init_runtime_handler(netns, Arc::new(config))
|
||||||
.await
|
.await
|
||||||
.context("init runtime handler")?;
|
.context("init runtime handler")?;
|
||||||
@ -172,9 +172,13 @@ impl RuntimeHandlerManager {
|
|||||||
.ok_or_else(|| anyhow!("runtime not ready"))
|
.ok_or_else(|| anyhow!("runtime not ready"))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_init_runtime_instance(&self, spec: &oci::Spec) -> Result<()> {
|
async fn try_init_runtime_instance(
|
||||||
|
&self,
|
||||||
|
spec: &oci::Spec,
|
||||||
|
options: &Option<Vec<u8>>,
|
||||||
|
) -> Result<()> {
|
||||||
let mut inner = self.inner.write().await;
|
let mut inner = self.inner.write().await;
|
||||||
inner.try_init(spec).await
|
inner.try_init(spec, options).await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handler_message(&self, req: Request) -> Result<Response> {
|
pub async fn handler_message(&self, req: Request) -> Result<Response> {
|
||||||
@ -183,7 +187,7 @@ impl RuntimeHandlerManager {
|
|||||||
let bundler_path = format!("{}/{}", req.bundle, oci::OCI_SPEC_CONFIG_FILE_NAME);
|
let bundler_path = format!("{}/{}", req.bundle, oci::OCI_SPEC_CONFIG_FILE_NAME);
|
||||||
let spec = oci::Spec::load(&bundler_path).context("load spec")?;
|
let spec = oci::Spec::load(&bundler_path).context("load spec")?;
|
||||||
|
|
||||||
self.try_init_runtime_instance(&spec)
|
self.try_init_runtime_instance(&spec, &req.options)
|
||||||
.await
|
.await
|
||||||
.context("try init runtime instance")?;
|
.context("try init runtime instance")?;
|
||||||
let instance = self
|
let instance = self
|
||||||
@ -298,13 +302,21 @@ impl RuntimeHandlerManager {
|
|||||||
/// 2. shimv2 create task option
|
/// 2. shimv2 create task option
|
||||||
/// TODO: https://github.com/kata-containers/kata-containers/issues/3961
|
/// TODO: https://github.com/kata-containers/kata-containers/issues/3961
|
||||||
/// 3. environment
|
/// 3. environment
|
||||||
fn load_config(spec: &oci::Spec) -> Result<TomlConfig> {
|
fn load_config(spec: &oci::Spec, option: &Option<Vec<u8>>) -> Result<TomlConfig> {
|
||||||
const KATA_CONF_FILE: &str = "KATA_CONF_FILE";
|
const KATA_CONF_FILE: &str = "KATA_CONF_FILE";
|
||||||
let annotation = Annotation::new(spec.annotations.clone());
|
let annotation = Annotation::new(spec.annotations.clone());
|
||||||
let config_path = if let Some(path) = annotation.get_sandbox_config_path() {
|
let config_path = if let Some(path) = annotation.get_sandbox_config_path() {
|
||||||
path
|
path
|
||||||
} else if let Ok(path) = std::env::var(KATA_CONF_FILE) {
|
} else if let Ok(path) = std::env::var(KATA_CONF_FILE) {
|
||||||
path
|
path
|
||||||
|
} else if let Some(option) = option {
|
||||||
|
// get rid of the special characters in options to get the config path
|
||||||
|
let path = if option.len() > 2 {
|
||||||
|
from_utf8(&option[2..])?.to_string()
|
||||||
|
} else {
|
||||||
|
String::from("")
|
||||||
|
};
|
||||||
|
path
|
||||||
} else {
|
} else {
|
||||||
String::from("")
|
String::from("")
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user