@@ -4,7 +4,9 @@ use std::{fs, io};
44use anyhow:: Result ;
55use libcgroups:: common:: { CgroupManager , ControllerOpt } ;
66use libcgroups:: { self } ;
7- use libcontainer:: oci_spec:: runtime:: { LinuxPidsBuilder , LinuxResources , LinuxResourcesBuilder } ;
7+ use libcontainer:: oci_spec:: runtime:: {
8+ LinuxMemory , LinuxMemoryBuilder , LinuxPidsBuilder , LinuxResources , LinuxResourcesBuilder ,
9+ } ;
810use liboci_cli:: Update ;
911
1012use 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