Skip to main content

arcbox_oci/config/
linux.rs

1//! Linux-specific OCI configuration types.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6use super::{IdMapping, Resources, Seccomp, TimeOffsets};
7
8/// Linux-specific container configuration.
9#[derive(Debug, Clone, Default, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct Linux {
12    /// Devices to create in container.
13    #[serde(default, skip_serializing_if = "Vec::is_empty")]
14    pub devices: Vec<Device>,
15
16    /// UID mappings for user namespace.
17    #[serde(default, skip_serializing_if = "Vec::is_empty")]
18    pub uid_mappings: Vec<IdMapping>,
19
20    /// GID mappings for user namespace.
21    #[serde(default, skip_serializing_if = "Vec::is_empty")]
22    pub gid_mappings: Vec<IdMapping>,
23
24    /// Kernel parameters (sysctl).
25    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
26    pub sysctl: HashMap<String, String>,
27
28    /// Cgroups path.
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub cgroups_path: Option<String>,
31
32    /// Resource limits.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub resources: Option<Resources>,
35
36    /// Root filesystem propagation mode.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub rootfs_propagation: Option<String>,
39
40    /// Seccomp configuration.
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub seccomp: Option<Seccomp>,
43
44    /// Namespaces to join or create.
45    #[serde(default, skip_serializing_if = "Vec::is_empty")]
46    pub namespaces: Vec<Namespace>,
47
48    /// Paths to mask (make inaccessible).
49    #[serde(default, skip_serializing_if = "Vec::is_empty")]
50    pub masked_paths: Vec<String>,
51
52    /// Paths to make read-only.
53    #[serde(default, skip_serializing_if = "Vec::is_empty")]
54    pub readonly_paths: Vec<String>,
55
56    /// `SELinux` mount label.
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub mount_label: Option<String>,
59
60    /// Time offsets.
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub time_offsets: Option<TimeOffsets>,
63}
64
65/// Device configuration.
66#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct Device {
69    /// Device type (c, b, p, u).
70    #[serde(rename = "type")]
71    pub device_type: String,
72    /// Device path in container.
73    pub path: String,
74    /// Major device number.
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub major: Option<i64>,
77    /// Minor device number.
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub minor: Option<i64>,
80    /// File mode.
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub file_mode: Option<u32>,
83    /// Owner UID.
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub uid: Option<u32>,
86    /// Owner GID.
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub gid: Option<u32>,
89}
90
91/// Linux namespace configuration.
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct Namespace {
94    /// Namespace type.
95    #[serde(rename = "type")]
96    pub ns_type: NamespaceType,
97    /// Path to join existing namespace.
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub path: Option<String>,
100}
101
102/// Linux namespace types.
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
104#[serde(rename_all = "lowercase")]
105pub enum NamespaceType {
106    /// PID namespace.
107    Pid,
108    /// Network namespace.
109    Network,
110    /// Mount namespace.
111    Mount,
112    /// IPC namespace.
113    Ipc,
114    /// UTS namespace.
115    Uts,
116    /// User namespace.
117    User,
118    /// Cgroup namespace.
119    Cgroup,
120    /// Time namespace.
121    Time,
122}