From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id F343C76885 for ; Fri, 16 Jul 2021 10:54:03 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 5B990E215 for ; Fri, 16 Jul 2021 10:53:32 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 614C8E195 for ; Fri, 16 Jul 2021 10:53:29 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 3B1D842152 for ; Fri, 16 Jul 2021 10:53:29 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Fri, 16 Jul 2021 10:53:20 +0200 Message-Id: <20210716085328.3731574-4-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210716085328.3731574-1-d.csapak@proxmox.com> References: <20210716085328.3731574-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.585 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox-backup 03/11] client: simplify prune api method X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Jul 2021 08:54:04 -0000 by using the api macro on the async method and reusing the PruneOptions from pbs-datastore with 'flatten: true' Signed-off-by: Dominik Csapak --- src/bin/proxmox-backup-client.rs | 95 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index b110763e..a5810538 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -6,7 +6,6 @@ use std::sync::{Arc, Mutex}; use std::task::Context; use anyhow::{bail, format_err, Error}; -use futures::future::FutureExt; use futures::stream::{StreamExt, TryStreamExt}; use serde_json::{json, Value}; use tokio::sync::mpsc; @@ -21,10 +20,8 @@ use proxmox::{ }, api::{ api, - ApiHandler, ApiMethod, RpcEnvironment, - schema::*, cli::*, }, }; @@ -65,6 +62,7 @@ use proxmox_backup::backup::{ IndexFile, MANIFEST_BLOB_NAME, Shell, + PruneOptions, }; mod proxmox_backup_client; @@ -1225,60 +1223,65 @@ async fn restore(param: Value) -> Result { Ok(Value::Null) } -const API_METHOD_PRUNE: ApiMethod = ApiMethod::new( - &ApiHandler::Async(&prune), - &ObjectSchema::new( - "Prune a backup repository.", - &proxmox_backup::add_common_prune_prameters!([ - ("dry-run", true, &BooleanSchema::new( - "Just show what prune would do, but do not delete anything.") - .schema()), - ("group", false, &StringSchema::new("Backup group.").schema()), - ], [ - ("output-format", true, &OUTPUT_FORMAT), - ( - "quiet", - true, - &BooleanSchema::new("Minimal output - only show removals.") - .schema() - ), - ("repository", true, &REPO_URL_SCHEMA), - ]) - ) -); - -fn prune<'a>( - param: Value, - _info: &ApiMethod, - _rpcenv: &'a mut dyn RpcEnvironment, -) -> proxmox::api::ApiFuture<'a> { - async move { - prune_async(param).await - }.boxed() -} - -async fn prune_async(mut param: Value) -> Result { +#[api( + input: { + properties: { + "dry-run": { + type: bool, + optional: true, + description: "Just show what prune would do, but do not delete anything.", + }, + group: { + type: String, + description: "Backup group", + }, + "prune-options": { + type: PruneOptions, + flatten: true, + }, + "output-format": { + schema: OUTPUT_FORMAT, + optional: true, + }, + quiet: { + type: bool, + optional: true, + default: false, + description: "Minimal output - only show removals.", + }, + repository: { + schema: REPO_URL_SCHEMA, + optional: true, + }, + }, + }, +)] +/// Prune a backup repository. +async fn prune( + dry_run: Option, + group: String, + prune_options: PruneOptions, + quiet: bool, + mut param: Value +) -> Result { let repo = extract_repository_from_value(¶m)?; let mut client = connect(&repo)?; let path = format!("api2/json/admin/datastore/{}/prune", repo.store()); - let group = tools::required_string_param(¶m, "group")?; let group: BackupGroup = group.parse()?; let output_format = extract_output_format(&mut param); - let quiet = param["quiet"].as_bool().unwrap_or(false); - - param.as_object_mut().unwrap().remove("repository"); - param.as_object_mut().unwrap().remove("group"); - param.as_object_mut().unwrap().remove("quiet"); - - param["backup-type"] = group.backup_type().into(); - param["backup-id"] = group.backup_id().into(); + let mut api_param = serde_json::to_value(prune_options)?; + if let Some(dry_run) = dry_run { + api_param["dry-run"] = dry_run.into(); + } + api_param["backup-type"] = group.backup_type().into(); + api_param["backup-id"] = group.backup_id().into(); - let mut result = client.post(&path, Some(param)).await?; + let mut result = client.post(&path, Some(api_param)).await?; record_repository(&repo); -- 2.30.2