From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH proxmox-offline-mirror 3/3] cli: add `mirror snapshot create-all` command
Date: Fri, 16 Sep 2022 12:35:35 +0200 [thread overview]
Message-ID: <20220916103535.103013-4-f.gruenbichler@proxmox.com> (raw)
In-Reply-To: <20220916103535.103013-1-f.gruenbichler@proxmox.com>
that creates a new snapshot for each configured mirror, collecting the
results and printing a summary at the end. this should be suitable for
usage in a cron job or timer-triggered unit, with no output on stderr
for 100% OK execution runs.
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
src/bin/proxmox_offline_mirror_cmds/mirror.rs | 78 ++++++++++++++++++-
1 file changed, 77 insertions(+), 1 deletion(-)
diff --git a/src/bin/proxmox_offline_mirror_cmds/mirror.rs b/src/bin/proxmox_offline_mirror_cmds/mirror.rs
index 4503971..3094146 100644
--- a/src/bin/proxmox_offline_mirror_cmds/mirror.rs
+++ b/src/bin/proxmox_offline_mirror_cmds/mirror.rs
@@ -1,8 +1,9 @@
-use anyhow::{format_err, Error};
+use anyhow::{bail, format_err, Error};
use proxmox_section_config::SectionConfigData;
use proxmox_subscription::SubscriptionStatus;
use serde_json::Value;
+use std::collections::HashMap;
use proxmox_router::cli::{
format_and_print_result, get_output_format, CliCommand, CliCommandMap, CommandLineInterface,
@@ -89,6 +90,80 @@ async fn create_snapshot(
Ok(())
}
+#[api(
+ input: {
+ properties: {
+ config: {
+ type: String,
+ optional: true,
+ description: "Path to mirroring config file.",
+ },
+ "dry-run": {
+ type: bool,
+ optional: true,
+ default: false,
+ description: "Only fetch indices and print summary of missing package files, don't store anything.",
+ }
+ },
+ },
+ )]
+/// Create a new repository snapshot for each configured mirror, fetching required/missing files
+/// from original repository.
+async fn create_snapshots(
+ config: Option<String>,
+ dry_run: bool,
+ _param: Value,
+) -> Result<(), Error> {
+ let config = config.unwrap_or_else(get_config_path);
+
+ let (section_config, _digest) = proxmox_offline_mirror::config::config(&config)?;
+ let mirrors: Vec<MirrorConfig> = section_config.convert_to_typed_array("mirror")?;
+
+ let mut results = HashMap::new();
+
+ for mirror in mirrors {
+ let mirror_id = mirror.id.clone();
+ println!("\nCREATING SNAPSHOT FOR '{mirror_id}'..");
+ let subscription = match get_subscription_key(§ion_config, &mirror) {
+ Ok(opt_key) => opt_key,
+ Err(err) => {
+ eprintln!("Skipping mirror '{mirror_id}' - {err})");
+ results.insert(mirror_id, Err(err));
+ continue;
+ }
+ };
+ let res = proxmox_offline_mirror::mirror::create_snapshot(
+ mirror,
+ &Snapshot::now(),
+ subscription,
+ dry_run,
+ );
+ if let Err(err) = &res {
+ eprintln!("Failed to create snapshot for '{mirror_id}' - {err}");
+ }
+
+ results.insert(mirror_id, res);
+ }
+
+ println!("\nSUMMARY:");
+ for (mirror_id, _res) in results.iter().filter(|(_, res)| res.is_ok()) {
+ println!("{mirror_id}: OK"); // TODO update once we have a proper return value
+ }
+
+ let mut fail = false;
+
+ for (mirror_id, res) in results.into_iter().filter(|(_, res)| res.is_err()) {
+ fail = true;
+ eprintln!("{mirror_id}: ERR - {}", res.unwrap_err());
+ }
+
+ if fail {
+ bail!("Failed to create snapshots for all configured mirrors.");
+ }
+
+ Ok(())
+}
+
#[api(
input: {
properties: {
@@ -204,6 +279,7 @@ pub fn mirror_commands() -> CommandLineInterface {
"create",
CliCommand::new(&API_METHOD_CREATE_SNAPSHOT).arg_param(&["id"]),
)
+ .insert("create-all", CliCommand::new(&API_METHOD_CREATE_SNAPSHOTS))
.insert(
"list",
CliCommand::new(&API_METHOD_LIST_SNAPSHOTS).arg_param(&["id"]),
--
2.30.2
next prev parent reply other threads:[~2022-09-16 10:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-16 10:35 [pve-devel] [PATCH proxmox-offline-mirror 0/3] --dry-run / create-all additions Fabian Grünbichler
2022-09-16 10:35 ` [pve-devel] [PATCH proxmox-offline-mirror 1/3] mirror: add --dry-run parameter Fabian Grünbichler
2022-09-16 10:35 ` [pve-devel] [PATCH proxmox-offline-mirror 2/3] cli: extract subscription key helper Fabian Grünbichler
2022-09-16 10:35 ` Fabian Grünbichler [this message]
2022-09-16 12:31 ` [pve-devel] applied-series: [PATCH proxmox-offline-mirror 0/3] --dry-run / create-all additions Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220916103535.103013-4-f.gruenbichler@proxmox.com \
--to=f.gruenbichler@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.