add helper to compute job scheduling state
This commit is contained in:
parent
1689296d46
commit
1860208560
|
@ -47,7 +47,19 @@ use proxmox::tools::fs::{
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::server::{upid_read_status, worker_is_active_local, TaskState, UPID};
|
use crate::{
|
||||||
|
tools::systemd::time::{
|
||||||
|
parse_calendar_event,
|
||||||
|
compute_next_event,
|
||||||
|
},
|
||||||
|
api2::types::JobScheduleStatus,
|
||||||
|
server::{
|
||||||
|
UPID,
|
||||||
|
TaskState,
|
||||||
|
upid_read_status,
|
||||||
|
worker_is_active_local,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
#[serde(rename_all = "kebab-case")]
|
#[serde(rename_all = "kebab-case")]
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
|
@ -257,3 +269,37 @@ impl Job {
|
||||||
replace_file(path, serialized.as_bytes(), options)
|
replace_file(path, serialized.as_bytes(), options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn compute_schedule_status(
|
||||||
|
job_state: &JobState,
|
||||||
|
schedule: Option<&str>,
|
||||||
|
) -> Result<JobScheduleStatus, Error> {
|
||||||
|
|
||||||
|
let (upid, endtime, state, starttime) = match job_state {
|
||||||
|
JobState::Created { time } => (None, None, None, *time),
|
||||||
|
JobState::Started { upid } => {
|
||||||
|
let parsed_upid: UPID = upid.parse()?;
|
||||||
|
(Some(upid), None, None, parsed_upid.starttime)
|
||||||
|
},
|
||||||
|
JobState::Finished { upid, state } => {
|
||||||
|
let parsed_upid: UPID = upid.parse()?;
|
||||||
|
(Some(upid), Some(state.endtime()), Some(state.to_string()), parsed_upid.starttime)
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut status = JobScheduleStatus::default();
|
||||||
|
status.last_run_upid = upid.map(String::from);
|
||||||
|
status.last_run_state = state;
|
||||||
|
status.last_run_endtime = endtime;
|
||||||
|
|
||||||
|
let last = endtime.unwrap_or(starttime);
|
||||||
|
|
||||||
|
if let Some(schedule) = schedule {
|
||||||
|
if let Ok(event) = parse_calendar_event(&schedule) {
|
||||||
|
// ignore errors
|
||||||
|
status.next_run = compute_next_event(&event, last, false).unwrap_or(None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(status)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue