[pve-devel] [PATCH proxmox-offline-mirror 4/4] cli: allow listing snapshots of all mirrors
Fabian Grünbichler
f.gruenbichler at proxmox.com
Wed Sep 21 10:12:42 CEST 2022
and slightly change the output format accordingly.
Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
technically a breaking change -> the json is now a map mirror ID => list
of snapshots, instead of a plain list of snapshots..
src/bin/proxmox_offline_mirror_cmds/mirror.rs | 53 +++++++++++++++----
1 file changed, 43 insertions(+), 10 deletions(-)
diff --git a/src/bin/proxmox_offline_mirror_cmds/mirror.rs b/src/bin/proxmox_offline_mirror_cmds/mirror.rs
index 348392b..a3fb258 100644
--- a/src/bin/proxmox_offline_mirror_cmds/mirror.rs
+++ b/src/bin/proxmox_offline_mirror_cmds/mirror.rs
@@ -3,7 +3,10 @@ use anyhow::{bail, format_err, Error};
use proxmox_section_config::SectionConfigData;
use proxmox_subscription::SubscriptionStatus;
use serde_json::Value;
-use std::{collections::HashMap, path::PathBuf};
+use std::{
+ collections::{BTreeMap, HashMap},
+ path::PathBuf,
+};
use proxmox_router::cli::{
format_and_print_result, get_output_format, CliCommand, CliCommandMap, CommandLineInterface,
@@ -174,6 +177,7 @@ async fn create_snapshots(
},
id: {
schema: MIRROR_ID_SCHEMA,
+ optional: true,
},
"output-format": {
schema: OUTPUT_FORMAT,
@@ -183,25 +187,54 @@ async fn create_snapshots(
},
)]
/// List existing repository snapshots.
-async fn list_snapshots(config: Option<String>, id: String, param: Value) -> Result<(), Error> {
+async fn list_snapshots(
+ config: Option<String>,
+ id: Option<String>,
+ param: Value,
+) -> Result<(), Error> {
let output_format = get_output_format(¶m);
let config = config.unwrap_or_else(get_config_path);
let (config, _digest) = proxmox_offline_mirror::config::config(&config)?;
- let config: MirrorConfig = config.lookup("mirror", &id)?;
+ let res = if let Some(id) = id {
+ let config: MirrorConfig = config.lookup("mirror", &id)?;
- let list = mirror::list_snapshots(&config)?;
+ let list = mirror::list_snapshots(&config)?;
+ let mut map = BTreeMap::new();
+ map.insert(config.id, list);
+ map
+ } else {
+ let mirrors: Vec<MirrorConfig> = config.convert_to_typed_array("mirror")?;
+ mirrors
+ .into_iter()
+ .fold(BTreeMap::new(), |mut map, mirror| {
+ match mirror::list_snapshots(&mirror) {
+ Ok(list) => {
+ map.insert(mirror.id, list);
+ }
+ Err(err) => eprintln!("Failed to list snapshots for {} - {err}", mirror.id),
+ }
+ map
+ })
+ };
if output_format == "text" {
- println!("Found {} snapshots:", list.len());
- for snap in &list {
- println!("- {snap}");
+ let mut first = true;
+ for (mirror, list) in res {
+ if first {
+ first = false;
+ } else {
+ println!();
+ }
+ println!("{mirror} ({} snapshots):", list.len());
+ for snap in &list {
+ println!("- {snap}");
+ }
}
} else {
- let list = serde_json::json!(list);
- format_and_print_result(&list, &output_format);
+ let map = serde_json::json!(res);
+ format_and_print_result(&map, &output_format);
}
-
Ok(())
}
--
2.30.2
More information about the pve-devel
mailing list