1use crate::id::*;
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8use utoipa::ToSchema;
9
10#[derive(
12 Debug, Serialize, Deserialize, Clone, sqlx::Type, PartialEq, Eq, ToSchema, schemars::JsonSchema,
13)]
14#[sqlx(type_name = "run_status", rename_all = "snake_case")]
15#[serde(rename_all = "snake_case")]
16pub enum RunStatus {
17 Queued,
19 Resolving,
21 StartPending,
23 Running,
25 Succeeded,
27 Failed,
29 Aborted,
31}
32
33impl From<String> for RunStatus {
34 fn from(s: String) -> Self {
35 match s.as_str() {
36 "resolving" => RunStatus::Resolving,
37 "start_pending" => RunStatus::StartPending,
38 "running" => RunStatus::Running,
39 "succeeded" => RunStatus::Succeeded,
40 "failed" => RunStatus::Failed,
41 "aborted" => RunStatus::Aborted,
42 _ => RunStatus::Queued,
43 }
44 }
45}
46
47impl From<RunStatus> for String {
48 fn from(s: RunStatus) -> Self {
49 match s {
50 RunStatus::Queued => "queued".to_string(),
51 RunStatus::Resolving => "resolving".to_string(),
52 RunStatus::StartPending => "start_pending".to_string(),
53 RunStatus::Running => "running".to_string(),
54 RunStatus::Succeeded => "succeeded".to_string(),
55 RunStatus::Failed => "failed".to_string(),
56 RunStatus::Aborted => "aborted".to_string(),
57 }
58 }
59}
60
61#[derive(Debug, Serialize, Deserialize, Clone, sqlx::FromRow)]
63pub struct WorkflowRun {
64 pub id: RunId,
66 pub workflow_name: String,
68 pub initiating_user: String,
70 pub repo_url: String,
72 pub workflow_path: String,
74 pub git_ref: String,
76 pub status: RunStatus,
78 pub version: i32, pub fencing_token: i64, pub created_at: DateTime<Utc>,
84 pub updated_at: DateTime<Utc>,
86 pub started_resolving_at: Option<DateTime<Utc>>,
88 pub started_at: Option<DateTime<Utc>>,
90 pub finished_at: Option<DateTime<Utc>>,
92 pub error: Option<String>,
94}
95
96#[derive(Debug, Serialize, Deserialize, Clone, sqlx::FromRow)]
98pub struct RunContext {
99 pub run_id: RunId,
101 pub dsl_version: String,
103 pub workflow_definition: Value, pub source_code: String, pub inputs: Value, pub secrets: Value, pub sensitive_values: Vec<String>, }
114
115#[derive(Debug, Serialize, Deserialize, Clone, sqlx::FromRow)]
117pub struct RunQuotas {
118 pub run_id: RunId,
120 pub max_concurrency: i32,
122 pub max_cpu: String,
124 pub max_memory: String,
126 pub max_storage: String,
128 pub timeout: String,
130 pub current_cpu_usage: f64,
132 pub current_memory_usage: String,
134}
135
136#[derive(Debug, Serialize, Deserialize, Clone, sqlx::FromRow)]
138pub struct AuditLog {
139 pub id: i64,
141 pub run_id: RunId,
143 pub event_type: String, pub actor: String, pub payload: Value,
149 pub created_at: DateTime<Utc>,
151}
152
153#[cfg(test)]
154mod tests {
155 use super::*;
156
157 #[test]
158 fn test_run_status_from_string() {
159 assert_eq!(
160 RunStatus::from("resolving".to_string()),
161 RunStatus::Resolving
162 );
163 assert_eq!(
164 RunStatus::from("start_pending".to_string()),
165 RunStatus::StartPending
166 );
167 assert_eq!(RunStatus::from("running".to_string()), RunStatus::Running);
168 assert_eq!(
169 RunStatus::from("succeeded".to_string()),
170 RunStatus::Succeeded
171 );
172 assert_eq!(RunStatus::from("failed".to_string()), RunStatus::Failed);
173 assert_eq!(RunStatus::from("aborted".to_string()), RunStatus::Aborted);
174 assert_eq!(RunStatus::from("queued".to_string()), RunStatus::Queued);
175 assert_eq!(RunStatus::from("unknown".to_string()), RunStatus::Queued);
176 }
177
178 #[test]
179 fn test_run_status_to_string() {
180 assert_eq!(String::from(RunStatus::Queued), "queued");
181 assert_eq!(String::from(RunStatus::Resolving), "resolving");
182 assert_eq!(String::from(RunStatus::StartPending), "start_pending");
183 assert_eq!(String::from(RunStatus::Running), "running");
184 assert_eq!(String::from(RunStatus::Succeeded), "succeeded");
185 assert_eq!(String::from(RunStatus::Failed), "failed");
186 assert_eq!(String::from(RunStatus::Aborted), "aborted");
187 }
188}