1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
7pub struct DeploymentSummary {
8 pub name: String,
10 pub status: String,
12 pub service_count: usize,
14 pub created_at: String,
16}
17
18#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
20pub struct ServiceHealthInfo {
21 pub name: String,
23 pub replicas_running: u32,
25 pub replicas_desired: u32,
27 pub health: String,
29 pub endpoints: Vec<String>,
31}
32
33#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
35pub struct DeploymentDetails {
36 pub name: String,
38 pub status: String,
40 pub services: Vec<String>,
42 pub service_health: Vec<ServiceHealthInfo>,
44 pub created_at: String,
46 pub updated_at: String,
48}
49
50#[derive(Debug, Deserialize, utoipa::ToSchema)]
52pub struct CreateDeploymentRequest {
53 pub spec: String,
55}
56
57#[derive(Debug, Clone, Serialize)]
59#[serde(tag = "kind", rename_all = "snake_case")]
60pub enum DeploymentProgressEvent {
61 Started {
63 deployment: String,
65 services: Vec<String>,
67 },
68 ServiceRegistered {
70 service: String,
72 },
73 ServiceRegistrationFailed {
75 service: String,
77 error: String,
79 },
80 OverlayCreated {
82 service: String,
84 interface: String,
86 },
87 OverlayFailed {
89 service: String,
91 error: String,
93 },
94 ProxyConfigured {
96 service: String,
98 },
99 ProxyFailed {
101 service: String,
103 error: String,
105 },
106 ServiceScaling {
108 service: String,
110 target: u32,
112 },
113 ServiceScaled {
115 service: String,
117 replicas: u32,
119 },
120 ServiceScaleFailed {
122 service: String,
124 error: String,
126 },
127 Stabilizing,
129 ServiceRegistrationStarted {
131 service: String,
133 },
134 OverlaySetupStarted {
136 service: String,
138 },
139 ProxySetupStarted {
141 service: String,
143 },
144 StabilizationProgress {
146 service: String,
148 replicas_running: u32,
150 target: u32,
152 },
153 ImagePullStarted {
155 image: String,
157 },
158 ImagePullComplete {
160 image: String,
162 digest: String,
164 },
165 ServiceUpToDate {
167 service: String,
169 digest: String,
171 },
172 ServiceRecreating {
174 service: String,
176 old_digest: String,
178 new_digest: String,
180 },
181 Ready,
183 Failed {
185 message: String,
187 },
188}
189
190#[derive(Debug, Clone, Serialize)]
195pub struct DeploymentEventWrapper {
196 #[serde(rename = "type")]
198 pub event_type: String,
199 pub data: serde_json::Value,
201}
202
203impl From<DeploymentProgressEvent> for DeploymentEventWrapper {
204 #[allow(clippy::too_many_lines)]
205 fn from(event: DeploymentProgressEvent) -> Self {
206 match event {
207 DeploymentProgressEvent::Started {
208 deployment,
209 services,
210 } => DeploymentEventWrapper {
211 event_type: "started".to_string(),
212 data: serde_json::json!({
213 "deployment": deployment,
214 "services": services,
215 }),
216 },
217 DeploymentProgressEvent::ServiceRegistered { service } => DeploymentEventWrapper {
218 event_type: "service_registered".to_string(),
219 data: serde_json::json!({ "service": service }),
220 },
221 DeploymentProgressEvent::ServiceRegistrationFailed { service, error } => {
222 DeploymentEventWrapper {
223 event_type: "service_registration_failed".to_string(),
224 data: serde_json::json!({ "service": service, "error": error }),
225 }
226 }
227 DeploymentProgressEvent::OverlayCreated { service, interface } => {
228 DeploymentEventWrapper {
229 event_type: "overlay_created".to_string(),
230 data: serde_json::json!({ "service": service, "interface": interface }),
231 }
232 }
233 DeploymentProgressEvent::OverlayFailed { service, error } => DeploymentEventWrapper {
234 event_type: "overlay_failed".to_string(),
235 data: serde_json::json!({ "service": service, "error": error }),
236 },
237 DeploymentProgressEvent::ProxyConfigured { service } => DeploymentEventWrapper {
238 event_type: "proxy_configured".to_string(),
239 data: serde_json::json!({ "service": service }),
240 },
241 DeploymentProgressEvent::ProxyFailed { service, error } => DeploymentEventWrapper {
242 event_type: "proxy_failed".to_string(),
243 data: serde_json::json!({ "service": service, "error": error }),
244 },
245 DeploymentProgressEvent::ServiceScaling { service, target } => DeploymentEventWrapper {
246 event_type: "service_scaling".to_string(),
247 data: serde_json::json!({ "service": service, "target": target }),
248 },
249 DeploymentProgressEvent::ServiceScaled { service, replicas } => {
250 DeploymentEventWrapper {
251 event_type: "service_scaled".to_string(),
252 data: serde_json::json!({ "service": service, "replicas": replicas }),
253 }
254 }
255 DeploymentProgressEvent::ServiceScaleFailed { service, error } => {
256 DeploymentEventWrapper {
257 event_type: "service_scale_failed".to_string(),
258 data: serde_json::json!({ "service": service, "error": error }),
259 }
260 }
261 DeploymentProgressEvent::Stabilizing => DeploymentEventWrapper {
262 event_type: "stabilizing".to_string(),
263 data: serde_json::json!({}),
264 },
265 DeploymentProgressEvent::ServiceRegistrationStarted { service } => {
266 DeploymentEventWrapper {
267 event_type: "service_registration_started".to_string(),
268 data: serde_json::json!({ "service": service }),
269 }
270 }
271 DeploymentProgressEvent::OverlaySetupStarted { service } => DeploymentEventWrapper {
272 event_type: "overlay_setup_started".to_string(),
273 data: serde_json::json!({ "service": service }),
274 },
275 DeploymentProgressEvent::ProxySetupStarted { service } => DeploymentEventWrapper {
276 event_type: "proxy_setup_started".to_string(),
277 data: serde_json::json!({ "service": service }),
278 },
279 DeploymentProgressEvent::StabilizationProgress {
280 service,
281 replicas_running,
282 target,
283 } => DeploymentEventWrapper {
284 event_type: "stabilization_progress".to_string(),
285 data: serde_json::json!({
286 "service": service,
287 "replicas_running": replicas_running,
288 "target": target,
289 }),
290 },
291 DeploymentProgressEvent::ImagePullStarted { image } => DeploymentEventWrapper {
292 event_type: "image_pull_started".to_string(),
293 data: serde_json::json!({ "image": image }),
294 },
295 DeploymentProgressEvent::ImagePullComplete { image, digest } => {
296 DeploymentEventWrapper {
297 event_type: "image_pull_complete".to_string(),
298 data: serde_json::json!({ "image": image, "digest": digest }),
299 }
300 }
301 DeploymentProgressEvent::ServiceUpToDate { service, digest } => {
302 DeploymentEventWrapper {
303 event_type: "service_up_to_date".to_string(),
304 data: serde_json::json!({ "service": service, "digest": digest }),
305 }
306 }
307 DeploymentProgressEvent::ServiceRecreating {
308 service,
309 old_digest,
310 new_digest,
311 } => DeploymentEventWrapper {
312 event_type: "service_recreating".to_string(),
313 data: serde_json::json!({
314 "service": service,
315 "old_digest": old_digest,
316 "new_digest": new_digest,
317 }),
318 },
319 DeploymentProgressEvent::Ready => DeploymentEventWrapper {
320 event_type: "ready".to_string(),
321 data: serde_json::json!({}),
322 },
323 DeploymentProgressEvent::Failed { message } => DeploymentEventWrapper {
324 event_type: "failed".to_string(),
325 data: serde_json::json!({ "message": message }),
326 },
327 }
328 }
329}