diff --git a/proxmox-file-restore/src/block_driver.rs b/proxmox-file-restore/src/block_driver.rs index d3e17365..0b5face9 100644 --- a/proxmox-file-restore/src/block_driver.rs +++ b/proxmox-file-restore/src/block_driver.rs @@ -11,7 +11,7 @@ use serde_json::{json, Value}; use proxmox_router::cli::*; use proxmox_schema::api; -use pbs_api_types::BackupDir; +use pbs_api_types::{BackupDir, BackupNamespace}; use pbs_client::BackupRepository; use pbs_datastore::catalog::ArchiveEntry; use pbs_datastore::manifest::BackupManifest; @@ -21,6 +21,7 @@ use super::block_driver_qemu::QemuBlockDriver; /// Contains details about a snapshot that is to be accessed by block file restore pub struct SnapRestoreDetails { pub repo: BackupRepository, + pub namespace: BackupNamespace, pub snapshot: BackupDir, pub manifest: BackupManifest, pub keyfile: Option, diff --git a/proxmox-file-restore/src/block_driver_qemu.rs b/proxmox-file-restore/src/block_driver_qemu.rs index b9386ebc..362fff0d 100644 --- a/proxmox-file-restore/src/block_driver_qemu.rs +++ b/proxmox-file-restore/src/block_driver_qemu.rs @@ -10,7 +10,7 @@ use serde_json::json; use proxmox_sys::fs::lock_file; -use pbs_api_types::BackupDir; +use pbs_api_types::{BackupDir, BackupNamespace}; use pbs_client::{BackupRepository, VsockClient, DEFAULT_VSOCK_PORT}; use pbs_datastore::catalog::ArchiveEntry; @@ -78,8 +78,12 @@ impl VMStateMap { } } -fn make_name(repo: &BackupRepository, snap: &BackupDir) -> String { - let full = format!("qemu_{}/{}", repo, snap); +fn make_name(repo: &BackupRepository, ns: &BackupNamespace, snap: &BackupDir) -> String { + let full = if ns.is_root() { + format!("qemu_{}/{}", repo, snap) + } else { + format!("qemu_{}:{}/{}", repo, ns, snap) + }; proxmox_sys::systemd::escape_unit(&full, false) } @@ -114,7 +118,7 @@ fn new_ticket() -> String { } async fn ensure_running(details: &SnapRestoreDetails) -> Result { - let name = make_name(&details.repo, &details.snapshot); + let name = make_name(&details.repo, &details.namespace, &details.snapshot); let mut state = VMStateMap::load()?; cleanup_map(&mut state.map).await; diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs index fb6119ac..3420ea8e 100644 --- a/proxmox-file-restore/src/main.rs +++ b/proxmox-file-restore/src/main.rs @@ -95,7 +95,7 @@ fn keyfile_path(param: &Value) -> Option { async fn list_files( repo: BackupRepository, - ns: BackupNamespace, + namespace: BackupNamespace, snapshot: BackupDir, path: ExtractPath, crypt_config: Option>, @@ -107,7 +107,7 @@ async fn list_files( client, crypt_config.clone(), repo.store(), - &ns, + &namespace, &snapshot, true, ) @@ -163,6 +163,7 @@ async fn list_files( let details = SnapRestoreDetails { manifest, repo, + namespace, snapshot, keyfile, }; @@ -395,7 +396,7 @@ async fn extract( param: Value, ) -> Result<(), Error> { let repo = extract_repository_from_value(¶m)?; - let ns = ns.unwrap_or_default(); + let namespace = ns.unwrap_or_default(); let snapshot: BackupDir = snapshot.parse()?; let orig_path = path; let path = parse_path(orig_path.clone(), base64)?; @@ -425,7 +426,7 @@ async fn extract( client, crypt_config.clone(), repo.store(), - &ns, + &namespace, &snapshot, true, ) @@ -456,6 +457,7 @@ async fn extract( let details = SnapRestoreDetails { manifest, repo, + namespace, snapshot, keyfile, }; diff --git a/proxmox-file-restore/src/qemu_helper.rs b/proxmox-file-restore/src/qemu_helper.rs index b7d4eec7..4ed7e8b6 100644 --- a/proxmox-file-restore/src/qemu_helper.rs +++ b/proxmox-file-restore/src/qemu_helper.rs @@ -209,9 +209,14 @@ pub async fn start_vm( } else { "".to_owned() }; + let namespace = if details.namespace.is_root() { + String::new() + } else { + format!(",,namespace={}", details.namespace) + }; drives.push(format!( - "file=pbs:repository={},,snapshot={},,archive={}{},read-only=on,if=none,id=drive{}", - details.repo, details.snapshot, file, keyfile, id + "file=pbs:repository={}{},,snapshot={},,archive={}{},read-only=on,if=none,id=drive{}", + details.repo, namespace, details.snapshot, file, keyfile, id )); // a PCI bus can only support 32 devices, so add a new one every 32