api: admin/datastore: add new 'prune-datastore' api call

to prune the whole datastore at once, with the given parameters.
We need a new api call since this can take a while and we need to start
a worker for this. The exisiting api call returns a list of removed/kept
snapshots and is synchronous.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak
2021-07-16 10:53:26 +02:00
committed by Dietmar Maurer
parent 8e0b852f24
commit 9805207aa5
2 changed files with 69 additions and 3 deletions

View File

@ -820,7 +820,7 @@ pub fn verify(
permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_MODIFY | PRIV_DATASTORE_PRUNE, true),
},
)]
/// Prune the datastore
/// Prune a group on the datastore
pub fn prune(
backup_id: String,
backup_type: String,
@ -922,6 +922,62 @@ pub fn prune(
Ok(json!(prune_result))
}
#[api(
input: {
properties: {
"dry-run": {
optional: true,
type: bool,
default: false,
description: "Just show what prune would do, but do not delete anything.",
},
"prune-options": {
type: PruneOptions,
flatten: true,
},
store: {
schema: DATASTORE_SCHEMA,
},
},
},
returns: {
schema: UPID_SCHEMA,
},
access: {
permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_MODIFY | PRIV_DATASTORE_PRUNE, true),
},
)]
/// Prune the datastore
pub fn prune_datastore(
dry_run: bool,
prune_options: PruneOptions,
store: String,
_param: Value,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<String, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let datastore = DataStore::lookup_datastore(&store)?;
let upid_str = WorkerTask::new_thread(
"prune",
Some(store.clone()),
auth_id.clone(),
false,
move |worker| crate::server::prune_datastore(
worker.clone(),
auth_id,
prune_options,
&store,
datastore,
dry_run
),
)?;
Ok(upid_str)
}
#[api(
input: {
properties: {
@ -1844,6 +1900,11 @@ const DATASTORE_INFO_SUBDIRS: SubdirMap = &[
&Router::new()
.post(&API_METHOD_PRUNE)
),
(
"prune-datastore",
&Router::new()
.post(&API_METHOD_PRUNE_DATASTORE)
),
(
"pxar-file-download",
&Router::new()