1use serde::{Deserialize, Serialize};
19use std::collections::HashMap;
20
21#[macro_use]
22extern crate derive_builder;
23
24#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
26#[builder(default, setter(into))]
27pub struct Spec {
28 #[serde(rename = "ociVersion")]
30 version: String,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 process: Option<Process>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 root: Option<Root>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 hostname: Option<String>,
40 #[serde(skip_serializing_if = "Vec::is_empty")]
42 mounts: Vec<Mount>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 hooks: Option<Hooks>,
46 #[serde(skip_serializing_if = "HashMap::is_empty")]
48 annotations: HashMap<String, String>,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 linux: Option<Linux>,
52}
53
54#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
56#[builder(default, setter(into))]
57pub struct Process {
58 #[serde(skip_serializing_if = "Option::is_none")]
60 terminal: Option<bool>,
61 #[serde(skip_serializing_if = "Option::is_none", rename = "consoleSize")]
63 console_size: Option<ConsoleSizeBox>,
64 user: User,
66 #[serde(skip_serializing_if = "Vec::is_empty")]
68 args: Vec<String>,
69 #[serde(skip_serializing_if = "Vec::is_empty")]
71 env: Vec<String>,
72 cwd: String,
75 #[serde(skip_serializing_if = "Option::is_none")]
77 capabilities: Option<LinuxCapabilities>,
78 #[serde(skip_serializing_if = "Vec::is_empty")]
80 rlimits: Vec<POSIXRlimit>,
81 #[serde(skip_serializing_if = "Option::is_none", rename = "noNewPrivileges")]
83 no_new_privileges: Option<bool>,
84 #[serde(skip_serializing_if = "Option::is_none", rename = "apparmorProfile")]
86 app_armor_profile: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none", rename = "oomScoreAdj")]
89 oom_score_adj: Option<i32>,
90 #[serde(skip_serializing_if = "Option::is_none", rename = "selinuxLabel")]
92 selinux_label: Option<String>,
93}
94
95#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
98#[builder(default, setter(into))]
99pub struct LinuxCapabilities {
100 #[serde(skip_serializing_if = "Vec::is_empty")]
102 bounding: Vec<String>,
103 #[serde(skip_serializing_if = "Vec::is_empty")]
105 effective: Vec<String>,
106 #[serde(skip_serializing_if = "Vec::is_empty")]
108 inheritable: Vec<String>,
109 #[serde(skip_serializing_if = "Vec::is_empty")]
111 permitted: Vec<String>,
112 #[serde(skip_serializing_if = "Vec::is_empty")]
114 ambient: Vec<String>,
115}
116
117#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
119#[builder(default, setter(into))]
120pub struct ConsoleSizeBox {
121 height: u32,
123 width: u32,
125}
126
127#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
129#[builder(default, setter(into))]
130pub struct User {
131 uid: u32,
133 gid: u32,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 umask: Option<u32>,
138 #[serde(skip_serializing_if = "Vec::is_empty", rename = "additionalGids")]
140 additional_gids: Vec<u32>,
141}
142
143#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
145#[builder(default, setter(into))]
146pub struct Root {
147 path: String,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 readonly: Option<bool>,
152}
153
154#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
156#[builder(default, setter(into))]
157pub struct Mount {
158 destination: String,
160 #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
162 mount_type: Option<String>,
163 #[serde(skip_serializing_if = "Option::is_none")]
165 source: Option<String>,
166 #[serde(skip_serializing_if = "Vec::is_empty")]
168 options: Vec<String>,
169}
170
171#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
173#[builder(default, setter(into))]
174pub struct Hook {
175 path: String,
176 #[serde(skip_serializing_if = "Vec::is_empty")]
177 args: Vec<String>,
178 #[serde(skip_serializing_if = "Vec::is_empty")]
179 env: Vec<String>,
180 #[serde(skip_serializing_if = "Option::is_none")]
181 timeout: Option<i32>,
182}
183
184#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
187#[builder(default, setter(into))]
188pub struct Hooks {
189 #[serde(skip_serializing_if = "Vec::is_empty")]
192 prestart: Vec<Hook>,
193 #[serde(skip_serializing_if = "Vec::is_empty", rename = "createRuntime")]
196 create_runtime: Vec<Hook>,
197 #[serde(skip_serializing_if = "Vec::is_empty", rename = "createContainer")]
200 create_container: Vec<Hook>,
201 #[serde(skip_serializing_if = "Vec::is_empty", rename = "startContainer")]
204 start_container: Vec<Hook>,
205 #[serde(skip_serializing_if = "Vec::is_empty")]
208 poststart: Vec<String>,
209 #[serde(skip_serializing_if = "Vec::is_empty")]
212 poststop: Vec<String>,
213}
214
215#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
217#[builder(default, setter(into))]
218pub struct Linux {
219 #[serde(skip_serializing_if = "Vec::is_empty", rename = "uidMappings")]
221 uid_mappings: Vec<LinuxIDMapping>,
222 #[serde(skip_serializing_if = "Vec::is_empty", rename = "gidMappings")]
224 gid_mappings: Vec<LinuxIDMapping>,
225 #[serde(skip_serializing_if = "HashMap::is_empty")]
227 sysctl: HashMap<String, String>,
228 #[serde(skip_serializing_if = "Option::is_none")]
231 resources: Option<LinuxResources>,
232 #[serde(skip_serializing_if = "Option::is_none", rename = "cgroupsPath")]
236 cgroups_path: Option<String>,
237 #[serde(skip_serializing_if = "Vec::is_empty")]
239 namespaces: Vec<LinuxNamespace>,
240 #[serde(skip_serializing_if = "Vec::is_empty")]
242 devices: Vec<LinuxDevice>,
243 #[serde(skip_serializing_if = "Option::is_none")]
245 seccomp: Option<LinuxSeccomp>,
246 #[serde(skip_serializing_if = "Option::is_none", rename = "rootfsPropagation")]
248 rootfs_propagation: Option<String>,
249 #[serde(skip_serializing_if = "Vec::is_empty", rename = "maskedPaths")]
251 masked_paths: Vec<String>,
252 #[serde(skip_serializing_if = "Vec::is_empty", rename = "readonlyPaths")]
254 readonly_paths: Vec<String>,
255 #[serde(skip_serializing_if = "Option::is_none", rename = "mountLabel")]
257 mount_label: Option<String>,
258 #[serde(skip_serializing_if = "Option::is_none", rename = "intelRdt")]
261 intel_rdt: Option<LinuxIntelRdt>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 personality: Option<LinuxPersonality>,
265}
266
267#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
269#[builder(default, setter(into))]
270pub struct LinuxNamespace {
271 #[serde(rename = "type")]
273 namespace_type: String,
274 #[serde(skip_serializing_if = "Option::is_none")]
277 path: Option<String>,
278}
279
280#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
282#[builder(default, setter(into))]
283pub struct LinuxIDMapping {
284 #[serde(rename = "containerID")]
286 container_id: u32,
287 #[serde(rename = "hostID")]
289 host_id: u32,
290 size: u32,
292}
293
294#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
296#[builder(default, setter(into))]
297pub struct POSIXRlimit {
298 #[serde(rename = "type")]
300 rlimit_type: String,
301 hard: u64,
303 soft: u64,
305}
306
307#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
309#[builder(default, setter(into))]
310pub struct LinuxHugepageLimit {
311 #[serde(rename = "pageSize")]
314 page_size: String,
315 limit: u64,
317}
318
319#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
321#[builder(default, setter(into))]
322pub struct LinuxInterfacePriority {
323 name: String,
325 priority: u32,
327}
328
329#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
331#[builder(default, setter(into))]
332pub struct LinuxWeightDevice {
333 major: i64,
335 minor: i64,
337 #[serde(skip_serializing_if = "Option::is_none")]
339 weight: Option<u16>,
340 #[serde(skip_serializing_if = "Option::is_none", rename = "leafWeight")]
342 leaf_weight: Option<u16>,
343}
344
345#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
347#[builder(default, setter(into))]
348pub struct LinuxThrottleDevice {
349 major: i64,
351 minor: i64,
353 rate: u64,
355}
356
357#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
359#[builder(default, setter(into))]
360pub struct LinuxBlockIO {
361 #[serde(skip_serializing_if = "Option::is_none")]
363 weight: Option<u16>,
364 #[serde(skip_serializing_if = "Option::is_none", rename = "leafWeight")]
366 leaf_weight: Option<u16>,
367 #[serde(skip_serializing_if = "Vec::is_empty", rename = "weightDevice")]
369 weight_device: Vec<LinuxWeightDevice>,
370 #[serde(
372 skip_serializing_if = "Vec::is_empty",
373 rename = "throttleReadBpsDevice"
374 )]
375 throttle_read_bps_device: Vec<LinuxThrottleDevice>,
376 #[serde(
378 skip_serializing_if = "Vec::is_empty",
379 rename = "throttleWriteBpsDevice"
380 )]
381 throttle_write_bps_device: Vec<LinuxThrottleDevice>,
382 #[serde(
384 skip_serializing_if = "Vec::is_empty",
385 rename = "throttleReadIOPSDevice"
386 )]
387 throttle_read_iops_device: Vec<LinuxThrottleDevice>,
388 #[serde(
390 skip_serializing_if = "Vec::is_empty",
391 rename = "throttleWriteIOPSDevice"
392 )]
393 throttle_write_iops_device: Vec<LinuxThrottleDevice>,
394}
395
396#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
398#[builder(default, setter(into))]
399pub struct LinuxMemory {
400 #[serde(skip_serializing_if = "Option::is_none")]
402 limit: Option<i64>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 reservation: Option<i64>,
406 #[serde(skip_serializing_if = "Option::is_none")]
408 swap: Option<i64>,
409 #[serde(skip_serializing_if = "Option::is_none")]
411 kernel: Option<i64>,
412 #[serde(skip_serializing_if = "Option::is_none", rename = "kernelTCP")]
414 kernel_tcp: Option<i64>,
415 #[serde(skip_serializing_if = "Option::is_none")]
417 swappiness: Option<i64>,
418 #[serde(skip_serializing_if = "Option::is_none", rename = "disableOOMKiller")]
420 disable_oom_killer: Option<bool>,
421 #[serde(skip_serializing_if = "Option::is_none", rename = "useHierarchy")]
423 use_hierarchy: Option<bool>,
424}
425
426#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
428#[builder(default, setter(into))]
429pub struct LinuxCPU {
430 #[serde(skip_serializing_if = "Option::is_none")]
432 shares: Option<u64>,
433 #[serde(skip_serializing_if = "Option::is_none")]
435 quota: Option<i64>,
436 #[serde(skip_serializing_if = "Option::is_none")]
438 period: Option<u64>,
439 #[serde(skip_serializing_if = "Option::is_none", rename = "realtimeRuntime")]
441 realtime_runtime: Option<i64>,
442 #[serde(skip_serializing_if = "Option::is_none", rename = "realtimePeriod")]
444 realtime_period: Option<u64>,
445 #[serde(skip_serializing_if = "Option::is_none")]
447 cpus: Option<String>,
448 #[serde(skip_serializing_if = "Option::is_none")]
450 mems: Option<String>,
451}
452
453#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
455#[builder(default, setter(into))]
456pub struct LinuxPids {
457 limit: i64,
459}
460
461#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
463#[builder(default, setter(into))]
464pub struct LinuxNetwork {
465 #[serde(skip_serializing_if = "Option::is_none", rename = "classID")]
467 class_id: Option<u32>,
468 #[serde(skip_serializing_if = "Vec::is_empty")]
470 priorities: Vec<LinuxInterfacePriority>,
471}
472
473#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
475#[builder(default, setter(into))]
476pub struct LinuxRdma {
477 #[serde(skip_serializing_if = "Option::is_none", rename = "hcaHandles")]
479 hca_handles: Option<u32>,
480 #[serde(skip_serializing_if = "Option::is_none", rename = "hcaObjects")]
482 hca_objects: Option<u32>,
483}
484
485#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
487#[builder(default, setter(into))]
488pub struct LinuxResources {
489 #[serde(skip_serializing_if = "Vec::is_empty")]
491 devices: Vec<LinuxDeviceCgroup>,
492 #[serde(skip_serializing_if = "Option::is_none")]
494 memory: Option<LinuxMemory>,
495 #[serde(skip_serializing_if = "Option::is_none")]
497 cpu: Option<LinuxCPU>,
498 #[serde(skip_serializing_if = "Option::is_none")]
500 pids: Option<LinuxPids>,
501 #[serde(skip_serializing_if = "Option::is_none", rename = "blockIO")]
503 block_io: Option<LinuxBlockIO>,
504 #[serde(skip_serializing_if = "Vec::is_empty", rename = "hugepageLimits")]
506 hugepage_limits: Vec<LinuxHugepageLimit>,
507 #[serde(skip_serializing_if = "Option::is_none")]
509 network: Option<LinuxNetwork>,
510 #[serde(skip_serializing_if = "HashMap::is_empty")]
514 rdma: HashMap<String, LinuxRdma>,
515}
516
517#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
519#[builder(default, setter(into))]
520pub struct LinuxDevice {
521 path: String,
523 #[serde(rename = "type")]
525 device_type: String,
526 major: i64,
528 minor: i64,
530 #[serde(skip_serializing_if = "Option::is_none", rename = "fileMode")]
532 file_mode: Option<u32>,
533 #[serde(skip_serializing_if = "Option::is_none")]
535 uid: Option<u32>,
536 #[serde(skip_serializing_if = "Option::is_none")]
538 gid: Option<u32>,
539}
540
541#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
543#[builder(default, setter(into))]
544pub struct LinuxDeviceCgroup {
545 allow: bool,
547 #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
549 device_type: Option<String>,
550 #[serde(skip_serializing_if = "Option::is_none")]
552 major: Option<i64>,
553 #[serde(skip_serializing_if = "Option::is_none")]
555 minor: Option<i64>,
556 #[serde(skip_serializing_if = "Option::is_none")]
558 access: Option<String>,
559}
560
561#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
563#[builder(default, setter(into))]
564pub struct LinuxPersonality {
565 domain: String,
567 #[serde(skip_serializing_if = "Vec::is_empty")]
569 flags: Vec<String>,
570}
571
572#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
574#[builder(default, setter(into))]
575pub struct LinuxSeccomp {
576 #[serde(rename = "defaultAction")]
577 default_action: String,
578 #[serde(skip_serializing_if = "Vec::is_empty")]
579 architectures: Vec<String>,
580 #[serde(skip_serializing_if = "Vec::is_empty")]
581 flags: Vec<String>,
582 #[serde(skip_serializing_if = "Vec::is_empty")]
583 syscalls: Vec<LinuxSyscall>,
584}
585
586#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
588#[builder(default, setter(into))]
589pub struct LinuxSeccompArg {
590 index: u64,
591 value: u64,
592 #[serde(skip_serializing_if = "Option::is_none", rename = "valueTwo")]
593 value_two: Option<u64>,
594 op: String,
595}
596
597#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
599#[builder(default, setter(into))]
600pub struct LinuxSyscall {
601 names: Vec<String>,
602 action: String,
603 #[serde(skip_serializing_if = "Vec::is_empty")]
604 args: Vec<String>,
605}
606
607#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
610#[builder(default, setter(into))]
611pub struct LinuxIntelRdt {
612 #[serde(skip_serializing_if = "Option::is_none", rename = "closID")]
614 clos_id: Option<String>,
615 #[serde(skip_serializing_if = "Option::is_none", rename = "l3CacheSchema")]
618 l3_cache_schema: Option<String>,
619 #[serde(skip_serializing_if = "Option::is_none", rename = "memBwSchema")]
624 mem_bw_schema: Option<String>,
625}