daytona_client/models/
workspace.rs

1//! Workspace-related models
2
3use std::collections::HashMap;
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7use uuid::Uuid;
8
9/// Workspace configuration and metadata
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct Workspace {
13    pub id: Uuid,
14    pub organization_id: Uuid,
15    pub name: String,
16    pub description: Option<String>,
17    pub target: String,
18    pub snapshot: String,
19    pub user: String,
20    pub env: HashMap<String, String>,
21    pub cpu: u32,
22    pub gpu: u32,
23    pub memory: u32,
24    pub disk: u32,
25    pub public: bool,
26    pub network_block_all: bool,
27    pub network_allow_list: Option<Vec<String>>,
28    pub labels: HashMap<String, String>,
29    pub volumes: Vec<WorkspaceVolume>,
30    pub state: WorkspaceState,
31    pub desired_state: WorkspaceState,
32    pub error_reason: Option<String>,
33    pub backup_state: BackupState,
34    pub auto_stop_interval: u32,
35    pub auto_archive_interval: u32,
36    pub auto_delete_interval: i32,
37    pub class: String,
38    pub created_at: DateTime<Utc>,
39    pub updated_at: DateTime<Utc>,
40    pub runner_domain: Option<String>,
41    pub daemon_version: Option<String>,
42    pub git_repository: Option<GitRepository>,
43    pub ports: Option<Vec<PortMapping>>,
44}
45
46/// Workspace state
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "lowercase")]
49pub enum WorkspaceState {
50    Started,
51    Stopped,
52    Starting,
53    Stopping,
54    Archived,
55    Archiving, // Added missing state returned by API
56    Restoring,
57    Destroying,
58    Destroyed,
59    Error,
60}
61
62/// Backup state
63#[derive(Debug, Clone, Serialize, Deserialize)]
64#[serde(rename_all = "PascalCase")]
65pub enum BackupState {
66    None,
67    Pending,
68    InProgress,
69    Completed,
70    Failed,
71}
72
73/// Workspace volume
74#[derive(Debug, Clone, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct WorkspaceVolume {
77    pub name: String,
78    pub path: String,
79    pub size: u32,
80    pub persistent: bool,
81}
82
83/// Git repository configuration
84#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(rename_all = "camelCase")]
86pub struct GitRepository {
87    pub url: String,
88    pub branch: String,
89    pub commit: Option<String>,
90    pub ssh_key: Option<String>,
91    pub auth_token: Option<String>,
92}
93
94/// Port mapping configuration
95#[derive(Debug, Clone, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase")]
97pub struct PortMapping {
98    pub port: u16,
99    pub target_port: u16,
100    pub protocol: PortProtocol,
101    pub public: bool,
102    pub description: Option<String>,
103}
104
105/// Port protocol
106#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all = "lowercase")]
108pub enum PortProtocol {
109    Tcp,
110    Udp,
111    Http,
112    Https,
113}
114
115/// Create workspace parameters
116#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct CreateWorkspaceParams {
119    pub name: String,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub description: Option<String>,
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub target: Option<String>,
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub snapshot: Option<String>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub git_repository: Option<GitRepository>,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub env: Option<HashMap<String, String>>,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub cpu: Option<u32>,
132    /// Memory in GB (not MB) — API expects GB for workspaces
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub memory: Option<u32>,
135    /// Disk size in GB (not MB) — API expects GB for workspaces
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub disk: Option<u32>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub ports: Option<Vec<PortMapping>>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub labels: Option<HashMap<String, String>>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub class: Option<String>,
144}
145
146/// Update workspace parameters
147#[derive(Debug, Clone, Serialize, Deserialize)]
148#[serde(rename_all = "camelCase")]
149pub struct UpdateWorkspaceParams {
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub name: Option<String>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub description: Option<String>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub env: Option<HashMap<String, String>>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub labels: Option<HashMap<String, String>>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub auto_stop_interval: Option<u32>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub auto_archive_interval: Option<u32>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub auto_delete_interval: Option<i32>,
164}
165
166/// Workspace backup
167#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct WorkspaceBackup {
170    pub id: Uuid,
171    pub workspace_id: Uuid,
172    pub name: String,
173    pub description: Option<String>,
174    pub size: u64,
175    pub created_at: DateTime<Utc>,
176    pub expires_at: Option<DateTime<Utc>>,
177}
178
179/// Port preview URL
180#[derive(Debug, Clone, Serialize, Deserialize)]
181#[serde(rename_all = "camelCase")]
182pub struct PortPreview {
183    pub port: u16,
184    pub url: String,
185    pub public: bool,
186    pub expires_at: Option<DateTime<Utc>>,
187}