client: add --ns parameter to snapshot list

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2022-04-27 14:35:36 +02:00 committed by Thomas Lamprecht
parent 352e13db9d
commit 68857aecb3
2 changed files with 33 additions and 13 deletions

View File

@ -127,16 +127,23 @@ fn record_repository(repo: &BackupRepository) {
); );
} }
enum List {
Any,
Group(BackupGroup),
Namespace(BackupNamespace),
}
async fn api_datastore_list_snapshots( async fn api_datastore_list_snapshots(
client: &HttpClient, client: &HttpClient,
store: &str, store: &str,
group: Option<BackupGroup>, list: List,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let path = format!("api2/json/admin/datastore/{}/snapshots", store); let path = format!("api2/json/admin/datastore/{}/snapshots", store);
let args = match group { let args = match list {
Some(group) => serde_json::to_value(group)?, List::Group(group) => serde_json::to_value(group)?,
None => json!({}), List::Namespace(ns) => json!({ "backup-ns": ns }),
List::Any => json!({}),
}; };
let mut result = client.get(&path, Some(args)).await?; let mut result = client.get(&path, Some(args)).await?;
@ -149,7 +156,7 @@ pub async fn api_datastore_latest_snapshot(
store: &str, store: &str,
group: BackupGroup, group: BackupGroup,
) -> Result<BackupDir, Error> { ) -> Result<BackupDir, Error> {
let list = api_datastore_list_snapshots(client, store, Some(group.clone())).await?; let list = api_datastore_list_snapshots(client, store, List::Group(group.clone())).await?;
let mut list: Vec<SnapshotListItem> = serde_json::from_value(list)?; let mut list: Vec<SnapshotListItem> = serde_json::from_value(list)?;
if list.is_empty() { if list.is_empty() {

View File

@ -1,13 +1,13 @@
use std::sync::Arc; use std::sync::Arc;
use anyhow::Error; use anyhow::{bail, Error};
use serde_json::{json, Value}; use serde_json::{json, Value};
use proxmox_router::cli::*; use proxmox_router::cli::*;
use proxmox_schema::api; use proxmox_schema::api;
use proxmox_sys::fs::file_get_contents; use proxmox_sys::fs::file_get_contents;
use pbs_api_types::{BackupGroup, CryptMode, SnapshotListItem}; use pbs_api_types::{BackupGroup, BackupNamespace, CryptMode, SnapshotListItem};
use pbs_client::tools::key_source::get_encryption_key_password; use pbs_client::tools::key_source::get_encryption_key_password;
use pbs_config::key_config::decrypt_key; use pbs_config::key_config::decrypt_key;
use pbs_datastore::DataBlob; use pbs_datastore::DataBlob;
@ -17,7 +17,7 @@ use pbs_tools::json::required_string_param;
use crate::{ use crate::{
api_datastore_list_snapshots, complete_backup_group, complete_backup_snapshot, api_datastore_list_snapshots, complete_backup_group, complete_backup_snapshot,
complete_repository, connect, crypto_parameters, extract_repository_from_value, complete_repository, connect, crypto_parameters, extract_repository_from_value,
record_repository, BackupDir, KEYFD_SCHEMA, KEYFILE_SCHEMA, REPO_URL_SCHEMA, record_repository, BackupDir, List, KEYFD_SCHEMA, KEYFILE_SCHEMA, REPO_URL_SCHEMA,
}; };
#[api( #[api(
@ -27,6 +27,10 @@ use crate::{
schema: REPO_URL_SCHEMA, schema: REPO_URL_SCHEMA,
optional: true, optional: true,
}, },
"ns": {
type: BackupNamespace,
optional: true,
},
group: { group: {
type: String, type: String,
description: "Backup group.", description: "Backup group.",
@ -47,13 +51,22 @@ async fn list_snapshots(param: Value) -> Result<Value, Error> {
let client = connect(&repo)?; let client = connect(&repo)?;
let group: Option<BackupGroup> = if let Some(path) = param["group"].as_str() { let group: Option<BackupGroup> = param["group"]
Some(path.parse()?) .as_str()
} else { .map(|group| group.parse())
None .transpose()?;
let backup_ns: Option<BackupNamespace> =
param["ns"].as_str().map(|ns| ns.parse()).transpose()?;
let list = match (group, backup_ns) {
(Some(group), None) => List::Group(group),
(None, Some(ns)) => List::Namespace(ns),
(None, None) => List::Any,
(Some(_), Some(_)) => bail!("'ns' and 'group' parameters are mutually exclusive"),
}; };
let mut data = api_datastore_list_snapshots(&client, repo.store(), group).await?; let mut data = api_datastore_list_snapshots(&client, repo.store(), list).await?;
record_repository(&repo); record_repository(&repo);