microsandbox_cli/args/msbrun.rs
1use std::path::PathBuf;
2
3use chrono::{DateTime, Utc};
4use clap::{Parser, Subcommand};
5
6use crate::styles;
7
8//--------------------------------------------------------------------------------------------------
9// Types
10//--------------------------------------------------------------------------------------------------
11
12/// Arguments for the msbrun command
13#[derive(Debug, Parser)]
14#[command(name = "msbrun", author, styles=styles::styles())]
15pub struct McrunArgs {
16 /// The subcommand to run
17 #[command(subcommand)]
18 pub subcommand: McrunSubcommand,
19}
20
21/// Available subcommands for managing microvms
22#[derive(Subcommand, Debug)]
23pub enum McrunSubcommand {
24 /// Run as microvm
25 Microvm {
26 /// Log level
27 #[arg(long)]
28 log_level: Option<u8>,
29
30 /// Native root filesystem path
31 #[arg(long)]
32 native_rootfs: Option<PathBuf>,
33
34 /// Overlayfs root filesystem layers
35 #[arg(long)]
36 overlayfs_layer: Vec<PathBuf>,
37
38 /// Number of virtual CPUs
39 #[arg(long)]
40 num_vcpus: Option<u8>,
41
42 /// Memory size in MiB
43 #[arg(long)]
44 memory_mib: Option<u32>,
45
46 /// Working directory path
47 #[arg(long)]
48 workdir_path: Option<String>,
49
50 /// Executable path
51 #[arg(long, required = true)]
52 exec_path: String,
53
54 /// Environment variables (KEY=VALUE format)
55 #[arg(long)]
56 env: Vec<String>,
57
58 /// Directory mappings (host:guest format)
59 #[arg(long)]
60 mapped_dir: Vec<String>,
61
62 /// Port mappings (host:guest format)
63 #[arg(long)]
64 port_map: Vec<String>,
65
66 /// Network communication scope
67 #[arg(long)]
68 scope: Option<String>,
69
70 /// Assigned IP address
71 #[arg(long)]
72 ip: Option<String>,
73
74 /// Assigned subnet
75 #[arg(long)]
76 subnet: Option<String>,
77
78 /// Additional arguments after `--`
79 #[arg(last = true)]
80 args: Vec<String>,
81 },
82
83 /// Run as supervisor
84 Supervisor {
85 /// Directory for log files
86 #[arg(long)]
87 log_dir: PathBuf,
88
89 /// Path to the sandbox metrics and metadata database file
90 #[arg(long)]
91 sandbox_db_path: PathBuf,
92
93 /// Name of the child process
94 #[arg(long)]
95 sandbox_name: String,
96
97 /// Path to the sandbox config file
98 #[arg(long)]
99 config_file: String,
100
101 /// Last modified timestamp of the sandbox config file
102 #[arg(long)]
103 config_last_modified: DateTime<Utc>,
104
105 /// Log level
106 #[arg(long)]
107 log_level: Option<u8>,
108
109 /// Whether to forward output to stdout/stderr
110 #[arg(long, default_value = "true")]
111 forward_output: bool,
112
113 // Sandbox specific arguments
114 /// Native root filesystem path
115 #[arg(long)]
116 native_rootfs: Option<PathBuf>,
117
118 /// Overlayfs root filesystem layers
119 #[arg(long)]
120 overlayfs_layer: Vec<PathBuf>,
121
122 /// Number of virtual CPUs
123 #[arg(long)]
124 num_vcpus: Option<u8>,
125
126 /// Memory size in MiB
127 #[arg(long)]
128 memory_mib: Option<u32>,
129
130 /// Working directory path
131 #[arg(long)]
132 workdir_path: Option<String>,
133
134 /// Executable path
135 #[arg(long, required = true)]
136 exec_path: String,
137
138 /// Environment variables (KEY=VALUE format)
139 #[arg(long)]
140 env: Vec<String>,
141
142 /// Directory mappings (host:guest format)
143 #[arg(long)]
144 mapped_dir: Vec<String>,
145
146 /// Port mappings (host:guest format)
147 #[arg(long)]
148 port_map: Vec<String>,
149
150 /// Network communication scope
151 #[arg(long)]
152 scope: Option<String>,
153
154 /// Assigned IP address
155 #[arg(long)]
156 ip: Option<String>,
157
158 /// Assigned subnet
159 #[arg(long)]
160 subnet: Option<String>,
161
162 /// Additional arguments after `--`
163 #[arg(last = true)]
164 args: Vec<String>,
165 },
166}