edge_schema/schema/
job.rs1use 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 pub max_retries: Option<u32>,
27
28 pub timeout: Option<PrettyDuration>,
32
33 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>;