Skip to main content

arcbox_oci/config/
process.rs

1//! Process configuration types.
2
3use serde::{Deserialize, Serialize};
4
5/// Container process configuration.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct Process {
9    /// Whether to allocate a terminal.
10    #[serde(default)]
11    pub terminal: bool,
12
13    /// Console size (only used if terminal is true).
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub console_size: Option<ConsoleSize>,
16
17    /// Current working directory (must be absolute path).
18    /// REQUIRED field.
19    pub cwd: String,
20
21    /// Environment variables.
22    #[serde(default, skip_serializing_if = "Vec::is_empty")]
23    pub env: Vec<String>,
24
25    /// Command arguments.
26    #[serde(default, skip_serializing_if = "Vec::is_empty")]
27    pub args: Vec<String>,
28
29    /// Resource limits (rlimits).
30    #[serde(default, skip_serializing_if = "Vec::is_empty")]
31    pub rlimits: Vec<Rlimit>,
32
33    /// `AppArmor` profile.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub apparmor_profile: Option<String>,
36
37    /// Linux capabilities.
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub capabilities: Option<Capabilities>,
40
41    /// Prevent gaining new privileges.
42    #[serde(default, skip_serializing_if = "std::ops::Not::not")]
43    pub no_new_privileges: bool,
44
45    /// OOM score adjustment.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub oom_score_adj: Option<i32>,
48
49    /// `SELinux` label.
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub selinux_label: Option<String>,
52
53    /// User specification.
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub user: Option<User>,
56
57    /// I/O priority.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub io_priority: Option<IoPriority>,
60
61    /// Scheduler settings.
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub scheduler: Option<Scheduler>,
64
65    /// CPU affinity for exec.
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub exec_cpu_affinity: Option<ExecCpuAffinity>,
68}
69
70impl Default for Process {
71    fn default() -> Self {
72        Self {
73            terminal: false,
74            console_size: None,
75            cwd: "/".to_string(),
76            env: vec![
77                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin".to_string(),
78                "TERM=xterm".to_string(),
79            ],
80            args: vec!["sh".to_string()],
81            rlimits: vec![Rlimit {
82                rlimit_type: "RLIMIT_NOFILE".to_string(),
83                soft: 1024,
84                hard: 1024,
85            }],
86            apparmor_profile: None,
87            capabilities: Some(Capabilities::default()),
88            no_new_privileges: false,
89            oom_score_adj: None,
90            selinux_label: None,
91            user: Some(User::default()),
92            io_priority: None,
93            scheduler: None,
94            exec_cpu_affinity: None,
95        }
96    }
97}
98
99/// Console size configuration.
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ConsoleSize {
102    /// Height in characters.
103    pub height: u32,
104    /// Width in characters.
105    pub width: u32,
106}
107
108/// Resource limit (rlimit) configuration.
109#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct Rlimit {
111    /// Limit type (e.g., `RLIMIT_NOFILE`).
112    #[serde(rename = "type")]
113    pub rlimit_type: String,
114    /// Soft limit.
115    pub soft: u64,
116    /// Hard limit.
117    pub hard: u64,
118}
119
120/// Linux capabilities configuration.
121#[derive(Debug, Clone, Default, Serialize, Deserialize)]
122pub struct Capabilities {
123    /// Effective capabilities.
124    #[serde(default, skip_serializing_if = "Vec::is_empty")]
125    pub effective: Vec<String>,
126    /// Bounding capabilities.
127    #[serde(default, skip_serializing_if = "Vec::is_empty")]
128    pub bounding: Vec<String>,
129    /// Inheritable capabilities.
130    #[serde(default, skip_serializing_if = "Vec::is_empty")]
131    pub inheritable: Vec<String>,
132    /// Permitted capabilities.
133    #[serde(default, skip_serializing_if = "Vec::is_empty")]
134    pub permitted: Vec<String>,
135    /// Ambient capabilities.
136    #[serde(default, skip_serializing_if = "Vec::is_empty")]
137    pub ambient: Vec<String>,
138}
139
140/// User identity configuration (POSIX).
141#[derive(Debug, Clone, Default, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct User {
144    /// User ID.
145    #[serde(default)]
146    pub uid: u32,
147    /// Group ID.
148    #[serde(default)]
149    pub gid: u32,
150    /// File creation mask.
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub umask: Option<u32>,
153    /// Additional group IDs.
154    #[serde(default, skip_serializing_if = "Vec::is_empty")]
155    pub additional_gids: Vec<u32>,
156}
157
158/// I/O priority configuration.
159#[derive(Debug, Clone, Serialize, Deserialize)]
160pub struct IoPriority {
161    /// I/O scheduling class.
162    pub class: String,
163    /// Priority within class.
164    pub priority: i32,
165}
166
167/// Process scheduler configuration.
168#[derive(Debug, Clone, Serialize, Deserialize)]
169pub struct Scheduler {
170    /// Scheduling policy.
171    pub policy: String,
172    /// Nice value.
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub nice: Option<i32>,
175    /// Priority.
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub priority: Option<i32>,
178    /// Scheduler flags.
179    #[serde(default, skip_serializing_if = "Vec::is_empty")]
180    pub flags: Vec<String>,
181    /// Runtime (for deadline scheduler).
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub runtime: Option<u64>,
184    /// Deadline (for deadline scheduler).
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub deadline: Option<u64>,
187    /// Period (for deadline scheduler).
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub period: Option<u64>,
190}
191
192/// CPU affinity for exec.
193#[derive(Debug, Clone, Serialize, Deserialize)]
194pub struct ExecCpuAffinity {
195    /// Initial CPU affinity.
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub initial: Option<String>,
198    /// Final CPU affinity.
199    #[serde(rename = "final", skip_serializing_if = "Option::is_none")]
200    pub final_affinity: Option<String>,
201}