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