]> git.proxmox.com Git - proxmox-backup.git/blobdiff - pbs-api-types/src/maintenance.rs
datastore: add check for maintenance in lookup
[proxmox-backup.git] / pbs-api-types / src / maintenance.rs
index 9b74e9b90db36429211b23ea28274b1d80036ed4..f8d4dad39c066bd2d86ed0ec7f4b65a63ca6fce3 100644 (file)
@@ -1,3 +1,5 @@
+use std::borrow::Cow;
+use anyhow::{bail, Error};
 use serde::{Deserialize, Serialize};
 
 use proxmox_schema::{api, ApiStringFormat, const_regex, Schema, StringSchema};
@@ -24,7 +26,7 @@ pub enum Operation {
 }
 
 #[api]
-#[derive(Deserialize, Serialize)]
+#[derive(Deserialize, Serialize, PartialEq)]
 #[serde(rename_all="kebab-case")]
 /// Maintenance type.
 pub enum MaintenanceType {
@@ -57,3 +59,20 @@ pub struct MaintenanceMode {
     #[serde(skip_serializing_if = "Option::is_none")]
     message: Option<String>,
 }
+
+impl MaintenanceMode {
+    pub fn check(&self, operation: Option<Operation>) -> Result<(), Error> {
+        let message = percent_encoding::percent_decode_str(self.message.as_deref().unwrap_or(""))
+            .decode_utf8()
+            .unwrap_or(Cow::Borrowed(""));
+
+        if self.ty == MaintenanceType::Offline {
+            bail!("offline maintenance mode: {}", message);
+        } else if self.ty == MaintenanceType::ReadOnly {
+            if let Some(Operation::Write) = operation {
+                bail!("read-only maintenance mode: {}", message);
+            }
+        }
+        Ok(())
+    }
+}