api-types: add maintenance type

+ bump proxmox-schema dep to 1.2.1 (for quoted property string)

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
This commit is contained in:
Hannes Laimer 2022-04-12 05:25:56 +00:00 committed by Thomas Lamprecht
parent 66b88dadba
commit 2a05c75ff1
4 changed files with 83 additions and 4 deletions

View File

@ -14,7 +14,7 @@ regex = "1.5.5"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
proxmox-lang = "1.0.0" proxmox-lang = "1.0.0"
proxmox-schema = { version = "1.1", features = [ "api-macro" ] } proxmox-schema = { version = "1.2.1", features = [ "api-macro" ] }
proxmox-serde = "0.1" proxmox-serde = "0.1"
proxmox-time = "1.1.1" proxmox-time = "1.1.1"
proxmox-uuid = { version = "1.0.0", features = [ "serde" ] } proxmox-uuid = { version = "1.0.0", features = [ "serde" ] }

View File

@ -6,9 +6,9 @@ use proxmox_schema::{
}; };
use crate::{ use crate::{
Authid, CryptMode, Fingerprint, Userid, DATASTORE_NOTIFY_STRING_SCHEMA, GC_SCHEDULE_SCHEMA, Authid, CryptMode, Fingerprint, MaintenanceMode, Userid, DATASTORE_NOTIFY_STRING_SCHEMA,
PROXMOX_SAFE_ID_FORMAT, PRUNE_SCHEDULE_SCHEMA, SHA256_HEX_REGEX, SINGLE_LINE_COMMENT_SCHEMA, GC_SCHEDULE_SCHEMA, PROXMOX_SAFE_ID_FORMAT, PRUNE_SCHEDULE_SCHEMA, SHA256_HEX_REGEX,
UPID, SINGLE_LINE_COMMENT_SCHEMA, UPID,
}; };
const_regex! { const_regex! {
@ -262,6 +262,11 @@ pub const DATASTORE_TUNING_STRING_SCHEMA: Schema = StringSchema::new("Datastore
optional: true, optional: true,
schema: DATASTORE_TUNING_STRING_SCHEMA, schema: DATASTORE_TUNING_STRING_SCHEMA,
}, },
"maintenance-mode": {
optional: true,
format: &ApiStringFormat::PropertyString(&MaintenanceMode::API_SCHEMA),
type: String,
},
} }
)] )]
#[derive(Serialize, Deserialize, Updater)] #[derive(Serialize, Deserialize, Updater)]
@ -302,6 +307,18 @@ pub struct DataStoreConfig {
/// Datastore tuning options /// Datastore tuning options
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub tuning: Option<String>, pub tuning: Option<String>,
/// Maintenance mode, type is either 'offline' or 'read-only', message should be enclosed in "
#[serde(skip_serializing_if = "Option::is_none")]
pub maintenance_mode: Option<String>,
}
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())
}
} }
#[api( #[api(

View File

@ -49,6 +49,9 @@ pub use jobs::*;
mod key_derivation; mod key_derivation;
pub use key_derivation::{Kdf, KeyInfo}; pub use key_derivation::{Kdf, KeyInfo};
mod maintenance;
pub use maintenance::*;
mod network; mod network;
pub use network::*; pub use network::*;

View File

@ -0,0 +1,59 @@
use serde::{Deserialize, Serialize};
use proxmox_schema::{api, ApiStringFormat, const_regex, Schema, StringSchema};
const_regex!{
pub MAINTENANCE_MESSAGE_REGEX = r"^[[:^cntrl:]]*$";
}
pub const MAINTENANCE_MESSAGE_FORMAT: ApiStringFormat =
ApiStringFormat::Pattern(&MAINTENANCE_MESSAGE_REGEX);
pub const MAINTENANCE_MESSAGE_SCHEMA: Schema =
StringSchema::new("Message describing the reason for the maintenance.")
.format(&MAINTENANCE_MESSAGE_FORMAT)
.max_length(64)
.schema();
#[derive(Clone, Copy, Debug)]
/// Operation requirements, used when checking for maintenance mode.
pub enum Operation {
Read,
Write,
}
#[api]
#[derive(Deserialize, Serialize)]
#[serde(rename_all="kebab-case")]
/// Maintenance type.
pub enum MaintenanceType {
/// Only read operations are allowed on the datastore.
ReadOnly,
/// Neither read nor write operations are allowed on the datastore.
Offline,
}
#[api(
properties: {
type: {
type: MaintenanceType,
},
message: {
optional: true,
schema: MAINTENANCE_MESSAGE_SCHEMA,
}
},
default_key: "type",
)]
#[derive(Deserialize, Serialize)]
/// Maintenance mode
pub struct MaintenanceMode {
/// Type of maintenance ("read-only" or "offline").
#[serde(rename = "type")]
ty: MaintenanceType,
/// Reason for maintenance.
#[serde(skip_serializing_if = "Option::is_none")]
message: Option<String>,
}