edge_schema/schema/
job.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use time::OffsetDateTime;
5use uuid::Uuid;
6
7use crate::pretty_duration::PrettyDuration;
8
9use super::{Entity, EntityDescriptorConst, WorkloadV2};
10
11pub type JobId = Uuid;
12
13#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
14pub struct JobSpecV1 {
15    pub cronjob_id: Option<Uuid>,
16
17    #[serde(flatten)]
18    pub definition: JobDefinition,
19}
20
21#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
22pub struct JobDefinition {
23    /// Number of retries before the job is considered failed.
24    ///
25    /// Defaults to 0.
26    pub max_retries: Option<u32>,
27
28    /// Amount of time after the job is aborted and considered failed.
29    ///
30    /// Defaults to 1 hour.
31    pub timeout: Option<PrettyDuration>,
32
33    /// The thing executed by this cron job.
34    ///
35    /// May be either triggering an HTTP request to a given app, or running
36    /// spawning a new instance.
37    pub invoke: JobInvoke,
38}
39
40#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
41#[serde(rename_all = "snake_case")]
42#[allow(clippy::large_enum_variant)]
43pub enum JobInvoke {
44    Spawn(WorkloadV2),
45    Fetch(JobInvokeFetch),
46}
47
48#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
49pub struct JobInvokeFetch {
50    pub url: String,
51    pub method: Option<super::HttpMethod>,
52    pub headers: Option<HashMap<String, String>>,
53    pub success_status_codes: Option<Vec<u16>>,
54}
55
56impl EntityDescriptorConst for JobSpecV1 {
57    const NAMESPACE: &'static str = "wasmer.io";
58    const NAME: &'static str = "JobResult";
59    const VERSION: &'static str = "v1-alpha1";
60    const KIND: &'static str = "wasmer.io/CronJob.v1-alpha1";
61    type Spec = Self;
62    type State = ();
63}
64
65#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
66pub struct JobStatusV1 {
67    #[serde(with = "time::serde::timestamp::option")]
68    #[schemars(with = "Option<u64>")]
69    pub started_at: Option<OffsetDateTime>,
70    #[serde(with = "time::serde::timestamp::option")]
71    #[schemars(with = "Option<u64>")]
72    pub finished_at: Option<OffsetDateTime>,
73
74    pub success_invocation: Option<JobInvocation>,
75    pub failed_invocations: Vec<JobInvocation>,
76}
77
78#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
79pub struct JobInvocation {
80    #[serde(with = "time::serde::timestamp")]
81    #[schemars(with = "u64")]
82    pub started_at: OffsetDateTime,
83    #[serde(with = "time::serde::timestamp")]
84    #[schemars(with = "u64")]
85    pub finished_at: OffsetDateTime,
86    pub success: bool,
87    pub error: Option<String>,
88
89    pub output: Option<JobInvocationOutput>,
90}
91
92#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
93pub enum JobInvocationOutput {
94    Spawn(JobInvocationOutputSpawn),
95    Fetch(JobInvocationOutputFetch),
96}
97
98#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
99pub struct JobInvocationOutputSpawn {
100    pub instance_id: Option<Uuid>,
101    pub exit_code: Option<i32>,
102}
103
104#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
105pub struct JobInvocationOutputFetch {
106    pub status_code: Option<u16>,
107    pub body: Option<String>,
108    pub request_id: Option<Uuid>,
109}
110
111pub type Job = Entity<JobSpecV1>;