api2/tape/drive: add run_drive_worker wrapper
a wrapper for locking, starting the worker and writing the state Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
parent
546d2653ee
commit
a44c934b5d
@ -1,7 +1,8 @@
|
|||||||
|
use std::panic::UnwindSafe;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::{bail, Error};
|
use anyhow::{bail, format_err, Error};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
use proxmox::{
|
use proxmox::{
|
||||||
@ -62,11 +63,44 @@ use crate::{
|
|||||||
required_media_changer,
|
required_media_changer,
|
||||||
open_drive,
|
open_drive,
|
||||||
lock_tape_device,
|
lock_tape_device,
|
||||||
|
set_tape_device_state,
|
||||||
},
|
},
|
||||||
changer::update_changer_online_status,
|
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(
|
#[api(
|
||||||
input: {
|
input: {
|
||||||
properties: {
|
properties: {
|
||||||
|
Loading…
Reference in New Issue
Block a user