]> git.proxmox.com Git - proxmox-backup.git/commitdiff
add helper to compute job scheduling state
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 07:58:50 +0000 (08:58 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 07:58:50 +0000 (08:58 +0100)
src/server/jobstate.rs

index ea934e00ef0e30fa56e74146c01b11b0ed02b28d..81e516d4f64764f9b98f048584913cbce131266b 100644 (file)
@@ -47,7 +47,19 @@ use proxmox::tools::fs::{
 };
 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")]
 #[derive(Serialize, Deserialize)]
@@ -257,3 +269,37 @@ impl Job {
         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)
+}