]> git.proxmox.com Git - proxmox-backup.git/blame - src/server/verify_job.rs
namespaces: move max-depth check to api type
[proxmox-backup.git] / src / server / verify_job.rs
CommitLineData
a4915dfc 1use anyhow::{format_err, Error};
acc3d9df 2
e9d2fc93 3use pbs_api_types::{Authid, Operation, VerificationJobConfig};
6d5d305d 4use pbs_datastore::DataStore;
ee0ea735
TL
5use proxmox_rest_server::WorkerTask;
6use proxmox_sys::task_log;
c23192d3 7
acc3d9df 8use crate::{
ee0ea735 9 backup::{verify_all_backups, verify_filter},
acc3d9df 10 server::jobstate::Job,
acc3d9df
DM
11};
12
13/// Runs a verification job.
14pub fn do_verification_job(
15 mut job: Job,
16 verification_job: VerificationJobConfig,
e6dc35ac 17 auth_id: &Authid,
acc3d9df 18 schedule: Option<String>,
bfa942c0 19 to_stdout: bool,
acc3d9df 20) -> Result<String, Error> {
e9d2fc93 21 let datastore = DataStore::lookup_datastore(&verification_job.store, Some(Operation::Read))?;
acc3d9df 22
44288184 23 let outdated_after = verification_job.outdated_after;
b4b14dc1 24 let ignore_verified_snapshots = verification_job.ignore_verified.unwrap_or(true);
a4915dfc 25
f47c1d3a 26 let (email, notify) = crate::server::lookup_datastore_notify_settings(&verification_job.store);
b9e7bcc2 27
ee0ea735 28 let job_id = format!("{}:{}", &verification_job.store, job.jobname());
acc3d9df
DM
29 let worker_type = job.jobtype().to_string();
30 let upid_str = WorkerTask::new_thread(
31 &worker_type,
dbd45a72 32 Some(job_id.clone()),
049a22a3 33 auth_id.to_string(),
bfa942c0 34 to_stdout,
acc3d9df
DM
35 move |worker| {
36 job.start(&worker.upid().to_string())?;
37
ee0ea735 38 task_log!(worker, "Starting datastore verify job '{}'", job_id);
acc3d9df 39 if let Some(event_str) = schedule {
ee0ea735 40 task_log!(worker, "task triggered by schedule '{}'", event_str);
acc3d9df
DM
41 }
42
59229bd7
TL
43 let ns = match verification_job.ns {
44 Some(ref ns) => ns.clone(),
45 None => Default::default(),
46 };
47
9c26a3d6 48 let verify_worker = crate::backup::VerifyWorker::new(worker.clone(), datastore);
037e6c0c
HL
49 let result = verify_all_backups(
50 &verify_worker,
51 worker.upid(),
59229bd7 52 ns,
0b1edf29 53 verification_job.max_depth,
037e6c0c
HL
54 None,
55 Some(&move |manifest| {
56 verify_filter(ignore_verified_snapshots, outdated_after, manifest)
57 }),
58 );
a4915dfc 59 let job_result = match result {
a4fa3fc2
FG
60 Ok(ref failed_dirs) if failed_dirs.is_empty() => Ok(()),
61 Ok(ref failed_dirs) => {
1ec0d70d 62 task_log!(worker, "Failed to verify the following snapshots/groups:");
a4fa3fc2 63 for dir in failed_dirs {
1ec0d70d 64 task_log!(worker, "\t{}", dir);
a4fa3fc2
FG
65 }
66
ee0ea735
TL
67 Err(format_err!(
68 "verification failed - please check the log for details"
69 ))
70 }
a4915dfc
DM
71 Err(_) => Err(format_err!("verification failed - job aborted")),
72 };
acc3d9df 73
a4915dfc 74 let status = worker.create_state(&job_result);
acc3d9df 75
b92cad09
FG
76 if let Err(err) = job.finish(status) {
77 eprintln!(
acc3d9df
DM
78 "could not finish job state for {}: {}",
79 job.jobtype().to_string(),
80 err
b92cad09 81 );
acc3d9df
DM
82 }
83
b9e7bcc2 84 if let Some(email) = email {
ee0ea735
TL
85 if let Err(err) =
86 crate::server::send_verify_status(&email, notify, verification_job, &result)
87 {
b9e7bcc2
DM
88 eprintln!("send verify notification failed: {}", err);
89 }
90 }
91
a4915dfc 92 job_result
acc3d9df
DM
93 },
94 )?;
95 Ok(upid_str)
96}