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}