From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 5FAF51FF191 for ; Tue, 21 Oct 2025 13:11:59 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 894EA1BC7E; Tue, 21 Oct 2025 13:12:23 +0200 (CEST) From: Christian Ebner To: pdm-devel@lists.proxmox.com Date: Tue, 21 Oct 2025 13:11:24 +0200 Message-ID: <20251021111129.294349-15-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251021111129.294349-1-c.ebner@proxmox.com> References: <20251021111129.294349-1-c.ebner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1761045096858 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.042 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 datacenter-manager v3 14/19] server: resources: extend the PBS resources by config properties X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" At the cost of one additional api call, fetch the datastore list which includes datastore config properties. Use this to map the additional information to the `PbsDatastoreResource`. With the intend to show further datastore information on the dashboard. Signed-off-by: Christian Ebner --- Changes since version 2: - not present in previous version server/src/api/resources.rs | 69 ++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs index fb281f4..793abfc 100644 --- a/server/src/api/resources.rs +++ b/server/src/api/resources.rs @@ -6,7 +6,9 @@ use anyhow::{bail, format_err, Error}; use futures::future::join_all; use futures::FutureExt; -use pbs_api_types::{DataStoreStatusListItem, NodeStatus}; +use pbs_api_types::{ + DataStoreStatusListItem, DatastoreBackendConfig, DatastoreBackendType, NodeStatus, +}; use pdm_api_types::remotes::{Remote, RemoteType}; use pdm_api_types::resource::{ FailedRemote, PbsDatastoreResource, PbsNodeResource, PveLxcResource, PveNodeResource, @@ -841,8 +843,18 @@ async fn fetch_remote_resource(remote: &Remote) -> Result, Error> let status = client.node_status().await?; resources.push(map_pbs_node_status(&remote_name, status)); + let datastores = client.list_datastores().await?; + let datastore_map: HashMap = datastores + .into_iter() + .map(|store| (store.name.clone(), store)) + .collect(); + for datastore_usage in client.datastore_usage().await? { - resources.push(map_pbs_datastore_status(&remote_name, datastore_usage)); + resources.push(map_pbs_datastore_status( + &remote_name, + datastore_usage, + &datastore_map, + )); } } } @@ -997,13 +1009,52 @@ fn map_pbs_node_status(remote: &str, status: NodeStatus) -> Resource { }) } -fn map_pbs_datastore_status(remote: &str, status: DataStoreStatusListItem) -> Resource { - Resource::PbsDatastore(PbsDatastoreResource { - id: format!("remote/{remote}/datastore/{}", status.store), - name: status.store, - maxdisk: status.total.unwrap_or_default(), - disk: status.used.unwrap_or_default(), - }) +fn map_pbs_datastore_status( + remote: &str, + status: DataStoreStatusListItem, + datastore_map: &HashMap, +) -> Resource { + let maxdisk = status.total.unwrap_or_default(); + let disk = status.used.unwrap_or_default(); + + let usage = if maxdisk > 0 { + disk as f64 / maxdisk as f64 + } else { + 0.0 + }; + + if let Some(store_config) = datastore_map.get(&status.store) { + let mut backend_type = None; + if let Some(store_backend) = &store_config.backend { + match store_backend.parse::() { + Ok(backend_config) => { + if let Some(DatastoreBackendType::S3) = backend_config.ty { + backend_type = Some(DatastoreBackendType::S3.to_string()) + } + } + Err(_) => backend_type = Some("unknown".to_string()), + } + } + Resource::PbsDatastore(PbsDatastoreResource { + id: format!("remote/{remote}/datastore/{}", status.store), + name: status.store, + maxdisk, + disk, + usage, + maintenance: store_config.maintenance_mode.clone(), + backing_device: store_config.backing_device.clone(), + backend_type, + }) + } else { + Resource::PbsDatastore(PbsDatastoreResource { + id: format!("remote/{remote}/datastore/{}", status.store), + name: status.store, + maxdisk, + disk, + usage, + ..Default::default() + }) + } } #[cfg(test)] -- 2.47.3 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel