diff --git a/src/api2.rs b/src/api2.rs index 8cdfa89b..46c08a40 100644 --- a/src/api2.rs +++ b/src/api2.rs @@ -7,7 +7,7 @@ pub mod reader; mod subscription; pub mod types; pub mod version; -pub mod sync; +pub mod pull; use proxmox::api::list_subdirs_api_method; use proxmox::api::router::SubdirMap; @@ -21,9 +21,9 @@ pub const SUBDIRS: SubdirMap = &[ ("backup", &backup::ROUTER), ("config", &config::ROUTER), ("nodes", &NODES_ROUTER), + ("pull", &pull::ROUTER), ("reader", &reader::ROUTER), ("subscription", &subscription::ROUTER), - ("sync", &sync::ROUTER), ("version", &version::ROUTER), ]; diff --git a/src/api2/sync.rs b/src/api2/pull.rs similarity index 93% rename from src/api2/sync.rs rename to src/api2/pull.rs index e3b78703..06729000 100644 --- a/src/api2/sync.rs +++ b/src/api2/pull.rs @@ -1,3 +1,5 @@ +//! Sync datastore from remote server + use failure::*; use serde_json::json; use std::convert::TryFrom; @@ -15,9 +17,10 @@ use crate::client::*; use crate::api2::types::*; // fixme: implement filters +// fixme: delete vanished groups // Todo: correctly lock backup groups -async fn sync_index_chunks( +async fn pull_index_chunks( _worker: &WorkerTask, chunk_reader: &mut RemoteChunkReader, target: Arc, @@ -59,7 +62,7 @@ async fn download_manifest( Ok(tmp_manifest_file) } -async fn sync_single_archive( +async fn pull_single_archive( worker: &WorkerTask, reader: &BackupReader, chunk_reader: &mut RemoteChunkReader, @@ -89,13 +92,13 @@ async fn sync_single_archive( let index = DynamicIndexReader::new(tmpfile) .map_err(|err| format_err!("unable to read dynamic index {:?} - {}", tmp_path, err))?; - sync_index_chunks(worker, chunk_reader, tgt_store.clone(), index).await?; + pull_index_chunks(worker, chunk_reader, tgt_store.clone(), index).await?; } ArchiveType::FixedIndex => { let index = FixedIndexReader::new(tmpfile) .map_err(|err| format_err!("unable to read fixed index '{:?}' - {}", tmp_path, err))?; - sync_index_chunks(worker, chunk_reader, tgt_store.clone(), index).await?; + pull_index_chunks(worker, chunk_reader, tgt_store.clone(), index).await?; } ArchiveType::Blob => { /* nothing to do */ } } @@ -105,7 +108,7 @@ async fn sync_single_archive( Ok(()) } -async fn sync_snapshot( +async fn pull_snapshot( worker: &WorkerTask, reader: Arc, tgt_store: Arc, @@ -184,7 +187,7 @@ async fn sync_snapshot( } } - sync_single_archive( + pull_single_archive( worker, &reader, &mut chunk_reader, @@ -204,7 +207,7 @@ async fn sync_snapshot( Ok(()) } -pub async fn sync_snapshot_from( +pub async fn pull_snapshot_from( worker: &WorkerTask, reader: Arc, tgt_store: Arc, @@ -216,7 +219,7 @@ pub async fn sync_snapshot_from( if is_new { worker.log(format!("sync snapshot {:?}", snapshot.relative_path())); - if let Err(err) = sync_snapshot(worker, reader, tgt_store.clone(), &snapshot).await { + if let Err(err) = pull_snapshot(worker, reader, tgt_store.clone(), &snapshot).await { if let Err(cleanup_err) = tgt_store.remove_backup_dir(&snapshot) { worker.log(format!("cleanup error - {}", cleanup_err)); } @@ -224,13 +227,13 @@ pub async fn sync_snapshot_from( } } else { worker.log(format!("re-sync snapshot {:?}", snapshot.relative_path())); - sync_snapshot(worker, reader, tgt_store.clone(), &snapshot).await? + pull_snapshot(worker, reader, tgt_store.clone(), &snapshot).await? } Ok(()) } -pub async fn sync_group( +pub async fn pull_group( worker: &WorkerTask, client: &HttpClient, src_repo: &BackupRepository, @@ -278,13 +281,13 @@ pub async fn sync_group( let snapshot = BackupDir::new(item.backup_type, item.backup_id, item.backup_time); - sync_snapshot_from(worker, reader, tgt_store.clone(), &snapshot).await?; + pull_snapshot_from(worker, reader, tgt_store.clone(), &snapshot).await?; } Ok(()) } -pub async fn sync_store( +pub async fn pull_store( worker: &WorkerTask, client: &HttpClient, src_repo: &BackupRepository, @@ -319,7 +322,7 @@ pub async fn sync_store( let btype = item["backup-type"].as_str().unwrap(); let group = BackupGroup::new(btype, id); - if let Err(err) = sync_group(worker, client, src_repo, tgt_store.clone(), &group).await { + if let Err(err) = pull_group(worker, client, src_repo, tgt_store.clone(), &group).await { worker.log(format!("sync group {}/{} failed - {}", btype, id, err)); errors = true; // continue @@ -357,8 +360,8 @@ pub async fn sync_store( }, }, )] -/// Sync store from otherrepository -async fn sync_from ( +/// Sync store from other repository +async fn pull ( store: String, remote_host: String, remote_store: String, @@ -387,7 +390,7 @@ async fn sync_from ( // explicit create shared lock to prevent GC on newly created chunks let _shared_store_lock = tgt_store.try_shared_chunk_store_lock()?; - sync_store(&worker, &client, &src_repo, tgt_store.clone()).await?; + pull_store(&worker, &client, &src_repo, tgt_store.clone()).await?; worker.log(format!("sync datastore '{}' end", store)); @@ -398,4 +401,4 @@ async fn sync_from ( } pub const ROUTER: Router = Router::new() - .post(&API_METHOD_SYNC_FROM); + .post(&API_METHOD_PULL); diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 5afbbf80..229a1ec8 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -356,7 +356,7 @@ fn cert_mgmt_cli() -> CommandLineInterface { #[api( input: { properties: { - store: { + "local-store": { schema: DATASTORE_SCHEMA, }, remote: { @@ -373,11 +373,11 @@ fn cert_mgmt_cli() -> CommandLineInterface { } } )] -/// Start datastore sync -async fn start_datastore_sync( - store: String, +/// Sync datastore from another repository +async fn pull_datastore( remote: String, remote_store: String, + local_store: String, output_format: Option, ) -> Result { @@ -390,14 +390,14 @@ async fn start_datastore_sync( let remote: Remote = remote_config.lookup("remote", &remote)?; let args = json!({ - "store": store, + "store": local_store, "remote-host": remote.host, "remote-user": remote.userid, "remote-store": remote_store, "remote-password": remote.password, }); - let result = client.post("api2/json/sync", Some(args)).await?; + let result = client.post("api2/json/pull", Some(args)).await?; view_task_result(client, result, &output_format).await?; @@ -412,10 +412,10 @@ fn main() { .insert("cert", cert_mgmt_cli()) .insert("task", task_mgmt_cli()) .insert( - "sync", - CliCommand::new(&API_METHOD_START_DATASTORE_SYNC) - .arg_param(&["store", "remote", "remote-store"]) - .completion_cb("store", config::datastore::complete_datastore_name) + "pull", + CliCommand::new(&API_METHOD_PULL_DATASTORE) + .arg_param(&["remote", "remote-store", "local-store"]) + .completion_cb("local-store", config::datastore::complete_datastore_name) .completion_cb("remote", config::remotes::complete_remote_name) );