[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