file-restore: add namespace support to qemu part
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
e30a2e9058
commit
8ca7cccf5f
|
@ -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<String>,
|
||||
|
|
|
@ -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<VsockClient, Error> {
|
||||
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;
|
||||
|
|
|
@ -95,7 +95,7 @@ fn keyfile_path(param: &Value) -> Option<String> {
|
|||
|
||||
async fn list_files(
|
||||
repo: BackupRepository,
|
||||
ns: BackupNamespace,
|
||||
namespace: BackupNamespace,
|
||||
snapshot: BackupDir,
|
||||
path: ExtractPath,
|
||||
crypt_config: Option<Arc<CryptConfig>>,
|
||||
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue