1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub enum ExecutionMethod {
7 #[serde(rename = "ssh")]
8 SSH,
9 #[serde(rename = "websocket")]
10 WebSocket,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct SshConfig {
16 pub host: String,
17 pub port: u16,
18 pub username: String,
19 pub password: Option<String>,
20 pub private_key_path: Option<String>,
21 pub session_timeout_seconds: Option<u64>,
22 pub timeout_seconds: Option<u64>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct WebSocketConfig {
28 pub url: String,
29 pub timeout_seconds: Option<u64>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct ClientConfig {
35 pub name: String,
36 pub execution_method: ExecutionMethod,
37 pub ssh_config: Option<SshConfig>,
38 pub websocket_config: Option<WebSocketConfig>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct ExtractRule {
44 pub name: String,
45 pub patterns: Vec<String>, pub source: String, #[serde(default = "default_cascade")]
48 pub cascade: bool, }
50
51fn default_cascade() -> bool {
53 true
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize, Default)]
58pub struct Step {
59 pub title: Option<String>,
60 pub name: String,
61 pub script: String,
62 #[serde(default)]
63 pub servers: Vec<String>,
64 pub timeout_seconds: Option<u64>,
65 pub extract: Option<Vec<ExtractRule>>,
66 #[serde(default)]
67 pub variables: Option<HashMap<String, String>>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct Pipeline {
73 pub name: String,
74 pub title: Option<String>,
75 pub steps: Vec<Step>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct RemoteExecutionConfig {
81 pub variables: Option<HashMap<String, String>>,
82 pub clients: HashMap<String, ClientConfig>,
83 pub pipelines: Vec<Pipeline>,
84 pub default_timeout: Option<u64>,
85}
86
87#[derive(Debug, Clone)]
89pub enum OutputType {
90 Stdout,
91 Stderr,
92 Log,
93 StepStarted, StepCompleted, }
96
97#[derive(Debug, Clone)]
99pub struct OutputEvent {
100 pub pipeline_name: String,
101 pub server_name: String,
102 pub step: Step, pub output_type: OutputType,
104 pub content: String,
105 pub timestamp: std::time::Instant,
106 pub variables: HashMap<String, String>, }
108
109pub type OutputCallback = std::sync::Arc<dyn Fn(OutputEvent) + Send + Sync>;
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct ExecutionResult {
115 pub success: bool,
116 pub stdout: String,
117 pub stderr: String,
118 pub script: String,
119 pub exit_code: i32,
120 pub execution_time_ms: u64,
121 pub error_message: Option<String>,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct StepExecutionResult {
127 pub title: String,
128 pub step_name: String,
129 pub server_name: String,
130 pub execution_result: ExecutionResult,
131 pub overall_success: bool,
132 pub execution_time_ms: u64,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct PipelineExecutionResult {
138 pub pipeline_name: String,
139 pub title: String,
140 pub step_results: Vec<StepExecutionResult>,
141 pub overall_success: bool,
142 pub total_execution_time_ms: u64,
143}