From 999293bbca978694f78618498026296fb8652ae8 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 3 May 2022 08:06:34 +0200 Subject: [PATCH] tape: add namespaces/recursion depth to tape backup jobs and manual api via TapeBackupJobSetup Signed-off-by: Dominik Csapak --- pbs-api-types/src/jobs.rs | 12 ++++++++++++ src/api2/tape/backup.rs | 13 ++++++++++++- src/bin/proxmox-tape.rs | 13 +++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index 2df19cfb..de546d5e 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -277,6 +277,14 @@ pub struct VerificationJobStatus { schema: GROUP_FILTER_LIST_SCHEMA, optional: true, }, + ns: { + type: BackupNamespace, + optional: true, + }, + "recursion-depth": { + schema: crate::NS_MAX_DEPTH_SCHEMA, + optional: true, + }, } )] #[derive(Serialize, Deserialize, Clone, Updater)] @@ -297,6 +305,10 @@ pub struct TapeBackupJobSetup { pub notify_user: Option, #[serde(skip_serializing_if = "Option::is_none")] pub group_filter: Option>, + #[serde(skip_serializing_if = "Option::is_none", default)] + pub ns: Option, + #[serde(skip_serializing_if = "Option::is_none", default)] + pub recursion_depth: Option, } #[api( diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index f910b5b7..dd6ddb6c 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -409,7 +409,18 @@ fn backup_worker( let mut pool_writer = PoolWriter::new(pool, &setup.drive, worker, email, force_media_set)?; // FIXME: Namespaces! Probably just recurse for now? Not sure about the usage here... - let mut group_list = datastore.list_backup_groups(Default::default())?; + + let mut group_list = Vec::new(); + let root_namespace = if let Some(ns) = &setup.ns { + ns.clone() + } else { + Default::default() + }; + let namespaces = + datastore.recursive_iter_backup_ns_ok(root_namespace, setup.recursion_depth)?; + for ns in namespaces { + group_list.extend(datastore.list_backup_groups(ns)?); + } group_list.sort_unstable_by(|a, b| a.group().cmp(b.group())); diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index 6fa7c0f2..6d3e6ae2 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -18,8 +18,9 @@ use pbs_config::drive::complete_drive_name; use pbs_config::media_pool::complete_pool_name; use pbs_api_types::{ - Authid, GroupListItem, HumanByte, Userid, DATASTORE_MAP_LIST_SCHEMA, DATASTORE_SCHEMA, - DRIVE_NAME_SCHEMA, GROUP_FILTER_LIST_SCHEMA, MEDIA_LABEL_SCHEMA, MEDIA_POOL_NAME_SCHEMA, + Authid, BackupNamespace, GroupListItem, HumanByte, Userid, DATASTORE_MAP_LIST_SCHEMA, + DATASTORE_SCHEMA, DRIVE_NAME_SCHEMA, GROUP_FILTER_LIST_SCHEMA, MEDIA_LABEL_SCHEMA, + MEDIA_POOL_NAME_SCHEMA, NS_MAX_DEPTH_SCHEMA, TAPE_RESTORE_SNAPSHOT_SCHEMA, }; use pbs_tape::{BlockReadError, MediaContentHeader, PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0}; @@ -840,6 +841,14 @@ async fn clean_drive(mut param: Value) -> Result<(), Error> { schema: GROUP_FILTER_LIST_SCHEMA, optional: true, }, + namespace: { + type: BackupNamespace, + optional: true, + }, + "recursion-depth": { + schema: NS_MAX_DEPTH_SCHEMA, + optional: true, + }, "force-media-set": { description: "Ignore the allocation policy and start a new media-set.", optional: true,