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 B1F691FF173 for ; Mon, 25 Nov 2024 17:23:04 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D7FFE18C22; Mon, 25 Nov 2024 17:23:00 +0100 (CET) From: Hannes Laimer To: pbs-devel@lists.proxmox.com Date: Mon, 25 Nov 2024 17:21:55 +0100 Message-Id: <20241125162213.157011-9-h.laimer@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241125162213.157011-1-h.laimer@proxmox.com> References: <20241125162213.157011-1-h.laimer@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.275 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: [pbs-devel] [PATCH proxmox-backup v15 08/26] pbs-api-types: add mount_status field 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" Signed-off-by: Hannes Laimer --- pbs-api-types/src/datastore.rs | 19 ++++++++++++++++- src/api2/admin/datastore.rs | 38 ++++++++++++++++++++-------------- src/api2/status/mod.rs | 30 +++++++++++++++++++++++---- 3 files changed, 66 insertions(+), 21 deletions(-) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 9bcec7191..4927f3724 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -178,6 +178,20 @@ pub enum ChunkOrder { Inode, } +#[api] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +/// Current mounting status of a datastore, useful for removable datastores. +pub enum DataStoreMountStatus { + /// Removable datastore is currently mounted correctly. + Mounted, + /// Removable datastore is currebtly not mounted. + NotMounted, + /// Datastore is not removable, so there is no mount status. + #[default] + NonRemovable, +} + #[api] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -451,6 +465,7 @@ impl DataStoreConfig { pub struct DataStoreListItem { pub store: String, pub comment: Option, + pub mount_status: DataStoreMountStatus, /// If the datastore is in maintenance mode, information about it #[serde(skip_serializing_if = "Option::is_none")] pub maintenance: Option, @@ -1456,6 +1471,7 @@ pub struct DataStoreStatusListItem { /// The available bytes of the underlying storage. (-1 on error) #[serde(skip_serializing_if = "Option::is_none")] pub avail: Option, + pub mount_status: DataStoreMountStatus, /// A list of usages of the past (last Month). #[serde(skip_serializing_if = "Option::is_none")] pub history: Option>>, @@ -1480,12 +1496,13 @@ pub struct DataStoreStatusListItem { } impl DataStoreStatusListItem { - pub fn empty(store: &str, err: Option) -> Self { + pub fn empty(store: &str, err: Option, mount_status: DataStoreMountStatus) -> Self { DataStoreStatusListItem { store: store.to_owned(), total: None, used: None, avail: None, + mount_status, history: None, history_start: None, history_delta: None, diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 2f441b550..1c939bc20 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -38,14 +38,15 @@ use pxar::EntryKind; use pbs_api_types::{ print_ns_and_snapshot, print_store_and_ns, ArchiveType, Authid, BackupArchiveName, BackupContent, BackupGroupDeleteStats, BackupNamespace, BackupType, Counts, CryptMode, - DataStoreConfig, DataStoreListItem, DataStoreStatus, GarbageCollectionJobStatus, GroupListItem, - JobScheduleStatus, KeepOptions, MaintenanceMode, MaintenanceType, Operation, PruneJobOptions, - SnapshotListItem, SnapshotVerifyState, BACKUP_ARCHIVE_NAME_SCHEMA, BACKUP_ID_SCHEMA, - BACKUP_NAMESPACE_SCHEMA, BACKUP_TIME_SCHEMA, BACKUP_TYPE_SCHEMA, CATALOG_NAME, - CLIENT_LOG_BLOB_NAME, DATASTORE_SCHEMA, IGNORE_VERIFIED_BACKUPS_SCHEMA, MANIFEST_BLOB_NAME, - MAX_NAMESPACE_DEPTH, NS_MAX_DEPTH_SCHEMA, PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_BACKUP, - PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, PRIV_DATASTORE_READ, PRIV_DATASTORE_VERIFY, UPID, - UPID_SCHEMA, VERIFICATION_OUTDATED_AFTER_SCHEMA, + DataStoreConfig, DataStoreListItem, DataStoreMountStatus, DataStoreStatus, + GarbageCollectionJobStatus, GroupListItem, JobScheduleStatus, KeepOptions, MaintenanceMode, + MaintenanceType, Operation, PruneJobOptions, SnapshotListItem, SnapshotVerifyState, + BACKUP_ARCHIVE_NAME_SCHEMA, BACKUP_ID_SCHEMA, BACKUP_NAMESPACE_SCHEMA, BACKUP_TIME_SCHEMA, + BACKUP_TYPE_SCHEMA, CATALOG_NAME, CLIENT_LOG_BLOB_NAME, DATASTORE_SCHEMA, + IGNORE_VERIFIED_BACKUPS_SCHEMA, MANIFEST_BLOB_NAME, MAX_NAMESPACE_DEPTH, NS_MAX_DEPTH_SCHEMA, + PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, + PRIV_DATASTORE_READ, PRIV_DATASTORE_VERIFY, UPID, UPID_SCHEMA, + VERIFICATION_OUTDATED_AFTER_SCHEMA, }; use pbs_client::pxar::{create_tar, create_zip}; use pbs_config::CachedUserInfo; @@ -1323,8 +1324,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; @@ -1335,15 +1336,20 @@ pub fn get_datastore_list( } } + let store_config: DataStoreConfig = serde_json::from_value(data)?; + + let mount_status = match pbs_datastore::get_datastore_mount_status(&store_config) { + Some(true) => DataStoreMountStatus::Mounted, + Some(false) => DataStoreMountStatus::NotMounted, + None => DataStoreMountStatus::NonRemovable, + }; + 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), + mount_status, + maintenance: store_config.maintenance_mode, }); } } diff --git a/src/api2/status/mod.rs b/src/api2/status/mod.rs index 113aa9852..5efde9c3d 100644 --- a/src/api2/status/mod.rs +++ b/src/api2/status/mod.rs @@ -10,11 +10,12 @@ use proxmox_schema::api; use proxmox_sortable_macro::sortable; use pbs_api_types::{ - Authid, DataStoreStatusListItem, Operation, PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_BACKUP, + Authid, DataStoreConfig, DataStoreMountStatus, DataStoreStatusListItem, Operation, + PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_BACKUP, }; use pbs_config::CachedUserInfo; -use pbs_datastore::DataStore; +use pbs_datastore::{get_datastore_mount_status, DataStore}; use crate::server::metric_collection::rrd::extract_rrd_data; use crate::tools::statistics::linear_regression; @@ -51,10 +52,26 @@ 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)?; + + let mount_status = match get_datastore_mount_status(&store_config) { + Some(true) => DataStoreMountStatus::Mounted, + Some(false) => { + list.push(DataStoreStatusListItem::empty( + store, + None, + DataStoreMountStatus::NotMounted, + )); + continue; + } + None => DataStoreMountStatus::NonRemovable, + }; + 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, mount_status)); } } continue; @@ -63,7 +80,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()), + mount_status, + )); continue; } }; @@ -74,6 +95,7 @@ pub async fn datastore_status( total: Some(status.total), used: Some(status.used), avail: Some(status.available), + mount_status, history: None, history_start: None, history_delta: None, -- 2.39.5 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel