sal_virt/nerdctl/container_functions.rs
1// File: /root/code/git.threefold.info/herocode/sal/src/virt/nerdctl/container_functions.rs
2
3use crate::nerdctl::{execute_nerdctl_command, NerdctlError};
4use sal_process::CommandResult;
5
6/// Run a container from an image
7///
8/// # Arguments
9///
10/// * `image` - Image to run
11/// * `name` - Optional name for the container
12/// * `detach` - Whether to run in detached mode
13/// * `ports` - Optional port mappings
14/// * `snapshotter` - Optional snapshotter to use
15///
16/// # Returns
17///
18/// * `Result<CommandResult, NerdctlError>` - Command result or error
19pub fn run(
20 image: &str,
21 name: Option<&str>,
22 detach: bool,
23 ports: Option<&[&str]>,
24 snapshotter: Option<&str>,
25) -> Result<CommandResult, NerdctlError> {
26 let mut args = vec!["run"];
27
28 if detach {
29 args.push("-d");
30 }
31
32 if let Some(name_value) = name {
33 args.push("--name");
34 args.push(name_value);
35 }
36
37 if let Some(ports_value) = ports {
38 for port in ports_value {
39 args.push("-p");
40 args.push(port);
41 }
42 }
43
44 if let Some(snapshotter_value) = snapshotter {
45 args.push("--snapshotter");
46 args.push(snapshotter_value);
47 }
48
49 // Add flags to avoid BPF issues
50 args.push("--cgroup-manager=cgroupfs");
51
52 args.push(image);
53
54 execute_nerdctl_command(&args)
55}
56
57/// Execute a command in a container
58///
59/// # Arguments
60///
61/// * `container` - Container name or ID
62/// * `command` - Command to execute
63///
64/// # Returns
65///
66/// * `Result<CommandResult, NerdctlError>` - Command result or error
67pub fn exec(container: &str, command: &str) -> Result<CommandResult, NerdctlError> {
68 execute_nerdctl_command(&["exec", container, "sh", "-c", command])
69}
70
71/// Copy files between container and local filesystem
72///
73/// # Arguments
74///
75/// * `source` - Source path (can be container:path or local path)
76/// * `dest` - Destination path (can be container:path or local path)
77///
78/// # Returns
79///
80/// * `Result<CommandResult, NerdctlError>` - Command result or error
81pub fn copy(source: &str, dest: &str) -> Result<CommandResult, NerdctlError> {
82 execute_nerdctl_command(&["cp", source, dest])
83}
84
85/// Stop a container
86///
87/// # Arguments
88///
89/// * `container` - Container name or ID
90///
91/// # Returns
92///
93/// * `Result<CommandResult, NerdctlError>` - Command result or error
94pub fn stop(container: &str) -> Result<CommandResult, NerdctlError> {
95 execute_nerdctl_command(&["stop", container])
96}
97
98/// Remove a container
99///
100/// # Arguments
101///
102/// * `container` - Container name or ID
103///
104/// # Returns
105///
106/// * `Result<CommandResult, NerdctlError>` - Command result or error
107pub fn remove(container: &str) -> Result<CommandResult, NerdctlError> {
108 execute_nerdctl_command(&["rm", container])
109}
110
111/// List containers
112///
113/// # Arguments
114///
115/// * `all` - Whether to list all containers (including stopped ones)
116///
117/// # Returns
118///
119/// * `Result<CommandResult, NerdctlError>` - Command result or error
120pub fn list(all: bool) -> Result<CommandResult, NerdctlError> {
121 let mut args = vec!["ps"];
122
123 if all {
124 args.push("-a");
125 }
126
127 execute_nerdctl_command(&args)
128}
129
130/// Get container logs
131///
132/// # Arguments
133///
134/// * `container` - Container name or ID
135///
136/// # Returns
137///
138/// * `Result<CommandResult, NerdctlError>` - Command result or error
139pub fn logs(container: &str) -> Result<CommandResult, NerdctlError> {
140 execute_nerdctl_command(&["logs", container])
141}