api: list tape backup jobs with scheduling status
This commit is contained in:
parent
1860208560
commit
7690a8e7bd
|
@ -1,7 +1,7 @@
|
||||||
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::{
|
||||||
|
@ -17,9 +17,18 @@ use crate::{
|
||||||
task_log,
|
task_log,
|
||||||
config::{
|
config::{
|
||||||
self,
|
self,
|
||||||
tape_job::TapeBackupJobConfig,
|
tape_job::{
|
||||||
|
TapeBackupJobConfig,
|
||||||
|
TapeBackupJobStatus,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server::{
|
||||||
|
jobstate::{
|
||||||
|
Job,
|
||||||
|
JobState,
|
||||||
|
compute_schedule_status,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
server::jobstate::Job,
|
|
||||||
backup::{
|
backup::{
|
||||||
DataStore,
|
DataStore,
|
||||||
BackupDir,
|
BackupDir,
|
||||||
|
@ -54,9 +63,49 @@ const TAPE_BACKUP_JOB_ROUTER: Router = Router::new()
|
||||||
.post(&API_METHOD_RUN_TAPE_BACKUP_JOB);
|
.post(&API_METHOD_RUN_TAPE_BACKUP_JOB);
|
||||||
|
|
||||||
pub const ROUTER: Router = Router::new()
|
pub const ROUTER: Router = Router::new()
|
||||||
|
.get(&API_METHOD_LIST_TAPE_BACKUP_JOBS)
|
||||||
.post(&API_METHOD_BACKUP)
|
.post(&API_METHOD_BACKUP)
|
||||||
.match_all("id", &TAPE_BACKUP_JOB_ROUTER);
|
.match_all("id", &TAPE_BACKUP_JOB_ROUTER);
|
||||||
|
|
||||||
|
#[api(
|
||||||
|
returns: {
|
||||||
|
description: "List configured thape backup jobs and their status",
|
||||||
|
type: Array,
|
||||||
|
items: { type: TapeBackupJobStatus },
|
||||||
|
},
|
||||||
|
)]
|
||||||
|
/// List all tape backup jobs
|
||||||
|
pub fn list_tape_backup_jobs(
|
||||||
|
_param: Value,
|
||||||
|
mut rpcenv: &mut dyn RpcEnvironment,
|
||||||
|
) -> Result<Vec<TapeBackupJobStatus>, Error> {
|
||||||
|
|
||||||
|
let (config, digest) = config::tape_job::config()?;
|
||||||
|
|
||||||
|
let job_list_iter = config
|
||||||
|
.convert_to_typed_array("backup")?
|
||||||
|
.into_iter()
|
||||||
|
.filter(|_job: &TapeBackupJobConfig| {
|
||||||
|
// fixme: check access permission
|
||||||
|
true
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut list = Vec::new();
|
||||||
|
|
||||||
|
for job in job_list_iter {
|
||||||
|
let last_state = JobState::load("tape-backup-job", &job.id)
|
||||||
|
.map_err(|err| format_err!("could not open statefile for {}: {}", &job.id, err))?;
|
||||||
|
|
||||||
|
let status = compute_schedule_status(&last_state, job.schedule.as_deref())?;
|
||||||
|
|
||||||
|
list.push(TapeBackupJobStatus { config: job, status });
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
|
||||||
|
|
||||||
|
Ok(list)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn do_tape_backup_job(
|
pub fn do_tape_backup_job(
|
||||||
mut job: Job,
|
mut job: Job,
|
||||||
tape_job: TapeBackupJobConfig,
|
tape_job: TapeBackupJobConfig,
|
||||||
|
|
|
@ -22,6 +22,7 @@ use crate::api2::types::{
|
||||||
MEDIA_POOL_NAME_SCHEMA,
|
MEDIA_POOL_NAME_SCHEMA,
|
||||||
SINGLE_LINE_COMMENT_SCHEMA,
|
SINGLE_LINE_COMMENT_SCHEMA,
|
||||||
SYNC_SCHEDULE_SCHEMA,
|
SYNC_SCHEDULE_SCHEMA,
|
||||||
|
JobScheduleStatus,
|
||||||
};
|
};
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
@ -81,6 +82,26 @@ pub struct TapeBackupJobConfig {
|
||||||
pub schedule: Option<String>,
|
pub schedule: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[api(
|
||||||
|
properties: {
|
||||||
|
config: {
|
||||||
|
type: TapeBackupJobConfig,
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
type: JobScheduleStatus,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)]
|
||||||
|
#[serde(rename_all="kebab-case")]
|
||||||
|
#[derive(Serialize,Deserialize)]
|
||||||
|
/// Status of Tape Backup Job
|
||||||
|
pub struct TapeBackupJobStatus {
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub config: TapeBackupJobConfig,
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub status: JobScheduleStatus,
|
||||||
|
}
|
||||||
|
|
||||||
fn init() -> SectionConfig {
|
fn init() -> SectionConfig {
|
||||||
let obj_schema = match TapeBackupJobConfig::API_SCHEMA {
|
let obj_schema = match TapeBackupJobConfig::API_SCHEMA {
|
||||||
Schema::Object(ref obj_schema) => obj_schema,
|
Schema::Object(ref obj_schema) => obj_schema,
|
||||||
|
|
Loading…
Reference in New Issue