oci_spec/runtime/
zos.rs

1use crate::error::OciSpecError;
2use derive_builder::Builder;
3use getset::{CopyGetters, Getters, Setters};
4use serde::{Deserialize, Serialize};
5use std::path::PathBuf;
6use strum_macros::Display as StrumDisplay;
7
8#[derive(
9    Builder,
10    Clone,
11    Debug,
12    Default,
13    Deserialize,
14    CopyGetters,
15    Getters,
16    Setters,
17    Eq,
18    PartialEq,
19    Serialize,
20)]
21#[builder(
22    default,
23    pattern = "owned",
24    setter(into, strip_option),
25    build_fn(error = "OciSpecError")
26)]
27#[getset(get = "pub", set = "pub")]
28/// ZOS contains information for z/OS based containers.
29pub struct ZOS {
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    /// Namespaces contains the namespaces that are created and/or joined by the container
32    namespaces: Option<Vec<ZOSNamespace>>,
33}
34
35#[derive(
36    Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize, Hash, StrumDisplay,
37)]
38#[strum(serialize_all = "lowercase")]
39#[serde(rename_all = "lowercase")]
40/// Available z/OS namespace types.
41pub enum ZOSNamespaceType {
42    #[default]
43    /// PID Namespace for isolating process IDs
44    Pid,
45    /// Mount Namespace for isolating mount points
46    Mount,
47    /// IPC Namespace for isolating System V IPC, POSIX message queues
48    Ipc,
49    /// UTS Namespace for isolating hostname and NIS domain name
50    Uts,
51}
52
53impl TryFrom<&str> for ZOSNamespaceType {
54    type Error = OciSpecError;
55
56    fn try_from(namespace: &str) -> Result<Self, Self::Error> {
57        match namespace {
58            "pid" => Ok(ZOSNamespaceType::Pid),
59            "mount" => Ok(ZOSNamespaceType::Mount),
60            "ipc" => Ok(ZOSNamespaceType::Ipc),
61            "uts" => Ok(ZOSNamespaceType::Uts),
62            _ => Err(OciSpecError::Other(format!(
63                "unknown z/OS namespace {namespace}, could not convert"
64            ))),
65        }
66    }
67}
68
69#[derive(
70    Builder,
71    Clone,
72    CopyGetters,
73    Debug,
74    Default,
75    Deserialize,
76    Eq,
77    Getters,
78    Setters,
79    PartialEq,
80    Serialize,
81)]
82#[builder(
83    default,
84    pattern = "owned",
85    setter(into, strip_option),
86    build_fn(error = "OciSpecError")
87)]
88/// ZOSNamespace is the configuration for a z/OS namespace.
89pub struct ZOSNamespace {
90    #[serde(rename = "type")]
91    #[getset(get_copy = "pub", set = "pub")]
92    /// Type is the type of namespace.
93    typ: ZOSNamespaceType,
94
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    #[getset(get = "pub", set = "pub")]
97    /// Path is a path to an existing namespace persisted on disk that can
98    /// be joined and is of the same type
99    path: Option<PathBuf>,
100}