mirror of
				https://github.com/kata-containers/kata-containers.git
				synced 2025-10-31 17:37:20 +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:
		| @@ -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("") | ||||||
|     }; |     }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user