use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[macro_use]
extern crate derive_builder;
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Spec {
#[serde(rename = "ociVersion")]
version: String,
#[serde(skip_serializing_if = "Option::is_none")]
process: Option<Process>,
#[serde(skip_serializing_if = "Option::is_none")]
root: Option<Root>,
#[serde(skip_serializing_if = "Option::is_none")]
hostname: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
mounts: Vec<Mount>,
#[serde(skip_serializing_if = "Option::is_none")]
hooks: Option<Hooks>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
annotations: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
linux: Option<Linux>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Process {
#[serde(skip_serializing_if = "Option::is_none")]
terminal: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "consoleSize")]
console_size: Option<ConsoleSizeBox>,
user: User,
#[serde(skip_serializing_if = "Vec::is_empty")]
args: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
env: Vec<String>,
cwd: String,
#[serde(skip_serializing_if = "Option::is_none")]
capabilities: Option<LinuxCapabilities>,
#[serde(skip_serializing_if = "Vec::is_empty")]
rlimits: Vec<POSIXRlimit>,
#[serde(skip_serializing_if = "Option::is_none", rename = "noNewPrivileges")]
no_new_privileges: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "apparmorProfile")]
app_armor_profile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "oomScoreAdj")]
oom_score_adj: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none", rename = "selinuxLabel")]
selinux_label: Option<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxCapabilities {
#[serde(skip_serializing_if = "Vec::is_empty")]
bounding: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
effective: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
inheritable: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
permitted: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
ambient: Vec<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct ConsoleSizeBox {
height: u32,
width: u32,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct User {
uid: u32,
gid: u32,
#[serde(skip_serializing_if = "Option::is_none")]
umask: Option<u32>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "additionalGids")]
additional_gids: Vec<u32>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Root {
path: String,
#[serde(skip_serializing_if = "Option::is_none")]
readonly: Option<bool>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Mount {
destination: String,
#[serde(skip_serializing_if = "Option::is_none", rename = "type")]
mount_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
source: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
options: Vec<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Hook {
path: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
args: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
env: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
timeout: Option<i32>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Hooks {
#[serde(skip_serializing_if = "Vec::is_empty")]
prestart: Vec<Hook>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "createRuntime")]
create_runtime: Vec<Hook>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "createContainer")]
create_container: Vec<Hook>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "startContainer")]
start_container: Vec<Hook>,
#[serde(skip_serializing_if = "Vec::is_empty")]
poststart: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
poststop: Vec<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct Linux {
#[serde(skip_serializing_if = "Vec::is_empty", rename = "uidMappings")]
uid_mappings: Vec<LinuxIDMapping>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "gidMappings")]
gid_mappings: Vec<LinuxIDMapping>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
sysctl: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
resources: Option<LinuxResources>,
#[serde(skip_serializing_if = "Option::is_none", rename = "cgroupsPath")]
cgroups_path: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
namespaces: Vec<LinuxNamespace>,
#[serde(skip_serializing_if = "Vec::is_empty")]
devices: Vec<LinuxDevice>,
#[serde(skip_serializing_if = "Option::is_none")]
seccomp: Option<LinuxSeccomp>,
#[serde(skip_serializing_if = "Option::is_none", rename = "rootfsPropagation")]
rootfs_propagation: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "maskedPaths")]
masked_paths: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "readonlyPaths")]
readonly_paths: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "mountLabel")]
mount_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "intelRdt")]
intel_rdt: Option<LinuxIntelRdt>,
#[serde(skip_serializing_if = "Option::is_none")]
personality: Option<LinuxPersonality>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxNamespace {
#[serde(rename = "type")]
namespace_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
path: Option<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxIDMapping {
#[serde(rename = "containerID")]
container_id: u32,
#[serde(rename = "hostID")]
host_id: u32,
size: u32,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct POSIXRlimit {
#[serde(rename = "type")]
rlimit_type: String,
hard: u64,
soft: u64,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxHugepageLimit {
#[serde(rename = "pageSize")]
page_size: String,
limit: u64,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxInterfacePriority {
name: String,
priority: u32,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxWeightDevice {
major: i64,
minor: i64,
#[serde(skip_serializing_if = "Option::is_none")]
weight: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none", rename = "leafWeight")]
leaf_weight: Option<u16>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxThrottleDevice {
major: i64,
minor: i64,
rate: u64,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxBlockIO {
#[serde(skip_serializing_if = "Option::is_none")]
weight: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none", rename = "leafWeight")]
leaf_weight: Option<u16>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "weightDevice")]
weight_device: Vec<LinuxWeightDevice>,
#[serde(
skip_serializing_if = "Vec::is_empty",
rename = "throttleReadBpsDevice"
)]
throttle_read_bps_device: Vec<LinuxThrottleDevice>,
#[serde(
skip_serializing_if = "Vec::is_empty",
rename = "throttleWriteBpsDevice"
)]
throttle_write_bps_device: Vec<LinuxThrottleDevice>,
#[serde(
skip_serializing_if = "Vec::is_empty",
rename = "throttleReadIOPSDevice"
)]
throttle_read_iops_device: Vec<LinuxThrottleDevice>,
#[serde(
skip_serializing_if = "Vec::is_empty",
rename = "throttleWriteIOPSDevice"
)]
throttle_write_iops_device: Vec<LinuxThrottleDevice>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxMemory {
#[serde(skip_serializing_if = "Option::is_none")]
limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
reservation: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
swap: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
kernel: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none", rename = "kernelTCP")]
kernel_tcp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
swappiness: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none", rename = "disableOOMKiller")]
disable_oom_killer: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "useHierarchy")]
use_hierarchy: Option<bool>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxCPU {
#[serde(skip_serializing_if = "Option::is_none")]
shares: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
quota: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
period: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none", rename = "realtimeRuntime")]
realtime_runtime: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none", rename = "realtimePeriod")]
realtime_period: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
cpus: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
mems: Option<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxPids {
limit: i64,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxNetwork {
#[serde(skip_serializing_if = "Option::is_none", rename = "classID")]
class_id: Option<u32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
priorities: Vec<LinuxInterfacePriority>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxRdma {
#[serde(skip_serializing_if = "Option::is_none", rename = "hcaHandles")]
hca_handles: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none", rename = "hcaObjects")]
hca_objects: Option<u32>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxResources {
#[serde(skip_serializing_if = "Vec::is_empty")]
devices: Vec<LinuxDeviceCgroup>,
#[serde(skip_serializing_if = "Option::is_none")]
memory: Option<LinuxMemory>,
#[serde(skip_serializing_if = "Option::is_none")]
cpu: Option<LinuxCPU>,
#[serde(skip_serializing_if = "Option::is_none")]
pids: Option<LinuxPids>,
#[serde(skip_serializing_if = "Option::is_none", rename = "blockIO")]
block_io: Option<LinuxBlockIO>,
#[serde(skip_serializing_if = "Vec::is_empty", rename = "hugepageLimits")]
hugepage_limits: Vec<LinuxHugepageLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
network: Option<LinuxNetwork>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
rdma: HashMap<String, LinuxRdma>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxDevice {
path: String,
#[serde(rename = "type")]
device_type: String,
major: i64,
minor: i64,
#[serde(skip_serializing_if = "Option::is_none", rename = "fileMode")]
file_mode: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
uid: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
gid: Option<u32>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxDeviceCgroup {
allow: bool,
#[serde(skip_serializing_if = "Option::is_none", rename = "type")]
device_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
major: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
minor: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
access: Option<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxPersonality {
domain: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
flags: Vec<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxSeccomp {
#[serde(rename = "defaultAction")]
default_action: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
architectures: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
flags: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
syscalls: Vec<LinuxSyscall>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxSeccompArg {
index: u64,
value: u64,
#[serde(skip_serializing_if = "Option::is_none", rename = "valueTwo")]
value_two: Option<u64>,
op: String,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxSyscall {
names: Vec<String>,
action: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
args: Vec<String>,
}
#[derive(Default, Clone, Builder, Debug, Serialize, Deserialize)]
#[builder(default, setter(into))]
pub struct LinuxIntelRdt {
#[serde(skip_serializing_if = "Option::is_none", rename = "closID")]
clos_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "l3CacheSchema")]
l3_cache_schema: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "memBwSchema")]
mem_bw_schema: Option<String>,
}