all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode
@ 2024-04-22  8:31 Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/3] pbs-api-types: use SchemaDeserializer for maintenance mode Dietmar Maurer
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Dietmar Maurer @ 2024-04-22  8:31 UTC (permalink / raw)
  To: pbs-devel

Changes in v4:

- re-add comment about unmounting maintenence type
- fix typo in commit message
- avoid compiler warning

Changes in v3:

- do not introduce MaintenanceType::Unmount (we can do that later)
- cleanup commit messages

Changes in v2:

- split patch into smaller ones
- cleanup commit message

Dietmar Maurer (3):
  pbs-api-types: use SchemaDeserializer for maintenance mode
  maintenance: derive Copy for maintenance type and make maintenance
    mode fields public
  api: assert that maintenance mode transitions are valid

 pbs-api-types/src/datastore.rs   | 46 +++++++++++++++++++++++++++-----
 pbs-api-types/src/maintenance.rs |  6 ++---
 pbs-datastore/src/datastore.rs   |  8 ++++--
 src/api2/config/datastore.rs     | 13 ++++++---
 4 files changed, 59 insertions(+), 14 deletions(-)

-- 
2.39.2



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 1/3] pbs-api-types: use SchemaDeserializer for maintenance mode
  2024-04-22  8:31 [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Dietmar Maurer
@ 2024-04-22  8:31 ` Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/3] maintenance: derive Copy for maintenance type and make maintenance mode fields public Dietmar Maurer
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Dietmar Maurer @ 2024-04-22  8:31 UTC (permalink / raw)
  To: pbs-devel

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
 pbs-api-types/src/datastore.rs | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs
index 5e13c157..699b9e15 100644
--- a/pbs-api-types/src/datastore.rs
+++ b/pbs-api-types/src/datastore.rs
@@ -11,8 +11,8 @@ use proxmox_schema::{
 };
 
 use crate::{
-    Authid, CryptMode, Fingerprint, GroupFilter, MaintenanceMode, Userid, BACKUP_ID_RE,
-    BACKUP_NS_RE, BACKUP_TIME_RE, BACKUP_TYPE_RE, DATASTORE_NOTIFY_STRING_SCHEMA,
+    Authid, CryptMode, Fingerprint, GroupFilter, MaintenanceMode, 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,
     SNAPSHOT_PATH_REGEX_STR, UPID,
@@ -336,10 +336,13 @@ impl DataStoreConfig {
     }
 
     pub fn get_maintenance_mode(&self) -> Option<MaintenanceMode> {
-        self.maintenance_mode
-            .as_ref()
-            .and_then(|str| MaintenanceMode::API_SCHEMA.parse_property_string(str).ok())
-            .and_then(|value| MaintenanceMode::deserialize(value).ok())
+        self.maintenance_mode.as_ref().and_then(|str| {
+            MaintenanceMode::deserialize(proxmox_schema::de::SchemaDeserializer::new(
+                str,
+                &MaintenanceMode::API_SCHEMA,
+            ))
+            .ok()
+        })
     }
 }
 
-- 
2.39.2



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 2/3] maintenance: derive Copy for maintenance type and make maintenance mode fields public
  2024-04-22  8:31 [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/3] pbs-api-types: use SchemaDeserializer for maintenance mode Dietmar Maurer
@ 2024-04-22  8:31 ` Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/3] api: assert that maintenance mode transitions are valid Dietmar Maurer
  2024-04-22 10:20 ` [pbs-devel] applied-series: [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Dietmar Maurer @ 2024-04-22  8:31 UTC (permalink / raw)
  To: pbs-devel

Because it is a public api type.

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
---
 pbs-api-types/src/maintenance.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pbs-api-types/src/maintenance.rs b/pbs-api-types/src/maintenance.rs
index a605cc17..1e3413dc 100644
--- a/pbs-api-types/src/maintenance.rs
+++ b/pbs-api-types/src/maintenance.rs
@@ -33,7 +33,7 @@ pub enum Operation {
 }
 
 #[api]
-#[derive(Deserialize, Serialize, PartialEq, Eq)]
+#[derive(Copy, Clone, Deserialize, Serialize, PartialEq, Eq)]
 #[serde(rename_all = "kebab-case")]
 /// Maintenance type.
 pub enum MaintenanceType {
@@ -69,11 +69,11 @@ serde_plain::derive_fromstr_from_deserialize!(MaintenanceType);
 pub struct MaintenanceMode {
     /// Type of maintenance ("read-only" or "offline").
     #[serde(rename = "type")]
-    ty: MaintenanceType,
+    pub ty: MaintenanceType,
 
     /// Reason for maintenance.
     #[serde(skip_serializing_if = "Option::is_none")]
-    message: Option<String>,
+    pub message: Option<String>,
 }
 
 impl MaintenanceMode {
-- 
2.39.2



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 3/3] api: assert that maintenance mode transitions are valid
  2024-04-22  8:31 [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/3] pbs-api-types: use SchemaDeserializer for maintenance mode Dietmar Maurer
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/3] maintenance: derive Copy for maintenance type and make maintenance mode fields public Dietmar Maurer
@ 2024-04-22  8:31 ` Dietmar Maurer
  2024-04-22 10:20 ` [pbs-devel] applied-series: [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Dietmar Maurer @ 2024-04-22  8:31 UTC (permalink / raw)
  To: pbs-devel

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 <dietmar@proxmox.com>
---
 pbs-api-types/src/datastore.rs | 33 ++++++++++++++++++++++++++++++++-
 pbs-datastore/src/datastore.rs |  8 ++++++--
 src/api2/config/datastore.rs   | 13 ++++++++++---
 3 files changed, 48 insertions(+), 6 deletions(-)

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<MaintenanceMode>) -> 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(
diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
index 0685cc84..f95da761 100644
--- a/pbs-datastore/src/datastore.rs
+++ b/pbs-datastore/src/datastore.rs
@@ -20,7 +20,7 @@ use proxmox_sys::{task_log, task_warn};
 
 use pbs_api_types::{
     Authid, BackupNamespace, BackupType, ChunkOrder, DataStoreConfig, DatastoreFSyncLevel,
-    DatastoreTuning, GarbageCollectionStatus, Operation, UPID,
+    DatastoreTuning, GarbageCollectionStatus, MaintenanceMode, MaintenanceType, Operation, UPID,
 };
 
 use crate::backup_info::{BackupDir, BackupGroup, BackupGroupDeleteStats};
@@ -1390,7 +1390,11 @@ impl DataStore {
         let (mut config, _digest) = pbs_config::datastore::config()?;
         let mut datastore_config: DataStoreConfig = config.lookup("datastore", name)?;
 
-        datastore_config.maintenance_mode = Some("type=delete".to_string());
+        datastore_config.set_maintenance_mode(Some(MaintenanceMode {
+            ty: MaintenanceType::Delete,
+            message: None,
+        }))?;
+
         config.set_data(name, "datastore", &datastore_config)?;
         pbs_config::datastore::save_config(&config)?;
         drop(config_lock);
diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs
index 3081e1f4..87425ff5 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -13,7 +13,7 @@ use proxmox_uuid::Uuid;
 
 use pbs_api_types::{
     Authid, DataStoreConfig, DataStoreConfigUpdater, DatastoreNotify, DatastoreTuning, KeepOptions,
-    PruneJobConfig, PruneJobOptions, DATASTORE_SCHEMA, PRIV_DATASTORE_ALLOCATE,
+    MaintenanceMode, PruneJobConfig, PruneJobOptions, DATASTORE_SCHEMA, PRIV_DATASTORE_ALLOCATE,
     PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_MODIFY, PROXMOX_CONFIG_DIGEST_SCHEMA, UPID_SCHEMA,
 };
 use pbs_config::BackupLockGuard;
@@ -319,7 +319,7 @@ pub fn update_datastore(
                     data.tuning = None;
                 }
                 DeletableProperty::MaintenanceMode => {
-                    data.maintenance_mode = None;
+                    data.set_maintenance_mode(None)?;
                 }
             }
         }
@@ -392,7 +392,14 @@ pub fn update_datastore(
     let mut maintenance_mode_changed = false;
     if update.maintenance_mode.is_some() {
         maintenance_mode_changed = data.maintenance_mode != update.maintenance_mode;
-        data.maintenance_mode = update.maintenance_mode;
+
+        let maintenance_mode = match update.maintenance_mode {
+            Some(mode_str) => Some(MaintenanceMode::deserialize(
+                proxmox_schema::de::SchemaDeserializer::new(mode_str, &MaintenanceMode::API_SCHEMA),
+            )?),
+            None => None,
+        };
+        data.set_maintenance_mode(maintenance_mode)?;
     }
 
     config.set_data(&name, "datastore", &data)?;
-- 
2.39.2



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pbs-devel] applied-series: [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode
  2024-04-22  8:31 [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Dietmar Maurer
                   ` (2 preceding siblings ...)
  2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/3] api: assert that maintenance mode transitions are valid Dietmar Maurer
@ 2024-04-22 10:20 ` Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Thomas Lamprecht @ 2024-04-22 10:20 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dietmar Maurer

Am 22/04/2024 um 10:31 schrieb Dietmar Maurer:
> Changes in v4:
> 
> - re-add comment about unmounting maintenence type
> - fix typo in commit message
> - avoid compiler warning
> 
> Changes in v3:
> 
> - do not introduce MaintenanceType::Unmount (we can do that later)
> - cleanup commit messages
> 
> Changes in v2:
> 
> - split patch into smaller ones
> - cleanup commit message
> 
> Dietmar Maurer (3):
>   pbs-api-types: use SchemaDeserializer for maintenance mode
>   maintenance: derive Copy for maintenance type and make maintenance
>     mode fields public
>   api: assert that maintenance mode transitions are valid
> 
>  pbs-api-types/src/datastore.rs   | 46 +++++++++++++++++++++++++++-----
>  pbs-api-types/src/maintenance.rs |  6 ++---
>  pbs-datastore/src/datastore.rs   |  8 ++++--
>  src/api2/config/datastore.rs     | 13 ++++++---
>  4 files changed, 59 insertions(+), 14 deletions(-)
> 


applied series, thanks!


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-04-22 10:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-22  8:31 [pbs-devel] [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Dietmar Maurer
2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/3] pbs-api-types: use SchemaDeserializer for maintenance mode Dietmar Maurer
2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/3] maintenance: derive Copy for maintenance type and make maintenance mode fields public Dietmar Maurer
2024-04-22  8:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/3] api: assert that maintenance mode transitions are valid Dietmar Maurer
2024-04-22 10:20 ` [pbs-devel] applied-series: [PATCH proxmox-backup v4 0/3] pbs-api-types: new MaintenanceType::Unmount, implement and use set_maintenance_mode Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal