From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id A040D1FF168 for ; Mon, 14 Oct 2024 15:42:25 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C64F33609D; Mon, 14 Oct 2024 15:42:57 +0200 (CEST) Date: Mon, 14 Oct 2024 15:42:52 +0200 From: Fabian =?iso-8859-1?q?Gr=FCnbichler?= To: Proxmox Backup Server development discussion References: <20240904141155.350454-1-h.laimer@proxmox.com> <20240904141155.350454-11-h.laimer@proxmox.com> In-Reply-To: <20240904141155.350454-11-h.laimer@proxmox.com> MIME-Version: 1.0 User-Agent: astroid/0.16.0 (https://github.com/astroidmail/astroid) Message-Id: <1728910342.7uu1es0cem.astroid@yuna.none> X-SPAM-LEVEL: Spam detection results: 0 AWL -1.252 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 ENA_SUBJ_ODD_CASE 2.6 Subject has odd case 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: Re: [pbs-devel] [PATCH proxmox-backup v12 10/26] pbs-api-types: add removable/is-available flag to DataStoreListItem X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" On September 4, 2024 4:11 pm, Hannes Laimer wrote: > Signed-off-by: Hannes Laimer > --- > pbs-api-types/src/datastore.rs | 9 ++++++++- > src/api2/admin/datastore.rs | 17 +++++++++-------- > src/api2/status.rs | 18 +++++++++++++++--- > 3 files changed, 32 insertions(+), 12 deletions(-) > > diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs > index d6e2f97e..6a999372 100644 > --- a/pbs-api-types/src/datastore.rs > +++ b/pbs-api-types/src/datastore.rs > @@ -454,6 +454,10 @@ impl DataStoreConfig { > pub struct DataStoreListItem { > pub store: String, > pub comment: Option, > + /// Datastore is removable > + pub removable: bool, > + /// Datastore is available > + pub available: bool, > /// If the datastore is in maintenance mode, information about it > #[serde(skip_serializing_if = "Option::is_none")] > pub maintenance: Option, > @@ -1453,6 +1457,8 @@ pub struct DataStoreStatusListItem { > /// The available bytes of the underlying storage. (-1 on error) > #[serde(skip_serializing_if = "Option::is_none")] > pub avail: Option, > + /// The datastore is available, relevant if removable > + pub is_available: bool, but it doesn't explain what available is.. why is it only relevant if removable? and wouldn't it then make more sense to make removable an enum that encodes whether it's available or not? > /// A list of usages of the past (last Month). > #[serde(skip_serializing_if = "Option::is_none")] > pub history: Option>>, > @@ -1477,12 +1483,13 @@ pub struct DataStoreStatusListItem { > } > > impl DataStoreStatusListItem { > - pub fn empty(store: &str, err: Option) -> Self { > + pub fn empty(store: &str, err: Option, is_available: bool) -> Self { > DataStoreStatusListItem { > store: store.to_owned(), > total: None, > used: None, > avail: None, > + is_available, > history: None, > history_start: None, > history_delta: None, > diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs > index 3c95888d..0b5dede7 100644 > --- a/src/api2/admin/datastore.rs > +++ b/src/api2/admin/datastore.rs > @@ -1310,8 +1310,8 @@ pub fn get_datastore_list( > > let mut list = Vec::new(); > > - for (store, (_, data)) in &config.sections { > - let acl_path = &["datastore", store]; > + for (store, (_, data)) in config.sections { > + let acl_path = &["datastore", &store]; > let user_privs = user_info.lookup_privs(&auth_id, acl_path); > let allowed = (user_privs & (PRIV_DATASTORE_AUDIT | PRIV_DATASTORE_BACKUP)) != 0; > > @@ -1322,15 +1322,16 @@ pub fn get_datastore_list( > } > } > > + let store_config: DataStoreConfig = serde_json::from_value(data)?; > + let is_available = pbs_datastore::is_datastore_available(&store_config); > + > if allowed || allow_id { > list.push(DataStoreListItem { > store: store.clone(), > - comment: if !allowed { > - None > - } else { > - data["comment"].as_str().map(String::from) > - }, > - maintenance: data["maintenance-mode"].as_str().map(String::from), > + comment: store_config.comment.filter(|_| allowed), > + removable: store_config.backing_device.is_some(), > + available: is_available, > + maintenance: store_config.maintenance_mode, > }); > } > } > diff --git a/src/api2/status.rs b/src/api2/status.rs > index f1ae0ef5..a0dd46b6 100644 > --- a/src/api2/status.rs > +++ b/src/api2/status.rs > @@ -13,7 +13,7 @@ use pbs_api_types::{ > }; > > use pbs_config::CachedUserInfo; > -use pbs_datastore::DataStore; > +use pbs_datastore::{is_datastore_available, DataStore}; > > use crate::rrd_cache::extract_rrd_data; > use crate::tools::statistics::linear_regression; > @@ -48,10 +48,17 @@ pub async fn datastore_status( > for (store, (_, _)) in &config.sections { > let user_privs = user_info.lookup_privs(&auth_id, &["datastore", store]); > let allowed = (user_privs & (PRIV_DATASTORE_AUDIT | PRIV_DATASTORE_BACKUP)) != 0; > + > + let store_config = config.lookup("datastore", store)?; > + if !is_datastore_available(&store_config) { > + list.push(DataStoreStatusListItem::empty(store, None, false)); > + continue; > + } > + > if !allowed { > if let Ok(datastore) = DataStore::lookup_datastore(store, Some(Operation::Lookup)) { > if can_access_any_namespace(datastore, &auth_id, &user_info) { > - list.push(DataStoreStatusListItem::empty(store, None)); > + list.push(DataStoreStatusListItem::empty(store, None, true)); > } > } > continue; > @@ -60,7 +67,11 @@ pub async fn datastore_status( > let datastore = match DataStore::lookup_datastore(store, Some(Operation::Read)) { > Ok(datastore) => datastore, > Err(err) => { > - list.push(DataStoreStatusListItem::empty(store, Some(err.to_string()))); > + list.push(DataStoreStatusListItem::empty( > + store, > + Some(err.to_string()), > + true, > + )); > continue; > } > }; > @@ -71,6 +82,7 @@ pub async fn datastore_status( > total: Some(status.total), > used: Some(status.used), > avail: Some(status.available), > + is_available: true, > history: None, > history_start: None, > history_delta: None, > -- > 2.39.2 > > > > _______________________________________________ > pbs-devel mailing list > pbs-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel > > > _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel