Skip to content

Commit c7a10ac

Browse files
musaprgDarrellTang
andauthored
Support feature subcommand (#2837)
* try to create new struct for hardcoding Signed-off-by: Darrell Tang <darrelltang@gmail.com> change struct name to resolve conflict Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix annotation references Signed-off-by: Darrell Tang <darrelltang@gmail.com> set as Strings Signed-off-by: Darrell Tang <darrelltang@gmail.com> use serde Signed-off-by: Darrell Tang <darrelltang@gmail.com> pretty print Signed-off-by: Darrell Tang <darrelltang@gmail.com> clean up names to match runc features output Signed-off-by: Darrell Tang <darrelltang@gmail.com> rearrange structs and constants Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix lint issues Signed-off-by: Darrell Tang <darrelltang@gmail.com> try to source caps dynamically Signed-off-by: Darrell Tang <darrelltang@gmail.com> try to source namespaces dynamically Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix query_caps Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix match statements Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix linting issues Signed-off-by: Darrell Tang <darrelltang@gmail.com> fix extra line for linting Signed-off-by: Darrell Tang <darrelltang@gmail.com> Fix format Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * fixup! Support feature subcommand Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> * Use MountOption::known_options Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> --------- Signed-off-by: Kotaro Inoue <k.musaino@gmail.com> Co-authored-by: Darrell Tang <darrelltang@gmail.com>
1 parent 6b88a69 commit c7a10ac

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

crates/youki/src/commands/features.rs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,118 @@
11
//! Contains Functionality of `features` container command
22
use anyhow::Result;
3+
use libcontainer::oci_spec::runtime::{
4+
version, ApparmorBuilder, CgroupBuilder, FeaturesBuilder, IDMapBuilder, IntelRdtBuilder,
5+
LinuxFeatureBuilder, LinuxNamespaceType, MountExtensionsBuilder, SelinuxBuilder,
6+
};
7+
use libcontainer::syscall::linux::MountOption;
38
use liboci_cli::Features;
49

10+
// Function to query and return capabilities
11+
fn query_caps() -> Result<Vec<String>> {
12+
Ok(caps::all().iter().map(|cap| format!("{:?}", cap)).collect())
13+
}
14+
15+
// Function to query and return namespaces
16+
fn query_supported_namespaces() -> Result<Vec<LinuxNamespaceType>> {
17+
Ok(vec![
18+
LinuxNamespaceType::Pid,
19+
LinuxNamespaceType::Network,
20+
LinuxNamespaceType::Uts,
21+
LinuxNamespaceType::Ipc,
22+
LinuxNamespaceType::Mount,
23+
LinuxNamespaceType::User,
24+
LinuxNamespaceType::Cgroup,
25+
LinuxNamespaceType::Time,
26+
])
27+
}
28+
29+
// Return a list of known hooks supported by youki
30+
fn known_hooks() -> Vec<String> {
31+
[
32+
"prestart",
33+
"createRuntime",
34+
"createContainer",
35+
"startContainer",
36+
"poststart",
37+
"poststop",
38+
]
39+
.iter()
40+
.map(|s| s.to_string())
41+
.collect()
42+
}
43+
544
/// lists all existing containers
645
pub fn features(_: Features) -> Result<()> {
46+
// Query supported namespaces
47+
let namespaces = match query_supported_namespaces() {
48+
Ok(ns) => ns,
49+
Err(e) => {
50+
eprintln!("Error querying supported namespaces: {}", e);
51+
Vec::new()
52+
}
53+
};
54+
55+
// Query available capabilities
56+
let capabilities = match query_caps() {
57+
Ok(caps) => caps,
58+
Err(e) => {
59+
eprintln!("Error querying available capabilities: {}", e);
60+
Vec::new()
61+
}
62+
};
63+
64+
let linux = LinuxFeatureBuilder::default()
65+
.namespaces(namespaces)
66+
.capabilities(capabilities)
67+
.cgroup(
68+
CgroupBuilder::default()
69+
.v1(cfg!(feature = "v1"))
70+
.v2(cfg!(feature = "v2"))
71+
.systemd(cfg!(feature = "systemd"))
72+
.systemd_user(cfg!(feature = "systemd"))
73+
// cgroupv2 rdma controller is not implemented in youki.
74+
.rdma(false)
75+
.build()
76+
.unwrap(),
77+
)
78+
// TODO: Expose seccomp support information
79+
.apparmor(ApparmorBuilder::default().enabled(true).build().unwrap())
80+
.mount_extensions(
81+
MountExtensionsBuilder::default()
82+
// idmapped mounts is not supported in youki
83+
.idmap(IDMapBuilder::default().enabled(false).build().unwrap())
84+
.build()
85+
.unwrap(),
86+
)
87+
// SELinux is not supported in youki.
88+
.selinux(SelinuxBuilder::default().enabled(false).build().unwrap())
89+
.intel_rdt(IntelRdtBuilder::default().enabled(true).build().unwrap())
90+
.build()
91+
.unwrap();
92+
93+
let features = FeaturesBuilder::default()
94+
.oci_version_max(version())
95+
.oci_version_min(String::from("1.0.0"))
96+
.hooks(known_hooks())
97+
.mount_options(MountOption::known_options())
98+
.linux(linux)
99+
.build()
100+
.unwrap();
101+
102+
// Print out the created struct to verify
103+
let pretty_json_str = serde_json::to_string_pretty(&features)?;
104+
println!("{}", pretty_json_str);
105+
7106
Ok(())
8107
}
108+
109+
#[cfg(test)]
110+
mod tests {
111+
use super::*;
112+
113+
#[test]
114+
fn test_features() {
115+
let features = Features {};
116+
assert!(crate::commands::features::features(features).is_ok());
117+
}
118+
}

0 commit comments

Comments
 (0)