From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pdm-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E3E981FF164 for <inbox@lore.proxmox.com>; Fri, 14 Feb 2025 14:08:14 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1876E1A0B4; Fri, 14 Feb 2025 14:08:14 +0100 (CET) From: Lukas Wagner <l.wagner@proxmox.com> To: pdm-devel@lists.proxmox.com Date: Fri, 14 Feb 2025 14:06:50 +0100 Message-Id: <20250214130653.283012-26-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250214130653.283012-1-l.wagner@proxmox.com> References: <20250214130653.283012-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.010 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pdm-devel] [PATCH proxmox-datacenter-manager v2 25/28] cli: add commands for metric-collection settings, trigger, status X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion <pdm-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pdm-devel>, <mailto:pdm-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pdm-devel/> List-Post: <mailto:pdm-devel@lists.proxmox.com> List-Help: <mailto:pdm-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel>, <mailto:pdm-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox Datacenter Manager development discussion <pdm-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" <pdm-devel-bounces@lists.proxmox.com> This adds new commands to the proxmox-datacenter-client CLI tool, namely - to update metric collection settings - trigger metric collection - show status of the last metric collection Signed-off-by: Lukas Wagner <l.wagner@proxmox.com> --- Notes: Changes since v1: - update-settings -> 'settings update' - show-settings -> 'settings show' cli/client/Cargo.toml | 1 + cli/client/src/main.rs | 2 + cli/client/src/metric_collection.rs | 170 ++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 cli/client/src/metric_collection.rs diff --git a/cli/client/Cargo.toml b/cli/client/Cargo.toml index 96016cd3..5c96b284 100644 --- a/cli/client/Cargo.toml +++ b/cli/client/Cargo.toml @@ -46,6 +46,7 @@ proxmox-rrd-api-types.workspace = true proxmox-schema = { workspace = true, features = [ "api-macro" ] } proxmox-section-config.workspace = true proxmox-sys.workspace = true +proxmox-time.workspace = true proxmox-tfa = { workspace = true, features = [ "types" ] } # for the pve API types: diff --git a/cli/client/src/main.rs b/cli/client/src/main.rs index c913e978..55877cf7 100644 --- a/cli/client/src/main.rs +++ b/cli/client/src/main.rs @@ -17,6 +17,7 @@ pub mod env; pub mod acl; pub mod config; +pub mod metric_collection; pub mod pbs; pub mod pve; pub mod remotes; @@ -93,6 +94,7 @@ fn main_do() -> Result<(), Error> { ) .insert("acl", acl::cli()) .insert("login", CliCommand::new(&API_METHOD_LOGIN)) + .insert("metric-collection", metric_collection::cli()) .insert("pbs", pbs::cli()) .insert("pve", pve::cli()) .insert("remote", remotes::cli()) diff --git a/cli/client/src/metric_collection.rs b/cli/client/src/metric_collection.rs new file mode 100644 index 00000000..1eac6415 --- /dev/null +++ b/cli/client/src/metric_collection.rs @@ -0,0 +1,170 @@ +use anyhow::Error; +use pdm_api_types::{ + remotes::REMOTE_ID_SCHEMA, CollectionSettingsUpdater, DeletableCollectionSettingsProperty, +}; +use proxmox_router::cli::{ + format_and_print_result, CliCommand, CliCommandMap, CommandLineInterface, OutputFormat, +}; +use proxmox_schema::api; + +use crate::{client, env}; + +pub fn cli() -> CommandLineInterface { + CliCommandMap::new() + .insert("settings", settings_cli()) + .insert( + "trigger", + CliCommand::new(&API_METHOD_TRIGGER_METRIC_COLLECTION), + ) + .insert( + "status", + CliCommand::new(&API_METHOD_METRIC_COLLECTION_STATUS), + ) + .into() +} + +fn settings_cli() -> CommandLineInterface { + CliCommandMap::new() + .insert( + "show", + CliCommand::new(&API_METHOD_SHOW_COLLECTION_SETTINGS), + ) + .insert( + "update", + CliCommand::new(&API_METHOD_UPDATE_COLLECTION_SETTINGS), + ) + .into() +} + +#[api] +/// Show metric collection settings. +async fn show_collection_settings() -> Result<(), Error> { + let client = client()?; + let settings = client.get_metric_collection_settings().await?; + + fn default_if_none<T>(value: Option<T>) -> &'static str { + if value.is_none() { + " (default)" + } else { + "" + } + } + + let output_format = env().format_args.output_format; + if output_format == OutputFormat::Text { + println!("Metric collection settings:"); + println!( + " collection-interval: {}s{}", + settings.collection_interval_or_default(), + default_if_none(settings.collection_interval), + ); + println!( + " max-interval-offset: {}s{}", + settings.max_interval_offset_or_default(), + default_if_none(settings.max_interval_offset) + ); + println!( + " min-interval-offset: {}s{}", + settings.min_interval_offset_or_default(), + default_if_none(settings.min_interval_offset) + ); + println!( + " max-connection-delay: {}ms{}", + settings.max_connection_delay_or_default(), + default_if_none(settings.max_connection_delay) + ); + println!( + " min-connection-delay: {}ms{}", + settings.min_connection_delay_or_default(), + default_if_none(settings.min_connection_delay) + ); + println!( + " max-concurrent-connections: {}{}", + settings.max_concurrent_connections_or_default(), + default_if_none(settings.max_concurrent_connections), + ); + } else { + format_and_print_result(&settings, &output_format.to_string()); + } + Ok(()) +} + +#[api( + input: { + properties: { + updater: { + type: CollectionSettingsUpdater, + flatten: true, + }, + delete: { + description: "Reset previously set collection settings properties.", + optional: true, + type: Array, + items: { + type: DeletableCollectionSettingsProperty, + }, + }, + } + } +)] +/// Change metric collection settings. +async fn update_collection_settings( + updater: CollectionSettingsUpdater, + delete: Option<Vec<DeletableCollectionSettingsProperty>>, +) -> Result<(), Error> { + let client = client()?; + client + .update_metric_collection_settings(updater, delete) + .await?; + + Ok(()) +} + +#[api( + input: { + properties: { + remote: { + schema: REMOTE_ID_SCHEMA, + optional: true, + }, + } + } +)] +/// Trigger metric collection. If a remote is passed, only this remote will be collected, otherwise +/// all. +async fn trigger_metric_collection(remote: Option<String>) -> Result<(), Error> { + client()? + .trigger_metric_collection(remote.as_deref()) + .await?; + Ok(()) +} + +#[api] +/// Show metric collection status. +async fn metric_collection_status() -> Result<(), Error> { + let result = client()?.get_metric_collection_status().await?; + + let output_format = env().format_args.output_format; + if output_format == OutputFormat::Text { + for remote_status in result { + let timestamp = if let Some(last_collection) = remote_status.last_collection { + proxmox_time::strftime_local("%a, %d %b %Y %T %z", last_collection)? + } else { + "never".into() + }; + + let status = if let Some(err) = &remote_status.error { + err + } else { + "ok" + }; + + println!("{}: {status}", remote_status.remote); + println!(" last successful: {timestamp}"); + println!(); + } + } else { + format_and_print_result(&result, &output_format.to_string()); + } + Ok(()) +} -- 2.39.5 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel