diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 1c0b0a8a..79e79bdb 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -14,6 +14,47 @@ use crate::backup::*; mod catar; +fn prune( + param: Value, + _info: &ApiMethod, + _rpcenv: &mut RpcEnvironment, +) -> Result { + + let store = param["store"].as_str().unwrap(); + + let datastore = DataStore::lookup_datastore(store)?; + + println!("Starting prune on store {}", store); + + println!("PARAMS {:?}", param); + + + Ok(json!(null)) +} + +pub fn add_common_prune_prameters(schema: ObjectSchema) -> ObjectSchema { + + schema + .optional( + "keep-daily", + IntegerSchema::new("Number of daily backups to keep") + .minimum(0) + ) +} + +fn api_method_prune() -> ApiMethod { + ApiMethod::new( + prune, + add_common_prune_prameters( + ObjectSchema::new("Prune the datastore.") + .required( + "store", + StringSchema::new("Datastore name.") + ) + ) + ) +} + // this is just a test for mutability/mutex handling - will remove later fn start_garbage_collection( param: Value, @@ -109,9 +150,10 @@ pub fn router() -> Router { |_,_,_| Ok(json!([ {"subdir": "backups" }, {"subdir": "catar" }, - {"subdir": "status"}, - {"subdir": "gc" } - ])), + {"subdir": "gc" }, + {"subdir": "status" }, + {"subdir": "prune" }, + ])), ObjectSchema::new("Directory index.") .required("store", StringSchema::new("Datastore name."))) ) @@ -131,7 +173,11 @@ pub fn router() -> Router { "gc", Router::new() .get(api_method_garbage_collection_status()) - .post(api_method_start_garbage_collection())); + .post(api_method_start_garbage_collection())) + .subdir( + "prune", + Router::new() + .post(api_method_prune())); diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index 544f671c..491cf54f 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -232,6 +232,26 @@ pub fn complete_backup_source(arg: &str) -> Vec { result } +fn prune( + mut param: Value, + _info: &ApiMethod, + _rpcenv: &mut RpcEnvironment, +) -> Result { + + let repo_url = tools::required_string_param(¶m, "repository")?; + let repo = BackupRepository::parse(repo_url)?; + + let mut client = HttpClient::new(&repo.host, &repo.user); + + let path = format!("api2/json/admin/datastore/{}/prune", repo.store); + + param.as_object_mut().unwrap().remove("repository"); + + let result = client.post_json(&path, param)?; + + Ok(result) +} + fn main() { let repo_url_schema: Arc = Arc::new( @@ -286,10 +306,20 @@ fn main() { )) .arg_param(vec!["repository"]); + let prune_cmd_def = CliCommand::new( + ApiMethod::new( + prune, + proxmox_backup::api2::admin::datastore::add_common_prune_prameters( + ObjectSchema::new("Prune backup repository.") + .required("repository", repo_url_schema.clone()) + ) + )) + .arg_param(vec!["repository"]); let cmd_def = CliCommandMap::new() .insert("create".to_owned(), create_cmd_def.into()) .insert("garbage-collect".to_owned(), garbage_collect_cmd_def.into()) - .insert("list".to_owned(), list_cmd_def.into()); + .insert("list".to_owned(), list_cmd_def.into()) + .insert("prune".to_owned(), prune_cmd_def.into()); run_cli_command(cmd_def.into()); }