Skip to content

Commit c4e39e4

Browse files
committed
refactor: extract memory resource construction
Signed-off-by: bharqav <bhargavpodapati28@gmail.com>
1 parent 0d21c18 commit c4e39e4

2 files changed

Lines changed: 111 additions & 6 deletions

File tree

crates/liboci-cli/src/update.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ pub struct Update {
4343
pub cpuset_mems: Option<String>,
4444

4545
/// Set memory limit to num bytes.
46-
#[arg(long)]
47-
pub memory: Option<u64>,
46+
#[arg(long, allow_hyphen_values = true)]
47+
pub memory: Option<i64>,
4848

4949
/// Set memory reservation (or soft limit) to num bytes.
50-
#[arg(long)]
51-
pub memory_reservation: Option<u64>,
50+
#[arg(long, allow_hyphen_values = true)]
51+
pub memory_reservation: Option<i64>,
5252

5353
/// Set total memory + swap usage to num bytes. Use -1 to unset the limit (i.e. use unlimited swap).
54-
#[arg(long)]
54+
#[arg(long, allow_hyphen_values = true)]
5555
pub memory_swap: Option<i64>,
5656

5757
/// Set the maximum number of processes allowed in the container

crates/youki/src/commands/update.rs

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use std::{fs, io};
44
use anyhow::Result;
55
use libcgroups::common::{CgroupManager, ControllerOpt};
66
use libcgroups::{self};
7-
use libcontainer::oci_spec::runtime::{LinuxPidsBuilder, LinuxResources, LinuxResourcesBuilder};
7+
use libcontainer::oci_spec::runtime::{
8+
LinuxMemory, LinuxMemoryBuilder, LinuxPidsBuilder, LinuxResources, LinuxResourcesBuilder,
9+
};
810
use liboci_cli::Update;
911

1012
use crate::commands::create_cgroup_manager;
@@ -26,6 +28,11 @@ pub fn update(args: Update, root_path: PathBuf) -> Result<()> {
2628
if let Some(new_pids_limit) = args.pids_limit {
2729
builder = builder.pids(LinuxPidsBuilder::default().limit(new_pids_limit).build()?);
2830
}
31+
32+
if let Some(memory) = build_memory(&args)? {
33+
builder = builder.memory(memory);
34+
}
35+
2936
linux_res = builder.build()?;
3037
}
3138

@@ -37,3 +44,101 @@ pub fn update(args: Update, root_path: PathBuf) -> Result<()> {
3744
})?;
3845
Ok(())
3946
}
47+
48+
fn build_memory(args: &Update) -> Result<Option<LinuxMemory>> {
49+
let mut mem_builder = LinuxMemoryBuilder::default();
50+
let mut has_memory = false;
51+
if let Some(memory) = args.memory {
52+
mem_builder = mem_builder.limit(memory);
53+
has_memory = true;
54+
}
55+
if let Some(reservation) = args.memory_reservation {
56+
mem_builder = mem_builder.reservation(reservation);
57+
has_memory = true;
58+
}
59+
if let Some(swap) = args.memory_swap {
60+
mem_builder = mem_builder.swap(swap);
61+
has_memory = true;
62+
}
63+
64+
if has_memory {
65+
Ok(Some(mem_builder.build()?))
66+
} else {
67+
Ok(None)
68+
}
69+
}
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
75+
fn default_update() -> Update {
76+
Update {
77+
resources: None,
78+
blkio_weight: None,
79+
cpu_period: None,
80+
cpu_quota: None,
81+
cpu_rt_period: None,
82+
cpu_rt_runtime: None,
83+
cpu_share: None,
84+
cpuset_cpus: None,
85+
cpuset_mems: None,
86+
memory: None,
87+
memory_reservation: None,
88+
memory_swap: None,
89+
pids_limit: None,
90+
l3_cache_schema: None,
91+
mem_bw_schema: None,
92+
container_id: "test".to_string(),
93+
}
94+
}
95+
96+
#[test]
97+
fn test_build_memory_none() {
98+
let args = default_update();
99+
let mem = build_memory(&args).unwrap();
100+
assert!(mem.is_none());
101+
}
102+
103+
#[test]
104+
fn test_build_memory_limit() {
105+
let mut args = default_update();
106+
args.memory = Some(1024);
107+
let mem = build_memory(&args).unwrap().unwrap();
108+
assert_eq!(mem.limit(), Some(1024));
109+
assert_eq!(mem.reservation(), None);
110+
assert_eq!(mem.swap(), None);
111+
}
112+
113+
#[test]
114+
fn test_build_memory_reservation() {
115+
let mut args = default_update();
116+
args.memory_reservation = Some(512);
117+
let mem = build_memory(&args).unwrap().unwrap();
118+
assert_eq!(mem.limit(), None);
119+
assert_eq!(mem.reservation(), Some(512));
120+
assert_eq!(mem.swap(), None);
121+
}
122+
123+
#[test]
124+
fn test_build_memory_swap() {
125+
let mut args = default_update();
126+
args.memory_swap = Some(2048);
127+
let mem = build_memory(&args).unwrap().unwrap();
128+
assert_eq!(mem.limit(), None);
129+
assert_eq!(mem.reservation(), None);
130+
assert_eq!(mem.swap(), Some(2048));
131+
}
132+
133+
#[test]
134+
fn test_build_memory_all() {
135+
let mut args = default_update();
136+
args.memory = Some(1024);
137+
args.memory_reservation = Some(512);
138+
args.memory_swap = Some(2048);
139+
let mem = build_memory(&args).unwrap().unwrap();
140+
assert_eq!(mem.limit(), Some(1024));
141+
assert_eq!(mem.reservation(), Some(512));
142+
assert_eq!(mem.swap(), Some(2048));
143+
}
144+
}

0 commit comments

Comments
 (0)