container_device_interface/specs/
config.rs

1use std::collections::BTreeMap;
2
3use libc::mode_t;
4
5use serde::{Deserialize, Serialize};
6
7// CurrentVersion is the current version of the Spec.
8pub const CURRENT_VERSION: &str = "0.7.0";
9
10// Spec is the base configuration for CDI
11#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
12pub struct Spec {
13    #[serde(rename = "cdiVersion")]
14    pub(crate) version: String,
15
16    #[serde(rename = "kind")]
17    pub(crate) kind: String,
18
19    #[serde(
20        rename = "annotations",
21        default,
22        skip_serializing_if = "BTreeMap::is_empty"
23    )]
24    pub(crate) annotations: BTreeMap<String, String>,
25
26    #[serde(rename = "devices")]
27    pub(crate) devices: Vec<Device>,
28
29    #[serde(rename = "containerEdits", skip_serializing_if = "Option::is_none")]
30    pub container_edits: Option<ContainerEdits>,
31}
32
33// Device is a "Device" a container runtime can add to a container
34#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
35pub struct Device {
36    #[serde(rename = "name")]
37    pub(crate) name: String,
38
39    #[serde(
40        rename = "annotations",
41        default,
42        skip_serializing_if = "BTreeMap::is_empty"
43    )]
44    pub(crate) annotations: BTreeMap<String, String>,
45
46    #[serde(rename = "containerEdits")]
47    pub(crate) container_edits: ContainerEdits,
48}
49
50// ContainerEdits are edits a container runtime must make to the OCI spec to expose the device.
51#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
52pub struct ContainerEdits {
53    #[serde(rename = "env", skip_serializing_if = "Option::is_none")]
54    pub env: Option<Vec<String>>,
55
56    #[serde(rename = "deviceNodes", skip_serializing_if = "Option::is_none")]
57    pub device_nodes: Option<Vec<DeviceNode>>,
58
59    #[serde(rename = "hooks", skip_serializing_if = "Option::is_none")]
60    pub hooks: Option<Vec<Hook>>,
61
62    #[serde(rename = "mounts", skip_serializing_if = "Option::is_none")]
63    pub mounts: Option<Vec<Mount>>,
64
65    #[serde(rename = "intelRdt", skip_serializing_if = "Option::is_none")]
66    pub(crate) intel_rdt: Option<IntelRdt>,
67
68    #[serde(rename = "additionalGids", skip_serializing_if = "Option::is_none")]
69    pub(crate) additional_gids: Option<Vec<u32>>,
70}
71
72// DeviceNode represents a device node that needs to be added to the OCI spec.
73#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
74pub struct DeviceNode {
75    #[serde(rename = "path")]
76    pub(crate) path: String,
77
78    #[serde(rename = "hostPath", skip_serializing_if = "Option::is_none")]
79    pub(crate) host_path: Option<String>,
80
81    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
82    pub(crate) r#type: Option<String>,
83
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub major: Option<i64>,
86
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub minor: Option<i64>,
89
90    #[serde(rename = "fileMode", skip_serializing_if = "Option::is_none")]
91    pub file_mode: Option<mode_t>,
92
93    #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")]
94    pub permissions: Option<String>,
95
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub uid: Option<u32>,
98
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub gid: Option<u32>,
101}
102
103// Mount represents a mount that needs to be added to the OCI spec.
104#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
105pub struct Mount {
106    #[serde(rename = "hostPath")]
107    pub(crate) host_path: String,
108
109    #[serde(rename = "containerPath")]
110    pub(crate) container_path: String,
111
112    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
113    pub(crate) r#type: Option<String>,
114
115    #[serde(default, skip_serializing_if = "Option::is_none")]
116    pub(crate) options: Option<Vec<String>>,
117}
118
119// Hook represents a hook that needs to be added to the OCI spec.
120#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
121pub struct Hook {
122    #[serde(rename = "hookName")]
123    pub(crate) hook_name: String,
124
125    #[serde(rename = "path")]
126    pub(crate) path: String,
127
128    #[serde(default, skip_serializing_if = "Option::is_none")]
129    pub(crate) args: Option<Vec<String>>,
130
131    #[serde(default, skip_serializing_if = "Option::is_none")]
132    pub(crate) env: Option<Vec<String>>,
133
134    #[serde(rename = "timeout", skip_serializing_if = "Option::is_none")]
135    pub(crate) timeout: Option<i64>,
136}
137
138// IntelRdt describes the Linux IntelRdt parameters to set in the OCI spec.
139#[derive(Clone, Debug, Default, Eq, PartialEq, Hash, Deserialize, Serialize)]
140pub struct IntelRdt {
141    #[serde(rename = "closID", skip_serializing_if = "Option::is_none")]
142    pub(crate) clos_id: Option<String>,
143
144    #[serde(rename = "l3CacheSchema", skip_serializing_if = "Option::is_none")]
145    pub(crate) l3_cache_schema: Option<String>,
146
147    #[serde(rename = "memBwSchema", skip_serializing_if = "Option::is_none")]
148    pub(crate) mem_bw_schema: Option<String>,
149
150    #[serde(default, rename = "enableCMT")]
151    pub(crate) enable_cmt: bool,
152
153    #[serde(default, rename = "enableMBM")]
154    pub(crate) enable_mbm: bool,
155}