From 50fa7bad491ca63f316dd1aa39a5df4b2c3d0075 Mon Sep 17 00:00:00 2001 From: Hannes Laimer Date: Tue, 12 Apr 2022 05:25:57 +0000 Subject: [PATCH] datastore: add check for maintenance in lookup Signed-off-by: Hannes Laimer --- pbs-api-types/src/maintenance.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pbs-api-types/src/maintenance.rs b/pbs-api-types/src/maintenance.rs index 9b74e9b9..f8d4dad3 100644 --- a/pbs-api-types/src/maintenance.rs +++ b/pbs-api-types/src/maintenance.rs @@ -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, } + +impl MaintenanceMode { + pub fn check(&self, operation: Option) -> 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(()) + } +}