kata-types:mount: support registering multiple IDs to a single handler

- Updated the `add_handler` function in `StorageHandlerManager` to accept a slice of IDs (`&[&str]`) instead of a single ID (`&str`).
  This change allows a single handler to be registered for multiple storage device types.
- Refactored calls to `add_handler` in `Storage` of kata-agent to use the new function, passing arrays of storage drivers instead of single driver.

Signed-off-by: ChengyuZhu6 <chengyu.zhu@intel.com>
This commit is contained in:
ChengyuZhu6 2024-09-03 15:10:13 +08:00
parent 4698235e59
commit e47eb0d7d4
2 changed files with 30 additions and 20 deletions

View File

@ -139,20 +139,20 @@ pub trait StorageHandler: Send + Sync {
lazy_static! { lazy_static! {
pub static ref STORAGE_HANDLERS: StorageHandlerManager<Arc<dyn StorageHandler>> = { pub static ref STORAGE_HANDLERS: StorageHandlerManager<Arc<dyn StorageHandler>> = {
let mut manager: StorageHandlerManager<Arc<dyn StorageHandler>> = StorageHandlerManager::new(); let mut manager: StorageHandlerManager<Arc<dyn StorageHandler>> = StorageHandlerManager::new();
manager.add_handler(DRIVER_9P_TYPE, Arc::new(Virtio9pHandler{})).unwrap(); manager.add_handler(&[DRIVER_9P_TYPE], Arc::new(Virtio9pHandler{})).unwrap();
#[cfg(target_arch = "s390x")] #[cfg(target_arch = "s390x")]
manager.add_handler(crate::device::DRIVER_BLK_CCW_TYPE, Arc::new(self::block_handler::VirtioBlkCcwHandler{})).unwrap(); manager.add_handler(&[crate::device::DRIVER_BLK_CCW_TYPE], Arc::new(self::block_handler::VirtioBlkCcwHandler{})).unwrap();
manager.add_handler(DRIVER_BLK_MMIO_TYPE, Arc::new(VirtioBlkMmioHandler{})).unwrap(); manager.add_handler(&[DRIVER_BLK_MMIO_TYPE], Arc::new(VirtioBlkMmioHandler{})).unwrap();
manager.add_handler(DRIVER_BLK_PCI_TYPE, Arc::new(VirtioBlkPciHandler{})).unwrap(); manager.add_handler(&[DRIVER_BLK_PCI_TYPE], Arc::new(VirtioBlkPciHandler{})).unwrap();
manager.add_handler(DRIVER_EPHEMERAL_TYPE, Arc::new(EphemeralHandler{})).unwrap(); manager.add_handler(&[DRIVER_EPHEMERAL_TYPE], Arc::new(EphemeralHandler{})).unwrap();
manager.add_handler(DRIVER_LOCAL_TYPE, Arc::new(LocalHandler{})).unwrap(); manager.add_handler(&[DRIVER_LOCAL_TYPE], Arc::new(LocalHandler{})).unwrap();
manager.add_handler(DRIVER_NVDIMM_TYPE, Arc::new(PmemHandler{})).unwrap(); manager.add_handler(&[DRIVER_NVDIMM_TYPE], Arc::new(PmemHandler{})).unwrap();
manager.add_handler(DRIVER_OVERLAYFS_TYPE, Arc::new(OverlayfsHandler{})).unwrap(); manager.add_handler(&[DRIVER_OVERLAYFS_TYPE], Arc::new(OverlayfsHandler{})).unwrap();
manager.add_handler(DRIVER_SCSI_TYPE, Arc::new(ScsiHandler{})).unwrap(); manager.add_handler(&[DRIVER_SCSI_TYPE], Arc::new(ScsiHandler{})).unwrap();
manager.add_handler(DRIVER_VIRTIOFS_TYPE, Arc::new(VirtioFsHandler{})).unwrap(); manager.add_handler(&[DRIVER_VIRTIOFS_TYPE], Arc::new(VirtioFsHandler{})).unwrap();
manager.add_handler(DRIVER_WATCHABLE_BIND_TYPE, Arc::new(BindWatcherHandler{})).unwrap(); manager.add_handler(&[DRIVER_WATCHABLE_BIND_TYPE], Arc::new(BindWatcherHandler{})).unwrap();
#[cfg(feature = "guest-pull")] #[cfg(feature = "guest-pull")]
manager.add_handler(KATA_VIRTUAL_VOLUME_IMAGE_GUEST_PULL, Arc::new(ImagePullHandler{})).unwrap(); manager.add_handler(&[KATA_VIRTUAL_VOLUME_IMAGE_GUEST_PULL], Arc::new(ImagePullHandler{})).unwrap();
manager manager
}; };
} }

View File

@ -446,13 +446,19 @@ pub struct StorageHandlerManager<H> {
handlers: HashMap<String, H>, handlers: HashMap<String, H>,
} }
impl<H> Default for StorageHandlerManager<H> { impl<H> Default for StorageHandlerManager<H>
where
H: Clone,
{
fn default() -> Self { fn default() -> Self {
Self::new() Self::new()
} }
} }
impl<H> StorageHandlerManager<H> { impl<H> StorageHandlerManager<H>
where
H: Clone,
{
/// Create a new instance of `StorageHandlerManager`. /// Create a new instance of `StorageHandlerManager`.
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
@ -461,14 +467,18 @@ impl<H> StorageHandlerManager<H> {
} }
/// Register a storage device handler. /// Register a storage device handler.
pub fn add_handler(&mut self, id: &str, handler: H) -> Result<()> { pub fn add_handler(&mut self, ids: &[&str], handler: H) -> Result<()> {
match self.handlers.entry(id.to_string()) { for &id in ids {
Entry::Occupied(_) => Err(anyhow!("storage handler for {} already exists", id)), match self.handlers.entry(id.to_string()) {
Entry::Vacant(entry) => { Entry::Occupied(_) => {
entry.insert(handler); return Err(anyhow!("storage handler for {} already exists", id));
Ok(()) }
Entry::Vacant(entry) => {
entry.insert(handler.clone());
}
} }
} }
Ok(())
} }
/// Get storage handler with specified `id`. /// Get storage handler with specified `id`.