mirror of
https://git.proxmox.com/git/proxmox-backup
synced 2025-04-28 11:30:58 +00:00
api: assert that maintenance mode transitions are valid
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>
This commit is contained in:
parent
7767c7cfd5
commit
50c0246a89
@ -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(
|
||||
|
@ -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);
|
||||
|
@ -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)?;
|
||||
|
Loading…
Reference in New Issue
Block a user