[pbs-devel] [PATCH proxmox-backup v12 11/26] bin: manager: add (un)mount command
Hannes Laimer
h.laimer at proxmox.com
Tue Oct 29 16:40:22 CET 2024
On Mon Oct 14, 2024 at 3:42 PM CEST, Fabian Grünbichler wrote:
> On September 4, 2024 4:11 pm, Hannes Laimer wrote:
> > Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
> > ---
> > pbs-config/src/datastore.rs | 14 ++++
> > src/bin/proxmox_backup_manager/datastore.rs | 76 ++++++++++++++++++++-
> > 2 files changed, 89 insertions(+), 1 deletion(-)
> >
> > diff --git a/pbs-config/src/datastore.rs b/pbs-config/src/datastore.rs
> > index dc5bb3da..396dcb37 100644
> > --- a/pbs-config/src/datastore.rs
> > +++ b/pbs-config/src/datastore.rs
> > @@ -62,6 +62,20 @@ pub fn complete_datastore_name(_arg: &str, _param: &HashMap<String, String>) ->
> > }
> > }
> >
> > +pub fn complete_removable_datastore_name(
> > + _arg: &str,
> > + _param: &HashMap<String, String>,
> > +) -> Vec<String> {
> > + match config() {
> > + Ok((data, _digest)) => data
> > + .sections
> > + .into_iter()
> > + .filter_map(|(name, (_, c))| c.get("backing-device").map(|_| name))
>
> nit: I'd prefer `.and(Some(name))`` instead of mapping just to throw the
> value away
>
> > + .collect(),
> > + Err(_) => Vec::new(),
> > + }
> > +}
> > +
> > pub fn complete_acl_path(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
> > let mut list = vec![
> > String::from("/"),
> > diff --git a/src/bin/proxmox_backup_manager/datastore.rs b/src/bin/proxmox_backup_manager/datastore.rs
> > index 383bcd24..f2795b39 100644
> > --- a/src/bin/proxmox_backup_manager/datastore.rs
> > +++ b/src/bin/proxmox_backup_manager/datastore.rs
> > @@ -1,4 +1,4 @@
> > -use anyhow::Error;
> > +use anyhow::{format_err, Error};
> > use serde_json::Value;
> >
> > use proxmox_router::{cli::*, ApiHandler, RpcEnvironment};
> > @@ -40,6 +40,34 @@ fn list_datastores(param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result<Valu
> > Ok(Value::Null)
> > }
> >
> > +#[api(
> > + protected: true,
> > + input: {
> > + properties: {
> > + store: {
> > + schema: DATASTORE_SCHEMA,
> > + },
> > + digest: {
> > + optional: true,
> > + schema: PROXMOX_CONFIG_DIGEST_SCHEMA,
> > + },
> > + },
> > + },
> > +)]
> > +/// Mount a removable datastore.
> > +async fn mount_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result<(), Error> {
>
> why can't this just delegate directly to the API endpoint? (if there is
> a reason, it would be nice to mention such things in the commit
> message..)
>
The mounting is done by a worker, and this worker has its parent (the CLI bin)
killed once it started the worker and finished. [1]
[1] https://lore.proxmox.com/pbs-devel/2bcb9be3-b4cf-450b-8cf1-1e74b49a58f2@proxmox.com/#t
> > + param["node"] = "localhost".into();
> > +
> > + let info = &api2::admin::datastore::API_METHOD_MOUNT;
> > + let result = match info.handler {
> > + ApiHandler::Sync(handler) => (handler)(param, info, rpcenv)?,
> > + _ => unreachable!(),
> > + };
> > +
> > + crate::wait_for_local_worker(result.as_str().unwrap()).await?;
> > + Ok(())
> > +}
> > +
> > #[api(
> > input: {
> > properties: {
> > @@ -99,6 +127,34 @@ async fn create_datastore(mut param: Value) -> Result<Value, Error> {
> > Ok(Value::Null)
> > }
> >
> > +#[api(
> > + protected: true,
> > + input: {
> > + properties: {
> > + store: {
> > + schema: DATASTORE_SCHEMA,
> > + },
> > + digest: {
> > + optional: true,
> > + schema: PROXMOX_CONFIG_DIGEST_SCHEMA,
> > + },
> > + },
> > + },
> > +)]
> > +/// Unmount a removable datastore.
> > +async fn unmount_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result<(), Error> {
>
> same question here?
>
> > + param["node"] = "localhost".into();
> > +
> > + let info = &api2::admin::datastore::API_METHOD_UNMOUNT;
> > + let result = match info.handler {
> > + ApiHandler::Async(handler) => (handler)(param, info, rpcenv).await?,
> > + _ => unreachable!(),
> > + };
> > +
> > + crate::wait_for_local_worker(result.as_str().unwrap()).await?;
> > + Ok(())
> > +}
> > +
> > #[api(
> > protected: true,
> > input: {
> > @@ -142,6 +198,15 @@ async fn delete_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) ->
> > pub fn datastore_commands() -> CommandLineInterface {
> > let cmd_def = CliCommandMap::new()
> > .insert("list", CliCommand::new(&API_METHOD_LIST_DATASTORES))
> > + .insert(
> > + "mount",
> > + CliCommand::new(&API_METHOD_MOUNT_DATASTORE)
> > + .arg_param(&["store"])
> > + .completion_cb(
> > + "store",
> > + pbs_config::datastore::complete_removable_datastore_name,
> > + ),
> > + )
> > .insert(
> > "show",
> > CliCommand::new(&API_METHOD_SHOW_DATASTORE)
> > @@ -152,6 +217,15 @@ pub fn datastore_commands() -> CommandLineInterface {
> > "create",
> > CliCommand::new(&API_METHOD_CREATE_DATASTORE).arg_param(&["name", "path"]),
> > )
> > + .insert(
> > + "unmount",
> > + CliCommand::new(&API_METHOD_UNMOUNT_DATASTORE)
> > + .arg_param(&["store"])
> > + .completion_cb(
> > + "store",
> > + pbs_config::datastore::complete_removable_datastore_name,
> > + ),
> > + )
> > .insert(
> > "update",
> > CliCommand::new(&api2::config::datastore::API_METHOD_UPDATE_DATASTORE)
> > --
> > 2.39.2
> >
> >
> >
> > _______________________________________________
> > pbs-devel mailing list
> > pbs-devel at lists.proxmox.com
> > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> >
> >
> >
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
More information about the pbs-devel
mailing list