[pbs-devel] [PATCH proxmox-backup v8 21/23] api: node: allow creation of removable datastore through directory endpoint
Hannes Laimer
h.laimer at proxmox.com
Fri Apr 19 17:56:04 CEST 2024
Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
src/api2/node/disks/directory.rs | 67 +++++++++++++++++++++++++++++++-
1 file changed, 65 insertions(+), 2 deletions(-)
diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs
index 9f1112a9..a34ed676 100644
--- a/src/api2/node/disks/directory.rs
+++ b/src/api2/node/disks/directory.rs
@@ -123,6 +123,11 @@ pub fn list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
type: bool,
optional: true,
},
+ "removable-datastore": {
+ description: "The the added datastore is removable.",
+ type: bool,
+ optional: true,
+ },
filesystem: {
type: FileSystemType,
optional: true,
@@ -136,11 +141,14 @@ pub fn list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
permission: &Permission::Privilege(&["system", "disks"], PRIV_SYS_MODIFY, false),
},
)]
-/// Create a Filesystem on an unused disk. Will be mounted under `/mnt/datastore/<name>`.
+/// Create a Filesystem on an unused disk. Will be mounted under `/mnt/datastore/<name>`, removable
+/// datastores will have `/mnt/removable_datastore/<uuid>/<name>` as their path and will be mounted
+/// under `/mnt/removable_datastore/<uuid>`
pub fn create_datastore_disk(
name: String,
disk: String,
add_datastore: Option<bool>,
+ removable_datastore: Option<bool>,
filesystem: Option<FileSystemType>,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<String, Error> {
@@ -154,8 +162,63 @@ pub fn create_datastore_disk(
bail!("disk '{}' is already in use.", disk);
}
- let mount_point = format!("{}{}", BASE_MOUNT_DIR, &name);
+ if let (Some(true), Some(true)) = (add_datastore, removable_datastore) {
+ let upid_str = WorkerTask::new_thread(
+ "dircreate",
+ Some(name.clone()),
+ auth_id,
+ to_stdout,
+ move |worker| {
+ task_log!(
+ worker,
+ "create removable datastore '{}' on disk {}",
+ name,
+ disk
+ );
+
+ let filesystem = filesystem.unwrap_or(FileSystemType::Ext4);
+
+ let manager = DiskManage::new();
+
+ let disk = manager.disk_by_name(&disk)?;
+
+ let partition = create_single_linux_partition(&disk)?;
+ create_file_system(&partition, filesystem)?;
+
+ let uuid = get_fs_uuid(&partition)?;
+ let store_path = format!(
+ "{}/{uuid}/{name}",
+ pbs_api_types::REMOVABLE_DATASTORE_MOUNT_DIR
+ );
+
+ let lock = pbs_config::datastore::lock_config()?;
+ let datastore: DataStoreConfig = serde_json::from_value(
+ json!({ "name": name, "path": store_path, "backing-device": uuid }),
+ )?;
+
+ let (config, _digest) = pbs_config::datastore::config()?;
+
+ if config.sections.get(&datastore.name).is_some() {
+ bail!("datastore '{}' already exists.", datastore.name);
+ }
+
+ // we don't have to check if the UUID is already in use since we just created the
+ // fs ourself
+ crate::api2::config::datastore::do_create_datastore(
+ lock,
+ config,
+ datastore,
+ Some(&worker),
+ )?;
+
+ Ok(())
+ },
+ )?;
+ return Ok(upid_str);
+ };
+
+ let mount_point = format!("{}{}", BASE_MOUNT_DIR, &name);
// check if the default path exists already.
// bail if it is not empty or another filesystem mounted on top
let default_path = std::path::PathBuf::from(&mount_point);
--
2.39.2
More information about the pbs-devel
mailing list