Skip to main content

agent_workspace_contract/environment/
managed_workloads.rs

1//! Long-lived Harness workload contracts owned by Workspace Environment.
2
3use serde::{Deserialize, Serialize};
4
5use crate::{CommandSpec, ResourceScope};
6
7pub const MANAGED_WORKLOADS_PATH: &str = "/internal/v1/workspace/managed-workloads";
8pub const MANAGED_WORKLOAD_PATH: &str = "/internal/v1/workspace/managed-workloads/{workloadId}";
9pub const MANAGED_WORKLOAD_STOP_PATH: &str =
10    "/internal/v1/workspace/managed-workloads/{workloadId}/stop";
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "snake_case")]
14pub enum ManagedWorkloadIsolation {
15    Direct,
16    Sandbox,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
20#[serde(rename_all = "snake_case")]
21pub enum ManagedWorkloadState {
22    Running,
23    Ready,
24    Succeeded,
25    Failed,
26    Stopping,
27    Stopped,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31#[serde(deny_unknown_fields, rename_all = "camelCase")]
32pub struct CreateManagedWorkloadRequest {
33    pub runtime_id: String,
34    pub computer_id: String,
35    pub space_id: String,
36    pub isolation: ManagedWorkloadIsolation,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub template_id: Option<String>,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub template_version: Option<String>,
41    pub bundle_digest: String,
42    #[serde(with = "super::base64_bytes")]
43    pub bundle_content: Vec<u8>,
44    pub readiness_path: String,
45    /// Ports whose provider authorities must be trusted by the workload's HTTP server.
46    #[serde(default, skip_serializing_if = "Vec::is_empty")]
47    pub preview_ports: Vec<u16>,
48    pub command: CommandSpec,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52#[serde(deny_unknown_fields, rename_all = "camelCase")]
53pub struct ManagedWorkload {
54    pub id: String,
55    pub scope: ResourceScope,
56    pub runtime_id: String,
57    pub computer_id: String,
58    pub space_id: String,
59    pub isolation: ManagedWorkloadIsolation,
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub template_id: Option<String>,
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub template_version: Option<String>,
64    pub bundle_digest: String,
65    pub bundle_path: String,
66    pub readiness_path: String,
67    pub command_id: String,
68    pub command: CommandSpec,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub sandbox_id: Option<String>,
71    pub state: ManagedWorkloadState,
72    pub revision: u64,
73    pub created_at_ms: u64,
74    pub updated_at_ms: u64,
75}
76
77#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
78#[serde(deny_unknown_fields, rename_all = "camelCase")]
79pub struct ManagedWorkloadResource {
80    pub id: String,
81    pub runtime_id: String,
82    pub computer_id: String,
83    pub space_id: String,
84    pub isolation: ManagedWorkloadIsolation,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub template_id: Option<String>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub template_version: Option<String>,
89    pub bundle_digest: String,
90    pub bundle_path: String,
91    pub readiness_path: String,
92    pub command_id: String,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub sandbox_id: Option<String>,
95    pub state: ManagedWorkloadState,
96    pub revision: u64,
97    pub created_at_ms: u64,
98    pub updated_at_ms: u64,
99}
100
101impl From<ManagedWorkload> for ManagedWorkloadResource {
102    fn from(record: ManagedWorkload) -> Self {
103        Self {
104            id: record.id,
105            runtime_id: record.runtime_id,
106            computer_id: record.computer_id,
107            space_id: record.space_id,
108            isolation: record.isolation,
109            template_id: record.template_id,
110            template_version: record.template_version,
111            bundle_digest: record.bundle_digest,
112            bundle_path: record.bundle_path,
113            readiness_path: record.readiness_path,
114            command_id: record.command_id,
115            sandbox_id: record.sandbox_id,
116            state: record.state,
117            revision: record.revision,
118            created_at_ms: record.created_at_ms,
119            updated_at_ms: record.updated_at_ms,
120        }
121    }
122}