api: datastore: cleanup store/ns handling

this should just avoid some clones, no semantic changes intended.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Grünbichler 2022-05-25 11:11:12 +02:00 committed by Thomas Lamprecht
parent ea2e91e52f
commit 974a3e521a
1 changed files with 54 additions and 66 deletions

View File

@ -187,10 +187,9 @@ pub fn list_groups(
) -> Result<Vec<GroupListItem>, Error> { ) -> Result<Vec<GroupListItem>, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store: store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let list_all = !check_ns_privs_full( let list_all = !check_ns_privs_full(
@ -200,14 +199,14 @@ pub fn list_groups(
PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_BACKUP,
)?; )?;
let datastore = DataStore::lookup_datastore(&store, Some(Operation::Read))?; let datastore = DataStore::lookup_datastore(&store_with_ns.store, Some(Operation::Read))?;
datastore datastore
.iter_backup_groups(ns.clone())? // FIXME: Namespaces and recursion parameters! .iter_backup_groups(store_with_ns.ns.clone())? // FIXME: Namespaces and recursion parameters!
.try_fold(Vec::new(), |mut group_info, group| { .try_fold(Vec::new(), |mut group_info, group| {
let group = group?; let group = group?;
let owner = match datastore.get_owner(&ns, group.as_ref()) { let owner = match datastore.get_owner(&store_with_ns.ns, group.as_ref()) {
Ok(auth_id) => auth_id, Ok(auth_id) => auth_id,
Err(err) => { Err(err) => {
eprintln!( eprintln!(
@ -244,7 +243,7 @@ pub fn list_groups(
}) })
.to_owned(); .to_owned();
let note_path = get_group_note_path(&datastore, &ns, group.as_ref()); let note_path = get_group_note_path(&datastore, &store_with_ns.ns, group.as_ref());
let comment = file_read_firstline(&note_path).ok(); let comment = file_read_firstline(&note_path).ok();
group_info.push(GroupListItem { group_info.push(GroupListItem {
@ -290,13 +289,13 @@ pub fn delete_group(
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default(); let store_with_ns = DatastoreWithNamespace {
store,
ns: ns.unwrap_or_default(),
};
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
&DatastoreWithNamespace { &store_with_ns,
store: store.clone(),
ns: ns.clone(),
},
&auth_id, &auth_id,
PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_MODIFY,
PRIV_DATASTORE_PRUNE, PRIV_DATASTORE_PRUNE,
@ -304,7 +303,7 @@ pub fn delete_group(
&group, &group,
)?; )?;
if !datastore.remove_backup_group(&ns, &group)? { if !datastore.remove_backup_group(&store_with_ns.ns, &group)? {
bail!("group only partially deleted due to protected snapshots"); bail!("group only partially deleted due to protected snapshots");
} }
@ -342,10 +341,9 @@ pub fn list_snapshot_files(
) -> Result<Vec<BackupContent>, Error> { ) -> Result<Vec<BackupContent>, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store: store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -357,7 +355,7 @@ pub fn list_snapshot_files(
&backup_dir.group, &backup_dir.group,
)?; )?;
let snapshot = datastore.backup_dir(ns, backup_dir)?; let snapshot = datastore.backup_dir(store_with_ns.ns, backup_dir)?;
let info = BackupInfo::new(snapshot)?; let info = BackupInfo::new(snapshot)?;
@ -396,10 +394,9 @@ pub fn delete_snapshot(
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store: store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -411,7 +408,7 @@ pub fn delete_snapshot(
&backup_dir.group, &backup_dir.group,
)?; )?;
let snapshot = datastore.backup_dir(ns, backup_dir)?; let snapshot = datastore.backup_dir(store_with_ns.ns, backup_dir)?;
snapshot.destroy(false)?; snapshot.destroy(false)?;
@ -458,7 +455,7 @@ pub fn list_snapshots(
let ns = ns.unwrap_or_default(); let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.clone(),
}; };
@ -469,7 +466,7 @@ pub fn list_snapshots(
PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_BACKUP,
)?; )?;
let datastore = DataStore::lookup_datastore(&store, Some(Operation::Read))?; let datastore = DataStore::lookup_datastore(&store_with_ns.store, Some(Operation::Read))?;
// FIXME: filter also owner before collecting, for doing that nicely the owner should move into // FIXME: filter also owner before collecting, for doing that nicely the owner should move into
// backup group and provide an error free (Err -> None) accessor // backup group and provide an error free (Err -> None) accessor
@ -749,7 +746,7 @@ pub fn verify(
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default(); let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.clone(),
}; };
@ -760,7 +757,7 @@ pub fn verify(
PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_BACKUP,
)?; )?;
let datastore = DataStore::lookup_datastore(&store, Some(Operation::Read))?; let datastore = DataStore::lookup_datastore(&store_with_ns.store, Some(Operation::Read))?;
let ignore_verified = ignore_verified.unwrap_or(true); let ignore_verified = ignore_verified.unwrap_or(true);
let worker_id; let worker_id;
@ -773,7 +770,7 @@ pub fn verify(
(Some(backup_type), Some(backup_id), Some(backup_time)) => { (Some(backup_type), Some(backup_id), Some(backup_time)) => {
worker_id = format!( worker_id = format!(
"{}:{}/{}/{}/{:08X}", "{}:{}/{}/{}/{:08X}",
store, store_with_ns.store,
ns.display_as_path(), ns.display_as_path(),
backup_type, backup_type,
backup_id, backup_id,
@ -793,7 +790,7 @@ pub fn verify(
(Some(backup_type), Some(backup_id), None) => { (Some(backup_type), Some(backup_id), None) => {
worker_id = format!( worker_id = format!(
"{}:{}/{}/{}", "{}:{}/{}/{}",
store, store_with_ns.store,
ns.display_as_path(), ns.display_as_path(),
backup_type, backup_type,
backup_id backup_id
@ -810,9 +807,9 @@ pub fn verify(
} }
(None, None, None) => { (None, None, None) => {
worker_id = if ns.is_root() { worker_id = if ns.is_root() {
store.clone() format!("{}", store_with_ns.store)
} else { } else {
format!("{store}:{}", ns.display_as_path()) format!("{}:{}", store_with_ns.store, ns.display_as_path())
}; };
} }
_ => bail!("parameters do not specify a backup group or snapshot"), _ => bail!("parameters do not specify a backup group or snapshot"),
@ -924,10 +921,9 @@ pub fn prune(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -939,8 +935,8 @@ pub fn prune(
&group, &group,
)?; )?;
let worker_id = format!("{}:{}:{}", store, ns, group); let worker_id = format!("{}:{}:{}", store_with_ns.store, store_with_ns.ns, group);
let group = datastore.backup_group(ns, group); let group = datastore.backup_group(store_with_ns.ns.clone(), group);
let mut prune_result = Vec::new(); let mut prune_result = Vec::new();
@ -1571,10 +1567,9 @@ pub fn catalog(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<Vec<ArchiveEntry>, Error> { ) -> Result<Vec<ArchiveEntry>, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -1586,7 +1581,7 @@ pub fn catalog(
&backup_dir.group, &backup_dir.group,
)?; )?;
let backup_dir = datastore.backup_dir(ns, backup_dir)?; let backup_dir = datastore.backup_dir(store_with_ns.ns.clone(), backup_dir)?;
let file_name = CATALOG_NAME; let file_name = CATALOG_NAME;
@ -1864,10 +1859,9 @@ pub fn get_group_notes(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<String, Error> { ) -> Result<String, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -1879,7 +1873,7 @@ pub fn get_group_notes(
&backup_group, &backup_group,
)?; )?;
let note_path = get_group_note_path(&datastore, &ns, &backup_group); let note_path = get_group_note_path(&datastore, &store_with_ns.ns, &backup_group);
Ok(file_read_optional_string(note_path)?.unwrap_or_else(|| "".to_owned())) Ok(file_read_optional_string(note_path)?.unwrap_or_else(|| "".to_owned()))
} }
@ -1915,10 +1909,9 @@ pub fn set_group_notes(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<(), Error> { ) -> Result<(), Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
&store_with_ns, &store_with_ns,
@ -1929,7 +1922,7 @@ pub fn set_group_notes(
&backup_group, &backup_group,
)?; )?;
let note_path = get_group_note_path(&datastore, &ns, &backup_group); let note_path = get_group_note_path(&datastore, &store_with_ns.ns, &backup_group);
replace_file(note_path, notes.as_bytes(), CreateOptions::new(), false)?; replace_file(note_path, notes.as_bytes(), CreateOptions::new(), false)?;
Ok(()) Ok(())
@ -1963,10 +1956,9 @@ pub fn get_notes(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<String, Error> { ) -> Result<String, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store: store.clone(),
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -1978,7 +1970,7 @@ pub fn get_notes(
&backup_dir.group, &backup_dir.group,
)?; )?;
let backup_dir = datastore.backup_dir(ns, backup_dir)?; let backup_dir = datastore.backup_dir(store_with_ns.ns.clone(), backup_dir)?;
let (manifest, _) = backup_dir.load_manifest()?; let (manifest, _) = backup_dir.load_manifest()?;
@ -2019,10 +2011,9 @@ pub fn set_notes(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<(), Error> { ) -> Result<(), Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
@ -2034,7 +2025,7 @@ pub fn set_notes(
&backup_dir.group, &backup_dir.group,
)?; )?;
let backup_dir = datastore.backup_dir(ns, backup_dir)?; let backup_dir = datastore.backup_dir(store_with_ns.ns.clone(), backup_dir)?;
backup_dir backup_dir
.update_manifest(|manifest| { .update_manifest(|manifest| {
@ -2073,10 +2064,9 @@ pub fn get_protection(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<bool, Error> { ) -> Result<bool, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
&store_with_ns, &store_with_ns,
@ -2087,7 +2077,7 @@ pub fn get_protection(
&backup_dir.group, &backup_dir.group,
)?; )?;
let backup_dir = datastore.backup_dir(ns, backup_dir)?; let backup_dir = datastore.backup_dir(store_with_ns.ns.clone(), backup_dir)?;
Ok(backup_dir.is_protected()) Ok(backup_dir.is_protected())
} }
@ -2124,10 +2114,9 @@ pub fn set_protection(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<(), Error> { ) -> Result<(), Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let datastore = check_privs_and_load_store( let datastore = check_privs_and_load_store(
&store_with_ns, &store_with_ns,
@ -2138,7 +2127,7 @@ pub fn set_protection(
&backup_dir.group, &backup_dir.group,
)?; )?;
let backup_dir = datastore.backup_dir(ns, backup_dir)?; let backup_dir = datastore.backup_dir(store_with_ns.ns.clone(), backup_dir)?;
datastore.update_protection(&backup_dir, protected) datastore.update_protection(&backup_dir, protected)
} }
@ -2175,10 +2164,9 @@ pub fn set_backup_owner(
rpcenv: &mut dyn RpcEnvironment, rpcenv: &mut dyn RpcEnvironment,
) -> Result<(), Error> { ) -> Result<(), Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let ns = ns.unwrap_or_default();
let store_with_ns = DatastoreWithNamespace { let store_with_ns = DatastoreWithNamespace {
store: store.clone(), store,
ns: ns.clone(), ns: ns.unwrap_or_default(),
}; };
let owner_check_required = check_ns_privs_full( let owner_check_required = check_ns_privs_full(
&store_with_ns, &store_with_ns,
@ -2187,9 +2175,9 @@ pub fn set_backup_owner(
PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_BACKUP,
)?; )?;
let datastore = DataStore::lookup_datastore(&store, Some(Operation::Write))?; let datastore = DataStore::lookup_datastore(&store_with_ns.store, Some(Operation::Write))?;
let backup_group = datastore.backup_group(ns, backup_group); let backup_group = datastore.backup_group(store_with_ns.ns, backup_group);
if owner_check_required { if owner_check_required {
let owner = backup_group.get_owner()?; let owner = backup_group.get_owner()?;