mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-05 18:14:55 +00:00
agent: implement update_ephemeral_mounts api
- implement update_ephemeral_mounts rpc - for each mountpoint passed in, remount it with new options Signed-off-by: Sidhartha Mani <sidhartha_mani@apple.com>
This commit is contained in:
parent
3896c7a22b
commit
16e2c3cc55
@ -240,6 +240,70 @@ async fn ephemeral_storage_handler(
|
|||||||
Ok("".to_string())
|
Ok("".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update_ephemeral_mounts takes a list of ephemeral mounts and remounts them
|
||||||
|
// with mount options passed by the caller
|
||||||
|
#[instrument]
|
||||||
|
pub async fn update_ephemeral_mounts(
|
||||||
|
logger: Logger,
|
||||||
|
storages: Vec<Storage>,
|
||||||
|
sandbox: Arc<Mutex<Sandbox>>,
|
||||||
|
) -> Result<()> {
|
||||||
|
for (_, storage) in storages.iter().enumerate() {
|
||||||
|
let handler_name = storage.driver.clone();
|
||||||
|
let logger = logger.new(o!(
|
||||||
|
"msg" => "updating tmpfs storage",
|
||||||
|
"subsystem" => "storage",
|
||||||
|
"storage-type" => handler_name.to_owned()));
|
||||||
|
|
||||||
|
match handler_name.as_str() {
|
||||||
|
DRIVER_EPHEMERAL_TYPE => {
|
||||||
|
fs::create_dir_all(Path::new(&storage.mount_point))?;
|
||||||
|
|
||||||
|
if storage.options.is_empty() {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
// assume that fsGid has already been set
|
||||||
|
let mut opts = Vec::<&str>::new();
|
||||||
|
for (_, opt) in storage.options.iter().enumerate() {
|
||||||
|
if opt.starts_with(FS_GID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
opts.push(opt)
|
||||||
|
}
|
||||||
|
let mount_path = Path::new(&storage.mount_point);
|
||||||
|
let src_path = Path::new(&storage.source);
|
||||||
|
|
||||||
|
let (flags, options) = parse_mount_flags_and_options(opts);
|
||||||
|
|
||||||
|
info!(logger, "mounting storage";
|
||||||
|
"mount-source" => src_path.display(),
|
||||||
|
"mount-destination" => mount_path.display(),
|
||||||
|
"mount-fstype" => storage.fstype.as_str(),
|
||||||
|
"mount-options" => options.as_str(),
|
||||||
|
);
|
||||||
|
|
||||||
|
return baremount(
|
||||||
|
src_path,
|
||||||
|
mount_path,
|
||||||
|
storage.fstype.as_str(),
|
||||||
|
flags,
|
||||||
|
options.as_str(),
|
||||||
|
&logger,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"Unsupported storage type for syncing mounts {}. Only ephemeral storage update is supported",
|
||||||
|
storage.driver.to_owned()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[instrument]
|
#[instrument]
|
||||||
async fn overlayfs_storage_handler(
|
async fn overlayfs_storage_handler(
|
||||||
logger: &Logger,
|
logger: &Logger,
|
||||||
|
@ -51,7 +51,7 @@ use crate::device::{
|
|||||||
};
|
};
|
||||||
use crate::linux_abi::*;
|
use crate::linux_abi::*;
|
||||||
use crate::metrics::get_metrics;
|
use crate::metrics::get_metrics;
|
||||||
use crate::mount::{add_storages, baremount, STORAGE_HANDLER_LIST};
|
use crate::mount::{add_storages, baremount, update_ephemeral_mounts, STORAGE_HANDLER_LIST};
|
||||||
use crate::namespace::{NSTYPEIPC, NSTYPEPID, NSTYPEUTS};
|
use crate::namespace::{NSTYPEIPC, NSTYPEPID, NSTYPEUTS};
|
||||||
use crate::network::setup_guest_dns;
|
use crate::network::setup_guest_dns;
|
||||||
use crate::pci;
|
use crate::pci;
|
||||||
@ -997,6 +997,23 @@ impl agent_ttrpc::AgentService for AgentService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn update_ephemeral_mounts(
|
||||||
|
&self,
|
||||||
|
ctx: &TtrpcContext,
|
||||||
|
req: protocols::agent::UpdateEphemeralMountsRequest,
|
||||||
|
) -> ttrpc::Result<Empty> {
|
||||||
|
trace_rpc_call!(ctx, "update_mounts", req);
|
||||||
|
is_allowed!(req);
|
||||||
|
|
||||||
|
match update_ephemeral_mounts(sl!(), req.storages.to_vec(), self.sandbox.clone()).await {
|
||||||
|
Ok(_) => Ok(Empty::new()),
|
||||||
|
Err(e) => Err(ttrpc_error!(
|
||||||
|
ttrpc::Code::INTERNAL,
|
||||||
|
format!("Failed to update mounts: {:?}", e),
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn get_ip_tables(
|
async fn get_ip_tables(
|
||||||
&self,
|
&self,
|
||||||
ctx: &TtrpcContext,
|
ctx: &TtrpcContext,
|
||||||
|
Loading…
Reference in New Issue
Block a user