) -> Result<Value, Error> {
let path = format!("api2/json/admin/datastore/{}/snapshots", store);
- let mut args = json!({});
- if let Some(group) = group {
- args["backup-type"] = group.ty.to_string().into();
- args["backup-id"] = group.id.into();
- }
+ let args = match group {
+ Some(group) => serde_json::to_value(group)?,
+ None => json!({}),
+ };
let mut result = client.get(&path, Some(args)).await?;
schema: REPO_URL_SCHEMA,
optional: true,
},
+ "ns": {
+ type: BackupNamespace,
+ optional: true,
+ },
"output-format": {
schema: OUTPUT_FORMAT,
optional: true,
let path = format!("api2/json/admin/datastore/{}/groups", repo.store());
- let mut result = client.get(&path, None).await?;
+ let backup_ns: BackupNamespace = match ¶m["ns"] {
+ Value::String(s) => s.parse()?,
+ _ => BackupNamespace::root(),
+ };
+ let mut result = client
+ .get(&path, Some(json!({ "backup-ns": backup_ns })))
+ .await?;
record_repository(&repo);
Ok(Value::Null)
}
+fn merge_group_into(to: &mut serde_json::Map<String, Value>, group: BackupGroup) {
+ match serde_json::to_value(group).unwrap() {
+ Value::Object(group) => to.extend(group),
+ _ => unreachable!(),
+ }
+}
+
#[api(
input: {
properties: {
let group: BackupGroup = group.parse()?;
- param["backup-type"] = group.ty.to_string().into();
- param["backup-id"] = group.id.into();
+ merge_group_into(param.as_object_mut().unwrap(), group);
let path = format!("api2/json/admin/datastore/{}/change-owner", repo.store());
client.post(&path, Some(param)).await?;
if let Some(dry_run) = dry_run {
api_param["dry-run"] = dry_run.into();
}
- api_param["backup-type"] = group.ty.to_string().into();
- api_param["backup-id"] = group.id.into();
+ merge_group_into(api_param.as_object_mut().unwrap(), group);
let mut result = client.post(&path, Some(api_param)).await?;
let path = format!("api2/json/admin/datastore/{}/files", repo.store());
let mut result = client
- .get(
- &path,
- Some(json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- })),
- )
+ .get(&path, Some(serde_json::to_value(snapshot)?))
.await?;
record_repository(&repo);
let path = format!("api2/json/admin/datastore/{}/snapshots", repo.store());
let result = client
- .delete(
- &path,
- Some(json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- })),
- )
+ .delete(&path, Some(serde_json::to_value(snapshot)?))
.await?;
record_repository(&repo);
let path = format!("api2/json/admin/datastore/{}/notes", repo.store());
- let args = json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- });
+ let args = serde_json::to_value(snapshot)?;
let output_format = get_output_format(¶m);
let path = format!("api2/json/admin/datastore/{}/notes", repo.store());
- let args = json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- "notes": notes,
- });
+ let mut args = serde_json::to_value(snapshot)?;
+ args["notes"] = Value::from(notes);
client.put(&path, Some(args)).await?;
let path = format!("api2/json/admin/datastore/{}/protected", repo.store());
- let args = json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- });
+ let args = serde_json::to_value(snapshot)?;
let output_format = get_output_format(¶m);
let path = format!("api2/json/admin/datastore/{}/protected", repo.store());
- let args = json!({
- "backup-type": snapshot.group.ty,
- "backup-id": snapshot.group.id,
- "backup-time": snapshot.time,
- "protected": protected,
- });
+ let mut args = serde_json::to_value(snapshot)?;
+ args["protected"] = Value::from(protected);
client.put(&path, Some(args)).await?;
store: {
schema: DATASTORE_SCHEMA,
},
+ "backup-ns": {
+ type: BackupNamespace,
+ optional: true,
+ },
},
},
returns: pbs_api_types::ADMIN_DATASTORE_LIST_GROUPS_RETURN_TYPE,
/// List backup groups.
pub fn list_groups(
store: String,
+ backup_ns: Option<BackupNamespace>,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<Vec<GroupListItem>, Error> {
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let list_all = (user_privs & PRIV_DATASTORE_AUDIT) != 0;
datastore
- .iter_backup_groups(Default::default())? // FIXME: Namespaces and recursion parameters!
+ .iter_backup_groups(backup_ns.unwrap_or_default())? // FIXME: Namespaces and recursion parameters!
.try_fold(Vec::new(), |mut group_info, group| {
let group = group?;
let owner = match datastore.get_owner(group.as_ref()) {