]> git.proxmox.com Git - proxmox-backup.git/commitdiff
api2/tape/drive: add run_drive_worker wrapper
authorDominik Csapak <d.csapak@proxmox.com>
Thu, 18 Feb 2021 14:40:22 +0000 (15:40 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 09:08:27 +0000 (10:08 +0100)
a wrapper for locking, starting the worker and writing the state

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
src/api2/tape/drive.rs

index 8de8d39d93a5747967d410ce2867f1320ec20f7d..f4977612f1e2364349f95df217699f3621ea44d1 100644 (file)
@@ -1,7 +1,8 @@
+use std::panic::UnwindSafe;
 use std::path::Path;
 use std::sync::Arc;
 
-use anyhow::{bail, Error};
+use anyhow::{bail, format_err, Error};
 use serde_json::Value;
 
 use proxmox::{
@@ -62,11 +63,44 @@ use crate::{
             required_media_changer,
             open_drive,
             lock_tape_device,
+            set_tape_device_state,
         },
         changer::update_changer_online_status,
     },
 };
 
+fn run_drive_worker<F>(
+    rpcenv: &dyn RpcEnvironment,
+    drive: String,
+    worker_type: &str,
+    job_id: Option<String>,
+    f: F,
+) -> Result<String, Error>
+where
+    F: Send
+        + UnwindSafe
+        + 'static
+        + FnOnce(Arc<WorkerTask>, SectionConfigData) -> Result<(), Error>,
+{
+    // early check/lock before starting worker
+    let (config, _digest) = config::drive::config()?;
+    let lock_guard = lock_tape_device(&config, &drive)?;
+
+    let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
+    let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
+
+    WorkerTask::new_thread(worker_type, job_id, auth_id, to_stdout, move |worker| {
+        let _lock_guard = lock_guard;
+        set_tape_device_state(&drive, &worker.upid().to_string())
+            .map_err(|err| format_err!("could not set tape device state: {}", err))?;
+
+        let result = f(worker, config);
+        set_tape_device_state(&drive, "")
+            .map_err(|err| format_err!("could not unset tape device state: {}", err))?;
+        result
+    })
+}
+
 #[api(
     input: {
         properties: {