diff --git a/src/libs/kata-types/src/handler.rs b/src/libs/kata-types/src/handler.rs index be7b05e12b..223434ddaf 100644 --- a/src/libs/kata-types/src/handler.rs +++ b/src/libs/kata-types/src/handler.rs @@ -12,13 +12,19 @@ pub struct HandlerManager { handlers: HashMap, } -impl Default for HandlerManager { +impl Default for HandlerManager +where + H: Clone, +{ fn default() -> Self { Self::new() } } -impl HandlerManager { +impl HandlerManager +where + H: Clone, +{ /// Create a new instance of `HandlerManager`. pub fn new() -> Self { Self { @@ -27,14 +33,18 @@ impl HandlerManager { } /// Register a handler. - pub fn add_handler(&mut self, id: &str, handler: H) -> Result<()> { - match self.handlers.entry(id.to_string()) { - Entry::Occupied(_) => Err(anyhow!("handler for {} already exists", id)), - Entry::Vacant(entry) => { - entry.insert(handler); - Ok(()) + pub fn add_handler(&mut self, ids: &[&str], handler: H) -> Result<()> { + for &id in ids { + match self.handlers.entry(id.to_string()) { + Entry::Occupied(_) => { + return Err(anyhow!("handler for {} already exists", id)); + } + Entry::Vacant(entry) => { + entry.insert(handler.clone()); + } } } + Ok(()) } /// Get handler with specified `id`. diff --git a/src/libs/kata-types/src/mount.rs b/src/libs/kata-types/src/mount.rs index da52a2a05b..b1d530467b 100644 --- a/src/libs/kata-types/src/mount.rs +++ b/src/libs/kata-types/src/mount.rs @@ -5,10 +5,11 @@ // use anyhow::{anyhow, Context, Error, Result}; -use std::collections::hash_map::Entry; use std::convert::TryFrom; use std::{collections::HashMap, fs, path::PathBuf}; +use crate::handler::HandlerManager; + /// Prefix to mark a volume as Kata special. pub const KATA_VOLUME_TYPE_PREFIX: &str = "kata:"; @@ -59,6 +60,9 @@ pub const KATA_VIRTUAL_VOLUME_LAYER_NYDUS_FS: &str = "layer_nydus_fs"; /// Download and extra container image inside guest vm. pub const KATA_VIRTUAL_VOLUME_IMAGE_GUEST_PULL: &str = "image_guest_pull"; +/// Manager to manage registered storage device handlers. +pub type StorageHandlerManager = HandlerManager; + /// Information about a mount. #[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] pub struct Mount { @@ -441,57 +445,6 @@ pub trait StorageDevice: Send + Sync { fn cleanup(&self) -> Result<()>; } -/// Manager to manage registered storage device handlers. -pub struct StorageHandlerManager { - handlers: HashMap, -} - -impl Default for StorageHandlerManager -where - H: Clone, -{ - fn default() -> Self { - Self::new() - } -} - -impl StorageHandlerManager -where - H: Clone, -{ - /// Create a new instance of `StorageHandlerManager`. - pub fn new() -> Self { - Self { - handlers: HashMap::new(), - } - } - - /// Register a storage device handler. - pub fn add_handler(&mut self, ids: &[&str], handler: H) -> Result<()> { - for &id in ids { - match self.handlers.entry(id.to_string()) { - Entry::Occupied(_) => { - return Err(anyhow!("storage handler for {} already exists", id)); - } - Entry::Vacant(entry) => { - entry.insert(handler.clone()); - } - } - } - Ok(()) - } - - /// Get storage handler with specified `id`. - pub fn handler(&self, id: &str) -> Option<&H> { - self.handlers.get(id) - } - - /// Get names of registered handlers. - pub fn get_handlers(&self) -> Vec { - self.handlers.keys().map(|v| v.to_string()).collect() - } -} - /// Join user provided volume path with kata direct-volume root path. /// /// The `volume_path` is base64-url-encoded and then safely joined to the `prefix`