mirror of
https://git.proxmox.com/git/proxmox
synced 2025-07-26 04:38:10 +00:00
datastore: add check for maintenance in lookup
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
This commit is contained in:
parent
35786fe37e
commit
50fa7bad49
@ -1,3 +1,5 @@
|
|||||||
|
use std::borrow::Cow;
|
||||||
|
use anyhow::{bail, Error};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use proxmox_schema::{api, ApiStringFormat, const_regex, Schema, StringSchema};
|
use proxmox_schema::{api, ApiStringFormat, const_regex, Schema, StringSchema};
|
||||||
@ -24,7 +26,7 @@ pub enum Operation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[api]
|
#[api]
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize, PartialEq)]
|
||||||
#[serde(rename_all="kebab-case")]
|
#[serde(rename_all="kebab-case")]
|
||||||
/// Maintenance type.
|
/// Maintenance type.
|
||||||
pub enum MaintenanceType {
|
pub enum MaintenanceType {
|
||||||
@ -57,3 +59,20 @@ pub struct MaintenanceMode {
|
|||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
message: Option<String>,
|
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(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user