From bec18b8e60b0ead134b0789add2a9bad34164213 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Mon, 22 Apr 2024 10:31:30 +0200 Subject: [PATCH] api: assert that maintenance mode transitions are valid Maintenance mode Delete locks the datastore. It must not be possible to go back to normal modes, because the datastore may be in undefined state. Signed-off-by: Dietmar Maurer --- pbs-api-types/src/datastore.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 699b9e15..8a8ec12d 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -11,7 +11,7 @@ use proxmox_schema::{ }; use crate::{ - Authid, CryptMode, Fingerprint, GroupFilter, MaintenanceMode, Userid, + Authid, CryptMode, Fingerprint, GroupFilter, MaintenanceMode, MaintenanceType, Userid, BACKUP_ID_RE, BACKUP_NS_RE, BACKUP_TIME_RE, BACKUP_TYPE_RE, DATASTORE_NOTIFY_STRING_SCHEMA, GC_SCHEDULE_SCHEMA, GROUP_OR_SNAPSHOT_PATH_REGEX_STR, PROXMOX_SAFE_ID_FORMAT, PROXMOX_SAFE_ID_REGEX_STR, PRUNE_SCHEDULE_SCHEMA, SHA256_HEX_REGEX, SINGLE_LINE_COMMENT_SCHEMA, @@ -344,6 +344,37 @@ impl DataStoreConfig { .ok() }) } + + pub fn set_maintenance_mode(&mut self, new_mode: Option) -> Result<(), Error> { + let current_type = self.get_maintenance_mode().map(|mode| mode.ty); + let new_type = new_mode.as_ref().map(|mode| mode.ty); + + match current_type { + Some(MaintenanceType::ReadOnly) => { /* always OK */ } + Some(MaintenanceType::Offline) => { /* always OK */ } + Some(MaintenanceType::Delete) => { + match new_type { + Some(MaintenanceType::Delete) => { /* allow to delete a deleted storage */ } + _ => { + bail!("datastore is being deleted") + } + } + } + None => { /* always OK */ } + } + + let new_mode = match new_mode { + Some(new_mode) => Some( + proxmox_schema::property_string::PropertyString::new(new_mode) + .to_property_string()?, + ), + None => None, + }; + + self.maintenance_mode = new_mode; + + Ok(()) + } } #[api(